1/* Copyright (C) 2007 Free Software Foundation, Inc. 2 3 This file is part of GDB. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18#include "server.h" 19#include "win32-low.h" 20 21#ifndef CONTEXT_FLOATING_POINT 22#define CONTEXT_FLOATING_POINT 0 23#endif 24 25static void 26arm_get_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event) 27{ 28 th->context.ContextFlags = \ 29 CONTEXT_FULL | \ 30 CONTEXT_FLOATING_POINT; 31 32 GetThreadContext (th->h, &th->context); 33} 34 35static void 36arm_set_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event) 37{ 38 SetThreadContext (th->h, &th->context); 39} 40 41#define context_offset(x) ((int)&(((CONTEXT *)NULL)->x)) 42static const int mappings[] = { 43 context_offset (R0), 44 context_offset (R1), 45 context_offset (R2), 46 context_offset (R3), 47 context_offset (R4), 48 context_offset (R5), 49 context_offset (R6), 50 context_offset (R7), 51 context_offset (R8), 52 context_offset (R9), 53 context_offset (R10), 54 context_offset (R11), 55 context_offset (R12), 56 context_offset (Sp), 57 context_offset (Lr), 58 context_offset (Pc), 59 -1, /* f0 */ 60 -1, /* f1 */ 61 -1, /* f2 */ 62 -1, /* f3 */ 63 -1, /* f4 */ 64 -1, /* f5 */ 65 -1, /* f6 */ 66 -1, /* f7 */ 67 -1, /* fps */ 68 context_offset (Psr), 69}; 70#undef context_offset 71 72/* Return a pointer into a CONTEXT field indexed by gdb register number. 73 Return a pointer to an dummy register holding zero if there is no 74 corresponding CONTEXT field for the given register number. */ 75static char * 76regptr (CONTEXT* c, int r) 77{ 78 if (mappings[r] < 0) 79 { 80 static ULONG zero; 81 /* Always force value to zero, in case the user tried to write 82 to this register before. */ 83 zero = 0; 84 return (char *) &zero; 85 } 86 else 87 return (char *) c + mappings[r]; 88} 89 90/* Fetch register from gdbserver regcache data. */ 91static void 92arm_fetch_inferior_register (win32_thread_info *th, int r) 93{ 94 char *context_offset = regptr (&th->context, r); 95 supply_register (r, context_offset); 96} 97 98/* Store a new register value into the thread context of TH. */ 99static void 100arm_store_inferior_register (win32_thread_info *th, int r) 101{ 102 collect_register (r, regptr (&th->context, r)); 103} 104 105/* Correct in either endianness. We do not support Thumb yet. */ 106static const unsigned long arm_wince_breakpoint = 0xe6000010; 107#define arm_wince_breakpoint_len 4 108 109struct win32_target_ops the_low_target = { 110 sizeof (mappings) / sizeof (mappings[0]), 111 NULL, /* initial_stuff */ 112 arm_get_thread_context, 113 arm_set_thread_context, 114 NULL, /* thread_added */ 115 arm_fetch_inferior_register, 116 arm_store_inferior_register, 117 NULL, /* single_step */ 118 (const unsigned char *) &arm_wince_breakpoint, 119 arm_wince_breakpoint_len, 120 "arm" /* arch_string */ 121}; 122