2011-03-01 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / m32r-linux-tdep.c
CommitLineData
9b32d526
KI
1/* Target-dependent code for GNU/Linux m32r.
2
7b6bb8da
JB
3 Copyright (C) 2004, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
9b32d526
KI
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
9b32d526
KI
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
9b32d526
KI
20
21#include "defs.h"
22#include "gdbcore.h"
23#include "frame.h"
24#include "value.h"
25#include "regcache.h"
26#include "inferior.h"
27#include "osabi.h"
28#include "reggroups.h"
9b098f24 29#include "regset.h"
9b32d526
KI
30
31#include "gdb_string.h"
32
33#include "glibc-tdep.h"
34#include "solib-svr4.h"
982e9687 35#include "symtab.h"
9b32d526
KI
36
37#include "trad-frame.h"
38#include "frame-unwind.h"
39
40#include "m32r-tdep.h"
a5ee0f0c
PA
41#include "linux-tdep.h"
42
9b32d526
KI
43\f
44
45/* Recognizing signal handler frames. */
46
47/* GNU/Linux has two flavors of signals. Normal signal handlers, and
48 "realtime" (RT) signals. The RT signals can provide additional
49 information to the signal handler if the SA_SIGINFO flag is set
50 when establishing a signal handler using `sigaction'. It is not
51 unlikely that future versions of GNU/Linux will support SA_SIGINFO
52 for normal signals too. */
53
54/* When the m32r Linux kernel calls a signal handler and the
55 SA_RESTORER flag isn't set, the return address points to a bit of
56 code on the stack. This function returns whether the PC appears to
57 be within this bit of code.
58
59 The instruction sequence for normal signals is
60 ldi r7, #__NR_sigreturn
61 trap #2
62 or 0x67 0x77 0x10 0xf2.
63
64 Checking for the code sequence should be somewhat reliable, because
65 the effect is to call the system call sigreturn. This is unlikely
66 to occur anywhere other than in a signal trampoline.
67
68 It kind of sucks that we have to read memory from the process in
69 order to identify a signal trampoline, but there doesn't seem to be
70 any other way. Therefore we only do the memory reads if no
71 function name could be identified, which should be the case since
72 the code is on the stack.
73
74 Detection of signal trampolines for handlers that set the
75 SA_RESTORER flag is in general not possible. Unfortunately this is
76 what the GNU C Library has been doing for quite some time now.
77 However, as of version 2.1.2, the GNU C Library uses signal
78 trampolines (named __restore and __restore_rt) that are identical
79 to the ones used by the kernel. Therefore, these trampolines are
80 supported too. */
81
16ac4ab5 82static const gdb_byte linux_sigtramp_code[] = {
9b32d526
KI
83 0x67, 0x77, 0x10, 0xf2,
84};
85
86/* If PC is in a sigtramp routine, return the address of the start of
87 the routine. Otherwise, return 0. */
88
89static CORE_ADDR
94afd7a6 90m32r_linux_sigtramp_start (CORE_ADDR pc, struct frame_info *this_frame)
9b32d526 91{
16ac4ab5 92 gdb_byte buf[4];
9b32d526
KI
93
94 /* We only recognize a signal trampoline if PC is at the start of
95 one of the instructions. We optimize for finding the PC at the
96 start of the instruction sequence, as will be the case when the
97 trampoline is not the first frame on the stack. We assume that
98 in the case where the PC is not at the start of the instruction
99 sequence, there will be a few trailing readable bytes on the
100 stack. */
101
102 if (pc % 2 != 0)
103 {
94afd7a6 104 if (!safe_frame_unwind_memory (this_frame, pc, buf, 2))
9b32d526
KI
105 return 0;
106
107 if (memcmp (buf, linux_sigtramp_code, 2) == 0)
108 pc -= 2;
109 else
110 return 0;
111 }
112
94afd7a6 113 if (!safe_frame_unwind_memory (this_frame, pc, buf, 4))
9b32d526
KI
114 return 0;
115
116 if (memcmp (buf, linux_sigtramp_code, 4) != 0)
117 return 0;
118
119 return pc;
120}
121
122/* This function does the same for RT signals. Here the instruction
123 sequence is
124 ldi r7, #__NR_rt_sigreturn
125 trap #2
126 or 0x97 0xf0 0x00 0xad 0x10 0xf2 0xf0 0x00.
127
128 The effect is to call the system call rt_sigreturn. */
129
16ac4ab5 130static const gdb_byte linux_rt_sigtramp_code[] = {
9b32d526
KI
131 0x97, 0xf0, 0x00, 0xad, 0x10, 0xf2, 0xf0, 0x00,
132};
133
134/* If PC is in a RT sigtramp routine, return the address of the start
135 of the routine. Otherwise, return 0. */
136
137static CORE_ADDR
94afd7a6 138m32r_linux_rt_sigtramp_start (CORE_ADDR pc, struct frame_info *this_frame)
9b32d526 139{
16ac4ab5 140 gdb_byte buf[4];
9b32d526
KI
141
142 /* We only recognize a signal trampoline if PC is at the start of
143 one of the instructions. We optimize for finding the PC at the
144 start of the instruction sequence, as will be the case when the
145 trampoline is not the first frame on the stack. We assume that
146 in the case where the PC is not at the start of the instruction
147 sequence, there will be a few trailing readable bytes on the
148 stack. */
149
150 if (pc % 2 != 0)
151 return 0;
152
94afd7a6 153 if (!safe_frame_unwind_memory (this_frame, pc, buf, 4))
9b32d526
KI
154 return 0;
155
156 if (memcmp (buf, linux_rt_sigtramp_code, 4) == 0)
157 {
94afd7a6 158 if (!safe_frame_unwind_memory (this_frame, pc + 4, buf, 4))
9b32d526
KI
159 return 0;
160
161 if (memcmp (buf, linux_rt_sigtramp_code + 4, 4) == 0)
162 return pc;
163 }
164 else if (memcmp (buf, linux_rt_sigtramp_code + 4, 4) == 0)
165 {
94afd7a6 166 if (!safe_frame_unwind_memory (this_frame, pc - 4, buf, 4))
9b32d526
KI
167 return 0;
168
169 if (memcmp (buf, linux_rt_sigtramp_code, 4) == 0)
170 return pc - 4;
171 }
172
173 return 0;
174}
175
176static int
177m32r_linux_pc_in_sigtramp (CORE_ADDR pc, char *name,
94afd7a6 178 struct frame_info *this_frame)
9b32d526
KI
179{
180 /* If we have NAME, we can optimize the search. The trampolines are
181 named __restore and __restore_rt. However, they aren't dynamically
182 exported from the shared C library, so the trampoline may appear to
183 be part of the preceding function. This should always be sigaction,
184 __sigaction, or __libc_sigaction (all aliases to the same function). */
185 if (name == NULL || strstr (name, "sigaction") != NULL)
94afd7a6
UW
186 return (m32r_linux_sigtramp_start (pc, this_frame) != 0
187 || m32r_linux_rt_sigtramp_start (pc, this_frame) != 0);
9b32d526
KI
188
189 return (strcmp ("__restore", name) == 0
190 || strcmp ("__restore_rt", name) == 0);
191}
192
193/* From <asm/sigcontext.h>. */
194static int m32r_linux_sc_reg_offset[] = {
195 4 * 4, /* r0 */
196 5 * 4, /* r1 */
197 6 * 4, /* r2 */
198 7 * 4, /* r3 */
199 0 * 4, /* r4 */
200 1 * 4, /* r5 */
201 2 * 4, /* r6 */
202 8 * 4, /* r7 */
203 9 * 4, /* r8 */
204 10 * 4, /* r9 */
205 11 * 4, /* r10 */
206 12 * 4, /* r11 */
207 13 * 4, /* r12 */
208 21 * 4, /* fp */
209 22 * 4, /* lr */
210 -1 * 4, /* sp */
211 16 * 4, /* psw */
212 -1 * 4, /* cbr */
213 23 * 4, /* spi */
214 20 * 4, /* spu */
215 19 * 4, /* bpc */
216 17 * 4, /* pc */
217 15 * 4, /* accl */
218 14 * 4 /* acch */
219};
220
221struct m32r_frame_cache
222{
223 CORE_ADDR base, pc;
224 struct trad_frame_saved_reg *saved_regs;
225};
226
227static struct m32r_frame_cache *
94afd7a6 228m32r_linux_sigtramp_frame_cache (struct frame_info *this_frame,
9b32d526
KI
229 void **this_cache)
230{
231 struct m32r_frame_cache *cache;
232 CORE_ADDR sigcontext_addr, addr;
233 int regnum;
234
235 if ((*this_cache) != NULL)
236 return (*this_cache);
237 cache = FRAME_OBSTACK_ZALLOC (struct m32r_frame_cache);
238 (*this_cache) = cache;
94afd7a6 239 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
9b32d526 240
94afd7a6 241 cache->base = get_frame_register_unsigned (this_frame, M32R_SP_REGNUM);
9b32d526
KI
242 sigcontext_addr = cache->base + 4;
243
94afd7a6
UW
244 cache->pc = get_frame_pc (this_frame);
245 addr = m32r_linux_sigtramp_start (cache->pc, this_frame);
9b32d526
KI
246 if (addr == 0)
247 {
248 /* If this is a RT signal trampoline, adjust SIGCONTEXT_ADDR
249 accordingly. */
94afd7a6 250 addr = m32r_linux_rt_sigtramp_start (cache->pc, this_frame);
9b32d526
KI
251 if (addr)
252 sigcontext_addr += 128;
253 else
94afd7a6 254 addr = get_frame_func (this_frame);
9b32d526
KI
255 }
256 cache->pc = addr;
257
94afd7a6 258 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
9b32d526
KI
259
260 for (regnum = 0; regnum < sizeof (m32r_linux_sc_reg_offset) / 4; regnum++)
261 {
262 if (m32r_linux_sc_reg_offset[regnum] >= 0)
263 cache->saved_regs[regnum].addr =
264 sigcontext_addr + m32r_linux_sc_reg_offset[regnum];
265 }
266
267 return cache;
268}
269
270static void
94afd7a6 271m32r_linux_sigtramp_frame_this_id (struct frame_info *this_frame,
9b32d526
KI
272 void **this_cache,
273 struct frame_id *this_id)
274{
275 struct m32r_frame_cache *cache =
94afd7a6 276 m32r_linux_sigtramp_frame_cache (this_frame, this_cache);
9b32d526
KI
277
278 (*this_id) = frame_id_build (cache->base, cache->pc);
279}
280
94afd7a6
UW
281static struct value *
282m32r_linux_sigtramp_frame_prev_register (struct frame_info *this_frame,
283 void **this_cache, int regnum)
9b32d526
KI
284{
285 struct m32r_frame_cache *cache =
94afd7a6 286 m32r_linux_sigtramp_frame_cache (this_frame, this_cache);
9b32d526 287
94afd7a6 288 return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
9b32d526
KI
289}
290
94afd7a6
UW
291static int
292m32r_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
293 struct frame_info *this_frame,
294 void **this_cache)
9b32d526 295{
94afd7a6 296 CORE_ADDR pc = get_frame_pc (this_frame);
9b32d526
KI
297 char *name;
298
299 find_pc_partial_function (pc, &name, NULL, NULL);
94afd7a6
UW
300 if (m32r_linux_pc_in_sigtramp (pc, name, this_frame))
301 return 1;
9b32d526 302
94afd7a6 303 return 0;
9b32d526
KI
304}
305
94afd7a6
UW
306static const struct frame_unwind m32r_linux_sigtramp_frame_unwind = {
307 SIGTRAMP_FRAME,
308 m32r_linux_sigtramp_frame_this_id,
309 m32r_linux_sigtramp_frame_prev_register,
310 NULL,
311 m32r_linux_sigtramp_frame_sniffer
312};
313
9b098f24
KI
314/* Mapping between the registers in `struct pt_regs'
315 format and GDB's register array layout. */
316
317static int m32r_pt_regs_offset[] = {
318 4 * 4, /* r0 */
319 4 * 5, /* r1 */
320 4 * 6, /* r2 */
321 4 * 7, /* r3 */
322 4 * 0, /* r4 */
323 4 * 1, /* r5 */
324 4 * 2, /* r6 */
325 4 * 8, /* r7 */
326 4 * 9, /* r8 */
327 4 * 10, /* r9 */
328 4 * 11, /* r10 */
329 4 * 12, /* r11 */
330 4 * 13, /* r12 */
331 4 * 24, /* fp */
332 4 * 25, /* lr */
333 4 * 23, /* sp */
334 4 * 19, /* psw */
335 4 * 19, /* cbr */
336 4 * 26, /* spi */
337 4 * 23, /* spu */
338 4 * 22, /* bpc */
339 4 * 20, /* pc */
340 4 * 16, /* accl */
341 4 * 15 /* acch */
342};
343
344#define PSW_OFFSET (4 * 19)
345#define BBPSW_OFFSET (4 * 21)
346#define SPU_OFFSET (4 * 23)
347#define SPI_OFFSET (4 * 26)
348
349static void
350m32r_linux_supply_gregset (const struct regset *regset,
351 struct regcache *regcache, int regnum,
352 const void *gregs, size_t size)
353{
354 const char *regs = gregs;
355 unsigned long psw, bbpsw;
356 int i;
357
358 psw = *((unsigned long *) (regs + PSW_OFFSET));
359 bbpsw = *((unsigned long *) (regs + BBPSW_OFFSET));
360
361 for (i = 0; i < sizeof (m32r_pt_regs_offset) / 4; i++)
362 {
363 if (regnum != -1 && regnum != i)
364 continue;
365
366 switch (i)
367 {
368 case PSW_REGNUM:
369 *((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
370 ((0x00c1 & bbpsw) << 8) | ((0xc100 & psw) >> 8);
371 break;
372 case CBR_REGNUM:
373 *((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
374 ((psw >> 8) & 1);
375 break;
376 case M32R_SP_REGNUM:
377 if (psw & 0x8000)
378 *((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
379 *((unsigned long *) (regs + SPU_OFFSET));
380 else
381 *((unsigned long *) (regs + m32r_pt_regs_offset[i])) =
382 *((unsigned long *) (regs + SPI_OFFSET));
383 break;
384 }
385
9c9acae0 386 regcache_raw_supply (regcache, i,
9b098f24
KI
387 regs + m32r_pt_regs_offset[i]);
388 }
389}
390
391static struct regset m32r_linux_gregset = {
392 NULL, m32r_linux_supply_gregset
393};
394
395static const struct regset *
396m32r_linux_regset_from_core_section (struct gdbarch *core_arch,
397 const char *sect_name, size_t sect_size)
398{
399 struct gdbarch_tdep *tdep = gdbarch_tdep (core_arch);
400 if (strcmp (sect_name, ".reg") == 0)
401 return &m32r_linux_gregset;
402 return NULL;
403}
404
9b32d526
KI
405static void
406m32r_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
407{
408 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
409
a5ee0f0c
PA
410 linux_init_abi (info, gdbarch);
411
9b32d526
KI
412 /* Since EVB register is not available for native debug, we reduce
413 the number of registers. */
414 set_gdbarch_num_regs (gdbarch, M32R_NUM_REGS - 1);
415
94afd7a6 416 frame_unwind_append_unwinder (gdbarch, &m32r_linux_sigtramp_frame_unwind);
9b32d526
KI
417
418 /* GNU/Linux uses SVR4-style shared libraries. */
982e9687 419 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
9b32d526
KI
420 set_solib_svr4_fetch_link_map_offsets
421 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
9b098f24
KI
422
423 /* Core file support. */
424 set_gdbarch_regset_from_core_section
425 (gdbarch, m32r_linux_regset_from_core_section);
b2756930
KB
426
427 /* Enable TLS support. */
428 set_gdbarch_fetch_tls_load_module_address (gdbarch,
429 svr4_fetch_objfile_link_map);
9b32d526
KI
430}
431
432/* Provide a prototype to silence -Wmissing-prototypes. */
433extern void _initialize_m32r_linux_tdep (void);
434
435void
436_initialize_m32r_linux_tdep (void)
437{
438 gdbarch_register_osabi (bfd_arch_m32r, 0, GDB_OSABI_LINUX,
439 m32r_linux_init_abi);
440}
This page took 0.481543 seconds and 4 git commands to generate.