1*11efff7fSkettenis /* Target-dependent code for GNU/Linux m32r.
2*11efff7fSkettenis
3*11efff7fSkettenis Copyright 2004 Free Software Foundation, Inc.
4*11efff7fSkettenis
5*11efff7fSkettenis This file is part of GDB.
6*11efff7fSkettenis
7*11efff7fSkettenis This program is free software; you can redistribute it and/or modify
8*11efff7fSkettenis it under the terms of the GNU General Public License as published by
9*11efff7fSkettenis the Free Software Foundation; either version 2 of the License, or
10*11efff7fSkettenis (at your option) any later version.
11*11efff7fSkettenis
12*11efff7fSkettenis This program is distributed in the hope that it will be useful,
13*11efff7fSkettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
14*11efff7fSkettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*11efff7fSkettenis GNU General Public License for more details.
16*11efff7fSkettenis
17*11efff7fSkettenis You should have received a copy of the GNU General Public License
18*11efff7fSkettenis along with this program; if not, write to the Free Software
19*11efff7fSkettenis Foundation, Inc., 59 Temple Place - Suite 330,
20*11efff7fSkettenis Boston, MA 02111-1307, USA. */
21*11efff7fSkettenis
22*11efff7fSkettenis #include "defs.h"
23*11efff7fSkettenis #include "gdbcore.h"
24*11efff7fSkettenis #include "frame.h"
25*11efff7fSkettenis #include "value.h"
26*11efff7fSkettenis #include "regcache.h"
27*11efff7fSkettenis #include "inferior.h"
28*11efff7fSkettenis #include "osabi.h"
29*11efff7fSkettenis #include "reggroups.h"
30*11efff7fSkettenis
31*11efff7fSkettenis #include "gdb_string.h"
32*11efff7fSkettenis
33*11efff7fSkettenis #include "glibc-tdep.h"
34*11efff7fSkettenis #include "solib-svr4.h"
35*11efff7fSkettenis
36*11efff7fSkettenis #include "trad-frame.h"
37*11efff7fSkettenis #include "frame-unwind.h"
38*11efff7fSkettenis
39*11efff7fSkettenis #include "m32r-tdep.h"
40*11efff7fSkettenis
41*11efff7fSkettenis
42*11efff7fSkettenis /* Recognizing signal handler frames. */
43*11efff7fSkettenis
44*11efff7fSkettenis /* GNU/Linux has two flavors of signals. Normal signal handlers, and
45*11efff7fSkettenis "realtime" (RT) signals. The RT signals can provide additional
46*11efff7fSkettenis information to the signal handler if the SA_SIGINFO flag is set
47*11efff7fSkettenis when establishing a signal handler using `sigaction'. It is not
48*11efff7fSkettenis unlikely that future versions of GNU/Linux will support SA_SIGINFO
49*11efff7fSkettenis for normal signals too. */
50*11efff7fSkettenis
51*11efff7fSkettenis /* When the m32r Linux kernel calls a signal handler and the
52*11efff7fSkettenis SA_RESTORER flag isn't set, the return address points to a bit of
53*11efff7fSkettenis code on the stack. This function returns whether the PC appears to
54*11efff7fSkettenis be within this bit of code.
55*11efff7fSkettenis
56*11efff7fSkettenis The instruction sequence for normal signals is
57*11efff7fSkettenis ldi r7, #__NR_sigreturn
58*11efff7fSkettenis trap #2
59*11efff7fSkettenis or 0x67 0x77 0x10 0xf2.
60*11efff7fSkettenis
61*11efff7fSkettenis Checking for the code sequence should be somewhat reliable, because
62*11efff7fSkettenis the effect is to call the system call sigreturn. This is unlikely
63*11efff7fSkettenis to occur anywhere other than in a signal trampoline.
64*11efff7fSkettenis
65*11efff7fSkettenis It kind of sucks that we have to read memory from the process in
66*11efff7fSkettenis order to identify a signal trampoline, but there doesn't seem to be
67*11efff7fSkettenis any other way. Therefore we only do the memory reads if no
68*11efff7fSkettenis function name could be identified, which should be the case since
69*11efff7fSkettenis the code is on the stack.
70*11efff7fSkettenis
71*11efff7fSkettenis Detection of signal trampolines for handlers that set the
72*11efff7fSkettenis SA_RESTORER flag is in general not possible. Unfortunately this is
73*11efff7fSkettenis what the GNU C Library has been doing for quite some time now.
74*11efff7fSkettenis However, as of version 2.1.2, the GNU C Library uses signal
75*11efff7fSkettenis trampolines (named __restore and __restore_rt) that are identical
76*11efff7fSkettenis to the ones used by the kernel. Therefore, these trampolines are
77*11efff7fSkettenis supported too. */
78*11efff7fSkettenis
79*11efff7fSkettenis static const unsigned char linux_sigtramp_code[] = {
80*11efff7fSkettenis 0x67, 0x77, 0x10, 0xf2,
81*11efff7fSkettenis };
82*11efff7fSkettenis
83*11efff7fSkettenis /* If PC is in a sigtramp routine, return the address of the start of
84*11efff7fSkettenis the routine. Otherwise, return 0. */
85*11efff7fSkettenis
86*11efff7fSkettenis static CORE_ADDR
m32r_linux_sigtramp_start(CORE_ADDR pc,struct frame_info * next_frame)87*11efff7fSkettenis m32r_linux_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
88*11efff7fSkettenis {
89*11efff7fSkettenis unsigned char buf[4];
90*11efff7fSkettenis
91*11efff7fSkettenis /* We only recognize a signal trampoline if PC is at the start of
92*11efff7fSkettenis one of the instructions. We optimize for finding the PC at the
93*11efff7fSkettenis start of the instruction sequence, as will be the case when the
94*11efff7fSkettenis trampoline is not the first frame on the stack. We assume that
95*11efff7fSkettenis in the case where the PC is not at the start of the instruction
96*11efff7fSkettenis sequence, there will be a few trailing readable bytes on the
97*11efff7fSkettenis stack. */
98*11efff7fSkettenis
99*11efff7fSkettenis if (pc % 2 != 0)
100*11efff7fSkettenis {
101*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc, buf, 2))
102*11efff7fSkettenis return 0;
103*11efff7fSkettenis
104*11efff7fSkettenis if (memcmp (buf, linux_sigtramp_code, 2) == 0)
105*11efff7fSkettenis pc -= 2;
106*11efff7fSkettenis else
107*11efff7fSkettenis return 0;
108*11efff7fSkettenis }
109*11efff7fSkettenis
110*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc, buf, 4))
111*11efff7fSkettenis return 0;
112*11efff7fSkettenis
113*11efff7fSkettenis if (memcmp (buf, linux_sigtramp_code, 4) != 0)
114*11efff7fSkettenis return 0;
115*11efff7fSkettenis
116*11efff7fSkettenis return pc;
117*11efff7fSkettenis }
118*11efff7fSkettenis
119*11efff7fSkettenis /* This function does the same for RT signals. Here the instruction
120*11efff7fSkettenis sequence is
121*11efff7fSkettenis ldi r7, #__NR_rt_sigreturn
122*11efff7fSkettenis trap #2
123*11efff7fSkettenis or 0x97 0xf0 0x00 0xad 0x10 0xf2 0xf0 0x00.
124*11efff7fSkettenis
125*11efff7fSkettenis The effect is to call the system call rt_sigreturn. */
126*11efff7fSkettenis
127*11efff7fSkettenis static const unsigned char linux_rt_sigtramp_code[] = {
128*11efff7fSkettenis 0x97, 0xf0, 0x00, 0xad, 0x10, 0xf2, 0xf0, 0x00,
129*11efff7fSkettenis };
130*11efff7fSkettenis
131*11efff7fSkettenis /* If PC is in a RT sigtramp routine, return the address of the start
132*11efff7fSkettenis of the routine. Otherwise, return 0. */
133*11efff7fSkettenis
134*11efff7fSkettenis static CORE_ADDR
m32r_linux_rt_sigtramp_start(CORE_ADDR pc,struct frame_info * next_frame)135*11efff7fSkettenis m32r_linux_rt_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
136*11efff7fSkettenis {
137*11efff7fSkettenis unsigned char buf[4];
138*11efff7fSkettenis
139*11efff7fSkettenis /* We only recognize a signal trampoline if PC is at the start of
140*11efff7fSkettenis one of the instructions. We optimize for finding the PC at the
141*11efff7fSkettenis start of the instruction sequence, as will be the case when the
142*11efff7fSkettenis trampoline is not the first frame on the stack. We assume that
143*11efff7fSkettenis in the case where the PC is not at the start of the instruction
144*11efff7fSkettenis sequence, there will be a few trailing readable bytes on the
145*11efff7fSkettenis stack. */
146*11efff7fSkettenis
147*11efff7fSkettenis if (pc % 2 != 0)
148*11efff7fSkettenis return 0;
149*11efff7fSkettenis
150*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc, buf, 4))
151*11efff7fSkettenis return 0;
152*11efff7fSkettenis
153*11efff7fSkettenis if (memcmp (buf, linux_rt_sigtramp_code, 4) == 0)
154*11efff7fSkettenis {
155*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc + 4, buf, 4))
156*11efff7fSkettenis return 0;
157*11efff7fSkettenis
158*11efff7fSkettenis if (memcmp (buf, linux_rt_sigtramp_code + 4, 4) == 0)
159*11efff7fSkettenis return pc;
160*11efff7fSkettenis }
161*11efff7fSkettenis else if (memcmp (buf, linux_rt_sigtramp_code + 4, 4) == 0)
162*11efff7fSkettenis {
163*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc - 4, buf, 4))
164*11efff7fSkettenis return 0;
165*11efff7fSkettenis
166*11efff7fSkettenis if (memcmp (buf, linux_rt_sigtramp_code, 4) == 0)
167*11efff7fSkettenis return pc - 4;
168*11efff7fSkettenis }
169*11efff7fSkettenis
170*11efff7fSkettenis return 0;
171*11efff7fSkettenis }
172*11efff7fSkettenis
173*11efff7fSkettenis static int
m32r_linux_pc_in_sigtramp(CORE_ADDR pc,char * name,struct frame_info * next_frame)174*11efff7fSkettenis m32r_linux_pc_in_sigtramp (CORE_ADDR pc, char *name,
175*11efff7fSkettenis struct frame_info *next_frame)
176*11efff7fSkettenis {
177*11efff7fSkettenis /* If we have NAME, we can optimize the search. The trampolines are
178*11efff7fSkettenis named __restore and __restore_rt. However, they aren't dynamically
179*11efff7fSkettenis exported from the shared C library, so the trampoline may appear to
180*11efff7fSkettenis be part of the preceding function. This should always be sigaction,
181*11efff7fSkettenis __sigaction, or __libc_sigaction (all aliases to the same function). */
182*11efff7fSkettenis if (name == NULL || strstr (name, "sigaction") != NULL)
183*11efff7fSkettenis return (m32r_linux_sigtramp_start (pc, next_frame) != 0
184*11efff7fSkettenis || m32r_linux_rt_sigtramp_start (pc, next_frame) != 0);
185*11efff7fSkettenis
186*11efff7fSkettenis return (strcmp ("__restore", name) == 0
187*11efff7fSkettenis || strcmp ("__restore_rt", name) == 0);
188*11efff7fSkettenis }
189*11efff7fSkettenis
190*11efff7fSkettenis /* From <asm/sigcontext.h>. */
191*11efff7fSkettenis static int m32r_linux_sc_reg_offset[] = {
192*11efff7fSkettenis 4 * 4, /* r0 */
193*11efff7fSkettenis 5 * 4, /* r1 */
194*11efff7fSkettenis 6 * 4, /* r2 */
195*11efff7fSkettenis 7 * 4, /* r3 */
196*11efff7fSkettenis 0 * 4, /* r4 */
197*11efff7fSkettenis 1 * 4, /* r5 */
198*11efff7fSkettenis 2 * 4, /* r6 */
199*11efff7fSkettenis 8 * 4, /* r7 */
200*11efff7fSkettenis 9 * 4, /* r8 */
201*11efff7fSkettenis 10 * 4, /* r9 */
202*11efff7fSkettenis 11 * 4, /* r10 */
203*11efff7fSkettenis 12 * 4, /* r11 */
204*11efff7fSkettenis 13 * 4, /* r12 */
205*11efff7fSkettenis 21 * 4, /* fp */
206*11efff7fSkettenis 22 * 4, /* lr */
207*11efff7fSkettenis -1 * 4, /* sp */
208*11efff7fSkettenis 16 * 4, /* psw */
209*11efff7fSkettenis -1 * 4, /* cbr */
210*11efff7fSkettenis 23 * 4, /* spi */
211*11efff7fSkettenis 20 * 4, /* spu */
212*11efff7fSkettenis 19 * 4, /* bpc */
213*11efff7fSkettenis 17 * 4, /* pc */
214*11efff7fSkettenis 15 * 4, /* accl */
215*11efff7fSkettenis 14 * 4 /* acch */
216*11efff7fSkettenis };
217*11efff7fSkettenis
218*11efff7fSkettenis struct m32r_frame_cache
219*11efff7fSkettenis {
220*11efff7fSkettenis CORE_ADDR base, pc;
221*11efff7fSkettenis struct trad_frame_saved_reg *saved_regs;
222*11efff7fSkettenis };
223*11efff7fSkettenis
224*11efff7fSkettenis static struct m32r_frame_cache *
m32r_linux_sigtramp_frame_cache(struct frame_info * next_frame,void ** this_cache)225*11efff7fSkettenis m32r_linux_sigtramp_frame_cache (struct frame_info *next_frame,
226*11efff7fSkettenis void **this_cache)
227*11efff7fSkettenis {
228*11efff7fSkettenis struct m32r_frame_cache *cache;
229*11efff7fSkettenis CORE_ADDR sigcontext_addr, addr;
230*11efff7fSkettenis int regnum;
231*11efff7fSkettenis
232*11efff7fSkettenis if ((*this_cache) != NULL)
233*11efff7fSkettenis return (*this_cache);
234*11efff7fSkettenis cache = FRAME_OBSTACK_ZALLOC (struct m32r_frame_cache);
235*11efff7fSkettenis (*this_cache) = cache;
236*11efff7fSkettenis cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
237*11efff7fSkettenis
238*11efff7fSkettenis cache->base = frame_unwind_register_unsigned (next_frame, M32R_SP_REGNUM);
239*11efff7fSkettenis sigcontext_addr = cache->base + 4;
240*11efff7fSkettenis
241*11efff7fSkettenis cache->pc = frame_pc_unwind (next_frame);
242*11efff7fSkettenis addr = m32r_linux_sigtramp_start (cache->pc, next_frame);
243*11efff7fSkettenis if (addr == 0)
244*11efff7fSkettenis {
245*11efff7fSkettenis /* If this is a RT signal trampoline, adjust SIGCONTEXT_ADDR
246*11efff7fSkettenis accordingly. */
247*11efff7fSkettenis addr = m32r_linux_rt_sigtramp_start (cache->pc, next_frame);
248*11efff7fSkettenis if (addr)
249*11efff7fSkettenis sigcontext_addr += 128;
250*11efff7fSkettenis else
251*11efff7fSkettenis addr = frame_func_unwind (next_frame);
252*11efff7fSkettenis }
253*11efff7fSkettenis cache->pc = addr;
254*11efff7fSkettenis
255*11efff7fSkettenis cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
256*11efff7fSkettenis
257*11efff7fSkettenis for (regnum = 0; regnum < sizeof (m32r_linux_sc_reg_offset) / 4; regnum++)
258*11efff7fSkettenis {
259*11efff7fSkettenis if (m32r_linux_sc_reg_offset[regnum] >= 0)
260*11efff7fSkettenis cache->saved_regs[regnum].addr =
261*11efff7fSkettenis sigcontext_addr + m32r_linux_sc_reg_offset[regnum];
262*11efff7fSkettenis }
263*11efff7fSkettenis
264*11efff7fSkettenis return cache;
265*11efff7fSkettenis }
266*11efff7fSkettenis
267*11efff7fSkettenis static void
m32r_linux_sigtramp_frame_this_id(struct frame_info * next_frame,void ** this_cache,struct frame_id * this_id)268*11efff7fSkettenis m32r_linux_sigtramp_frame_this_id (struct frame_info *next_frame,
269*11efff7fSkettenis void **this_cache,
270*11efff7fSkettenis struct frame_id *this_id)
271*11efff7fSkettenis {
272*11efff7fSkettenis struct m32r_frame_cache *cache =
273*11efff7fSkettenis m32r_linux_sigtramp_frame_cache (next_frame, this_cache);
274*11efff7fSkettenis
275*11efff7fSkettenis (*this_id) = frame_id_build (cache->base, cache->pc);
276*11efff7fSkettenis }
277*11efff7fSkettenis
278*11efff7fSkettenis static void
m32r_linux_sigtramp_frame_prev_register(struct frame_info * next_frame,void ** this_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * valuep)279*11efff7fSkettenis m32r_linux_sigtramp_frame_prev_register (struct frame_info *next_frame,
280*11efff7fSkettenis void **this_cache,
281*11efff7fSkettenis int regnum, int *optimizedp,
282*11efff7fSkettenis enum lval_type *lvalp,
283*11efff7fSkettenis CORE_ADDR *addrp,
284*11efff7fSkettenis int *realnump, void *valuep)
285*11efff7fSkettenis {
286*11efff7fSkettenis struct m32r_frame_cache *cache =
287*11efff7fSkettenis m32r_linux_sigtramp_frame_cache (next_frame, this_cache);
288*11efff7fSkettenis
289*11efff7fSkettenis trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
290*11efff7fSkettenis optimizedp, lvalp, addrp, realnump, valuep);
291*11efff7fSkettenis }
292*11efff7fSkettenis
293*11efff7fSkettenis static const struct frame_unwind m32r_linux_sigtramp_frame_unwind = {
294*11efff7fSkettenis SIGTRAMP_FRAME,
295*11efff7fSkettenis m32r_linux_sigtramp_frame_this_id,
296*11efff7fSkettenis m32r_linux_sigtramp_frame_prev_register
297*11efff7fSkettenis };
298*11efff7fSkettenis
299*11efff7fSkettenis static const struct frame_unwind *
m32r_linux_sigtramp_frame_sniffer(struct frame_info * next_frame)300*11efff7fSkettenis m32r_linux_sigtramp_frame_sniffer (struct frame_info *next_frame)
301*11efff7fSkettenis {
302*11efff7fSkettenis CORE_ADDR pc = frame_pc_unwind (next_frame);
303*11efff7fSkettenis char *name;
304*11efff7fSkettenis
305*11efff7fSkettenis find_pc_partial_function (pc, &name, NULL, NULL);
306*11efff7fSkettenis if (m32r_linux_pc_in_sigtramp (pc, name, next_frame))
307*11efff7fSkettenis return &m32r_linux_sigtramp_frame_unwind;
308*11efff7fSkettenis
309*11efff7fSkettenis return NULL;
310*11efff7fSkettenis }
311*11efff7fSkettenis
312*11efff7fSkettenis static void
m32r_linux_init_abi(struct gdbarch_info info,struct gdbarch * gdbarch)313*11efff7fSkettenis m32r_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
314*11efff7fSkettenis {
315*11efff7fSkettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
316*11efff7fSkettenis
317*11efff7fSkettenis /* Since EVB register is not available for native debug, we reduce
318*11efff7fSkettenis the number of registers. */
319*11efff7fSkettenis set_gdbarch_num_regs (gdbarch, M32R_NUM_REGS - 1);
320*11efff7fSkettenis
321*11efff7fSkettenis frame_unwind_append_sniffer (gdbarch, m32r_linux_sigtramp_frame_sniffer);
322*11efff7fSkettenis
323*11efff7fSkettenis /* GNU/Linux uses SVR4-style shared libraries. */
324*11efff7fSkettenis set_solib_svr4_fetch_link_map_offsets
325*11efff7fSkettenis (gdbarch, svr4_ilp32_fetch_link_map_offsets);
326*11efff7fSkettenis }
327*11efff7fSkettenis
328*11efff7fSkettenis /* Provide a prototype to silence -Wmissing-prototypes. */
329*11efff7fSkettenis extern void _initialize_m32r_linux_tdep (void);
330*11efff7fSkettenis
331*11efff7fSkettenis void
_initialize_m32r_linux_tdep(void)332*11efff7fSkettenis _initialize_m32r_linux_tdep (void)
333*11efff7fSkettenis {
334*11efff7fSkettenis gdbarch_register_osabi (bfd_arch_m32r, 0, GDB_OSABI_LINUX,
335*11efff7fSkettenis m32r_linux_init_abi);
336*11efff7fSkettenis }
337