[RFA] Handle am33 linux signal frames
Michael Snyder
msnyder@redhat.com
Tue Feb 28 20:00:00 GMT 2006
Kevin Buettner wrote:
> The patch below adds support for signal frames on am33 GNU/Linux.
>
> Okay?
I can't say I've thoroughly reviewed it, since I don't really
understand how this mechanism works -- but it doesn't look like
it would break anything, so sure, it's fine.
By the way, you've done more work on this architecture
than I have recently -- would you like to take over its
maintainership? Or share it?
Michael
> * Makefile.in (mn10300-linux-tdep.o): Update dependencies.
> * mn10300-linux-tdep.c (frame.h, trad-frame.h, tramp-frame.h):
> Include.
> (am33_linux_sigframe_cache_init): New function.
> (am33_linux_sigframe, am33_linux_rt_sigframe): New signal frame
> descriptions.
> (AM33_SIGCONTEXT_D0, AM33_SIGCONTEXT_D1, AM33_SIGCONTEXT_D2)
> (AM33_SIGCONTEXT_D3, AM33_SIGCONTEXT_A0, AM33_SIGCONTEXT_A1)
> (AM33_SIGCONTEXT_A2, AM33_SIGCONTEXT_A3, AM33_SIGCONTEXT_E0)
> (AM33_SIGCONTEXT_E1, AM33_SIGCONTEXT_E2, AM33_SIGCONTEXT_E3)
> (AM33_SIGCONTEXT_E4, AM33_SIGCONTEXT_E5, AM33_SIGCONTEXT_E6)
> (AM33_SIGCONTEXT_E7, AM33_SIGCONTEXT_LAR, AM33_SIGCONTEXT_LIR)
> (AM33_SIGCONTEXT_MDR, AM33_SIGCONTEXT_MCVF, AM33_SIGCONTEXT_MCRL)
> (AM33_SIGCONTEXT_MCRH, AM33_SIGCONTEXT_MDRQ, AM33_SIGCONTEXT_SP)
> (AM33_SIGCONTEXT_EPSW, AM33_SIGCONTEXT_PC, AM33_SIGCONTEXT_FPUCONTEXT):
> New constants.
> (am33_linux_init_osabi): Register signal frame unwinders.
>
> Index: Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/gdb/Makefile.in,v
> retrieving revision 1.786
> diff -u -p -r1.786 Makefile.in
> --- Makefile.in 10 Feb 2006 22:01:43 -0000 1.786
> +++ Makefile.in 16 Feb 2006 22:33:03 -0000
> @@ -2326,7 +2326,8 @@ mipsv4-nat.o: mipsv4-nat.c $(defs_h) $(i
> $(regcache_h) $(gregset_h)
> mn10300-linux-tdep.o: mn10300-linux-tdep.c $(defs_h) $(gdbcore_h) \
> $(gdb_string_h) $(regcache_h) $(mn10300_tdep_h) $(gdb_assert_h) \
> - $(bfd_h) $(elf_bfd_h) $(osabi_h) $(regset_h) $(solib_svr4_h)
> + $(bfd_h) $(elf_bfd_h) $(osabi_h) $(regset_h) $(solib_svr4_h) \
> + $(frame_h) $(trad_frame_h) $(tramp_frame_h)
> mn10300-tdep.o: mn10300-tdep.c $(defs_h) $(arch_utils_h) $(dis_asm_h) \
> $(gdbtypes_h) $(regcache_h) $(gdb_string_h) $(gdb_assert_h) \
> $(frame_h) $(frame_unwind_h) $(frame_base_h) $(trad_frame_h) \
> Index: mn10300-linux-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mn10300-linux-tdep.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 mn10300-linux-tdep.c
> --- mn10300-linux-tdep.c 17 Dec 2005 22:34:01 -0000 1.4
> +++ mn10300-linux-tdep.c 16 Feb 2006 22:33:03 -0000
> @@ -30,6 +30,9 @@
> #include "osabi.h"
> #include "regset.h"
> #include "solib-svr4.h"
> +#include "frame.h"
> +#include "trad-frame.h"
> +#include "tramp-frame.h"
>
> #include <stdlib.h>
>
> @@ -467,7 +470,240 @@ am33_regset_from_core_section (struct gd
> am33_supply_gregset_method,
> am33_collect_gregset_method);
> }
> +
> +static void
> +am33_linux_sigframe_cache_init (const struct tramp_frame *self,
> + struct frame_info *next_frame,
> + struct trad_frame_cache *this_cache,
> + CORE_ADDR func);
> +
> +static const struct tramp_frame am33_linux_sigframe = {
> + SIGTRAMP_FRAME,
> + 1,
> + {
> + /* mov 119,d0 */
> + { 0x2c, -1 },
> + { 0x77, -1 },
> + { 0x00, -1 },
> + /* syscall 0 */
> + { 0xf0, -1 },
> + { 0xe0, -1 },
> + { TRAMP_SENTINEL_INSN, -1 }
> + },
> + am33_linux_sigframe_cache_init
> +};
> +
> +static const struct tramp_frame am33_linux_rt_sigframe = {
> + SIGTRAMP_FRAME,
> + 1,
> + {
> + /* mov 173,d0 */
> + { 0x2c, -1 },
> + { 0xad, -1 },
> + { 0x00, -1 },
> + /* syscall 0 */
> + { 0xf0, -1 },
> + { 0xe0, -1 },
> + { TRAMP_SENTINEL_INSN, -1 }
> + },
> + am33_linux_sigframe_cache_init
> +};
> +
> +/* Relevant struct definitions for signal handling...
> +
> +From arch/mn10300/kernel/sigframe.h:
> +
> +struct sigframe
> +{
> + void (*pretcode)(void);
> + int sig;
> + struct sigcontext sc;
> + struct fpucontext fpuctx;
> + unsigned long extramask[_NSIG_WORDS-1];
> + char retcode[8];
> +};
> +
> +struct rt_sigframe
> +{
> + void (*pretcode)(void);
> + int sig;
> + struct siginfo *pinfo;
> + void *puc;
> + struct siginfo info;
> + struct ucontext uc;
> + struct fpucontext fpuctx;
> + char retcode[8];
> +};
> +
> +From include/asm-mn10300/ucontext.h:
> +
> +struct ucontext {
> + unsigned long uc_flags;
> + struct ucontext *uc_link;
> + stack_t uc_stack;
> + struct sigcontext uc_mcontext;
> + sigset_t uc_sigmask;
> +};
> +
> +From include/asm-mn10300/sigcontext.h:
> +
> +struct fpucontext {
> + unsigned long fs[32];
> + unsigned long fpcr;
> +};
> +
> +struct sigcontext {
> + unsigned long d0;
> + unsigned long d1;
> + unsigned long d2;
> + unsigned long d3;
> + unsigned long a0;
> + unsigned long a1;
> + unsigned long a2;
> + unsigned long a3;
> + unsigned long e0;
> + unsigned long e1;
> + unsigned long e2;
> + unsigned long e3;
> + unsigned long e4;
> + unsigned long e5;
> + unsigned long e6;
> + unsigned long e7;
> + unsigned long lar;
> + unsigned long lir;
> + unsigned long mdr;
> + unsigned long mcvf;
> + unsigned long mcrl;
> + unsigned long mcrh;
> + unsigned long mdrq;
> + unsigned long sp;
> + unsigned long epsw;
> + unsigned long pc;
> + struct fpucontext *fpucontext;
> + unsigned long oldmask;
> +}; */
> +
> +
> +#define AM33_SIGCONTEXT_D0 0
> +#define AM33_SIGCONTEXT_D1 4
> +#define AM33_SIGCONTEXT_D2 8
> +#define AM33_SIGCONTEXT_D3 12
> +#define AM33_SIGCONTEXT_A0 16
> +#define AM33_SIGCONTEXT_A1 20
> +#define AM33_SIGCONTEXT_A2 24
> +#define AM33_SIGCONTEXT_A3 28
> +#define AM33_SIGCONTEXT_E0 32
> +#define AM33_SIGCONTEXT_E1 36
> +#define AM33_SIGCONTEXT_E2 40
> +#define AM33_SIGCONTEXT_E3 44
> +#define AM33_SIGCONTEXT_E4 48
> +#define AM33_SIGCONTEXT_E5 52
> +#define AM33_SIGCONTEXT_E6 56
> +#define AM33_SIGCONTEXT_E7 60
> +#define AM33_SIGCONTEXT_LAR 64
> +#define AM33_SIGCONTEXT_LIR 68
> +#define AM33_SIGCONTEXT_MDR 72
> +#define AM33_SIGCONTEXT_MCVF 76
> +#define AM33_SIGCONTEXT_MCRL 80
> +#define AM33_SIGCONTEXT_MCRH 84
> +#define AM33_SIGCONTEXT_MDRQ 88
> +#define AM33_SIGCONTEXT_SP 92
> +#define AM33_SIGCONTEXT_EPSW 96
> +#define AM33_SIGCONTEXT_PC 100
> +#define AM33_SIGCONTEXT_FPUCONTEXT 104
> +
> +
> +static void
> +am33_linux_sigframe_cache_init (const struct tramp_frame *self,
> + struct frame_info *next_frame,
> + struct trad_frame_cache *this_cache,
> + CORE_ADDR func)
> +{
> + CORE_ADDR sc_base, fpubase;
> + int i;
>
> + sc_base = frame_unwind_register_unsigned (next_frame, E_SP_REGNUM);
> + if (self == &am33_linux_sigframe)
> + {
> + sc_base += 8;
> + }
> + else
> + {
> + sc_base += 12;
> + sc_base = get_frame_memory_unsigned (next_frame, sc_base, 4);
> + sc_base += 20;
> + }
> +
> + trad_frame_set_reg_addr (this_cache, E_D0_REGNUM,
> + sc_base + AM33_SIGCONTEXT_D0);
> + trad_frame_set_reg_addr (this_cache, E_D1_REGNUM,
> + sc_base + AM33_SIGCONTEXT_D1);
> + trad_frame_set_reg_addr (this_cache, E_D2_REGNUM,
> + sc_base + AM33_SIGCONTEXT_D2);
> + trad_frame_set_reg_addr (this_cache, E_D3_REGNUM,
> + sc_base + AM33_SIGCONTEXT_D3);
> +
> + trad_frame_set_reg_addr (this_cache, E_A0_REGNUM,
> + sc_base + AM33_SIGCONTEXT_A0);
> + trad_frame_set_reg_addr (this_cache, E_A1_REGNUM,
> + sc_base + AM33_SIGCONTEXT_A1);
> + trad_frame_set_reg_addr (this_cache, E_A2_REGNUM,
> + sc_base + AM33_SIGCONTEXT_A2);
> + trad_frame_set_reg_addr (this_cache, E_A3_REGNUM,
> + sc_base + AM33_SIGCONTEXT_A3);
> +
> + trad_frame_set_reg_addr (this_cache, E_E0_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E0);
> + trad_frame_set_reg_addr (this_cache, E_E1_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E1);
> + trad_frame_set_reg_addr (this_cache, E_E2_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E2);
> + trad_frame_set_reg_addr (this_cache, E_E3_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E3);
> + trad_frame_set_reg_addr (this_cache, E_E4_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E4);
> + trad_frame_set_reg_addr (this_cache, E_E5_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E5);
> + trad_frame_set_reg_addr (this_cache, E_E6_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E6);
> + trad_frame_set_reg_addr (this_cache, E_E7_REGNUM,
> + sc_base + AM33_SIGCONTEXT_E7);
> +
> + trad_frame_set_reg_addr (this_cache, E_LAR_REGNUM,
> + sc_base + AM33_SIGCONTEXT_LAR);
> + trad_frame_set_reg_addr (this_cache, E_LIR_REGNUM,
> + sc_base + AM33_SIGCONTEXT_LIR);
> + trad_frame_set_reg_addr (this_cache, E_MDR_REGNUM,
> + sc_base + AM33_SIGCONTEXT_MDR);
> + trad_frame_set_reg_addr (this_cache, E_MCVF_REGNUM,
> + sc_base + AM33_SIGCONTEXT_MCVF);
> + trad_frame_set_reg_addr (this_cache, E_MCRL_REGNUM,
> + sc_base + AM33_SIGCONTEXT_MCRL);
> + trad_frame_set_reg_addr (this_cache, E_MDRQ_REGNUM,
> + sc_base + AM33_SIGCONTEXT_MDRQ);
> +
> + trad_frame_set_reg_addr (this_cache, E_SP_REGNUM,
> + sc_base + AM33_SIGCONTEXT_SP);
> + trad_frame_set_reg_addr (this_cache, E_PSW_REGNUM,
> + sc_base + AM33_SIGCONTEXT_EPSW);
> + trad_frame_set_reg_addr (this_cache, E_PC_REGNUM,
> + sc_base + AM33_SIGCONTEXT_PC);
> +
> + fpubase = get_frame_memory_unsigned (next_frame,
> + sc_base + AM33_SIGCONTEXT_FPUCONTEXT, 4);
> + if (fpubase)
> + {
> + for (i = 0; i < 32; i++)
> + {
> + trad_frame_set_reg_addr (this_cache, E_FS0_REGNUM + i,
> + fpubase + 4 * i);
> + }
> + trad_frame_set_reg_addr (this_cache, E_FPCR_REGNUM, fpubase + 4 * 32);
> + }
> +
> + trad_frame_set_id (this_cache, frame_id_build (sc_base, func));
> +}
> +
> /* AM33 Linux osabi has been recognized.
> Now's our chance to register our corefile handling. */
>
> @@ -478,6 +714,9 @@ am33_linux_init_osabi (struct gdbarch_in
> am33_regset_from_core_section);
> set_solib_svr4_fetch_link_map_offsets
> (gdbarch, svr4_ilp32_fetch_link_map_offsets);
> +
> + tramp_frame_prepend_unwinder (gdbarch, &am33_linux_sigframe);
> + tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe);
> }
>
> void
>
>
More information about the Gdb-patches
mailing list