Hi, I have made a small patch has put in some basic framework for winedbg and wineserver for compiling on ARM (i think so). See WineHQ #285 (http://www.winehq.com/?issue=285#Cross-Compiling%20Wine). I donot have an ARM based machine and linux installed on it. And havent test it thorughly, I need someone to test this one. This patch may contain some bugs, use at your own risk.
Please send me your comments Thanks, VJ
--- programs/winedbg/Makefile.in_bkp 2006-07-28 03:05:14.000000000 +0530 +++ programs/winedbg/Makefile.in 2006-07-28 03:00:56.000000000 +0530 @@ -9,6 +9,7 @@ C_SRCS = \ be_alpha.c \ + be_arm.c \ be_i386.c \ be_ppc.c \ be_x86_64.c \ --- /dev/null 2006-05-02 17:48:25.285177368 +0530 +++ programs/winedbg/be_arm.c 2006-07-28 03:01:20.000000000 +0530 @@ -0,0 +1,154 @@ +/* + * Debugger ARM specific functions + * + * Copyright 2006 Vijay Kiran Kamuju + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "debugger.h" + +#if defined(__arm__) + +static unsigned be_arm_get_addr(HANDLE hThread, const CONTEXT* ctx, + enum be_cpu_addr bca, ADDRESS* addr) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static void be_arm_single_step(CONTEXT* ctx, unsigned enable) +{ + dbg_printf("not done\n"); +} + +static void be_arm_print_context(HANDLE hThread, const CONTEXT* ctx, int all_regs) +{ + dbg_printf("Context printing for ARM not done yet\n"); +} + +static void be_arm_print_segment_info(HANDLE hThread, const CONTEXT* ctx) +{ +} + +static struct dbg_internal_var be_arm_ctx[] = +{ + {0, NULL, 0, dbg_itype_none} +}; + +static const struct dbg_internal_var* be_arm_init_registers(CONTEXT* ctx) +{ + dbg_printf("not done\n"); + return be_arm_ctx; +} + +static unsigned be_arm_is_step_over_insn(void* insn) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_arm_is_function_return(void* insn) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_arm_is_break_insn(void* insn) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_arm_is_func_call(void* insn, void** insn_callee) +{ + return FALSE; +} + +static void be_arm_disasm_one_insn(ADDRESS* addr, int display) +{ + dbg_printf("Disasm NIY\n"); +} + +static unsigned be_arm_insert_Xpoint(HANDLE hProcess, const struct be_process_io* pio, + CONTEXT* ctx, enum be_xpoint_type type, + void* addr, unsigned long* val, unsigned size) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_arm_remove_Xpoint(HANDLE hProcess, const struct be_process_io* pio, + CONTEXT* ctx, enum be_xpoint_type type, + void* addr, unsigned long val, unsigned size) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_arm_is_watchpoint_set(const CONTEXT* ctx, unsigned idx) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static void be_arm_clear_watchpoint(CONTEXT* ctx, unsigned idx) +{ + dbg_printf("not done\n"); +} + +static int be_arm_adjust_pc_for_break(CONTEXT* ctx, BOOL way) +{ + dbg_printf("not done\n"); + return 0; +} + +static int be_arm_fetch_integer(const struct dbg_lvalue* lvalue, unsigned size, + unsigned ext_sign, LONGLONG* ret) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static int be_arm_fetch_float(const struct dbg_lvalue* lvalue, unsigned size, + long double* ret) +{ + dbg_printf("not done\n"); + return FALSE; +} + +struct backend_cpu be_arm = +{ + be_cpu_linearize, + be_cpu_build_addr, + be_arm_get_addr, + be_arm_single_step, + be_arm_print_context, + be_arm_print_segment_info, + be_arm_init_registers, + be_arm_is_step_over_insn, + be_arm_is_function_return, + be_arm_is_break_insn, + be_arm_is_func_call, + be_arm_disasm_one_insn, + be_arm_insert_Xpoint, + be_arm_remove_Xpoint, + be_arm_is_watchpoint_set, + be_arm_clear_watchpoint, + be_arm_adjust_pc_for_break, + be_arm_fetch_integer, + be_arm_fetch_float, +}; +#endif --- server/Makefile.in_bkp 2006-07-28 03:05:40.000000000 +0530 +++ server/Makefile.in 2006-07-28 03:00:12.000000000 +0530 @@ -12,6 +12,7 @@ clipboard.c \ console.c \ context_alpha.c \ + context_arm.c \ context_i386.c \ context_powerpc.c \ context_sparc.c \ --- /dev/null 2006-05-02 17:48:25.285177368 +0530 +++ server/context_arm.c 2006-07-28 02:27:48.000000000 +0530 @@ -0,0 +1,89 @@ +/* + * ARM register context support + * + * Copyright (C) 2006 Vijay Kiran Kamuju + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#ifdef __arm__ + +#include <assert.h> +#include <errno.h> +#ifdef HAVE_SYS_REG_H +# include <sys/reg.h> +#endif +#include <stdarg.h> +#include <unistd.h> +#ifdef HAVE_SYS_PTRACE_H +# include <sys/ptrace.h> +#endif + +#include "file.h" +#include "thread.h" +#include "request.h" + +/* copy a context structure according to the flags */ +void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags ) +{ + flags &= ~CONTEXT_ARM; /* get rid of CPU id */ + if (flags & CONTEXT_CONTROL) + { + to->Sp = from->Sp; + to->Lr = from->Lr; + to->Pc = from->Pc; + to->Psr = from->Psr; + } + if (flags & CONTEXT_INTEGER) + { + to->R0 = from->R0; + to->R1 = from->R1; + to->R2 = from->R2; + to->R3 = from->R3; + to->R4 = from->R4; + to->R5 = from->R5; + to->R6 = from->R6; + to->R7 = from->R7; + to->R8 = from->R8; + to->R9 = from->R9; + to->R10 = from->R10; + to->R11 = from->R11; + to->R12 = from->R12; + } + to->ContextFlags |= flags; +} + +/* retrieve the current instruction pointer of a context */ +void *get_context_ip( const CONTEXT *context ) +{ + return (void *)context->Pc; +} + +/* return the context flag that contains the CPU id */ +unsigned int get_context_cpu_flag(void) +{ + return CONTEXT_ARM; +} + +/* return only the context flags that correspond to system regs */ +/* (system regs are the ones we can't access on the client side) */ +unsigned int get_context_system_regs( unsigned int flags ) +{ + return 0; /* FIXME: implement client-side handling */ +} + +#endif /* __arm__ */