xref: /openbsd-src/gnu/usr.bin/binutils/gdb/m32r-linux-tdep.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
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