diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2002-11-19 23:14:45 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2002-11-19 23:14:45 +0000 |
commit | 0a595803234985c4e8386306f21c2f2720d2e8c7 (patch) | |
tree | bdefadc3ad719a8ae6b87179a562d842aed53bd7 /gdb/m68klinux-nat.c | |
parent | 3643cf46d625e4ffdcc3d27f0bedcfa09cfda0a7 (diff) | |
download | gdb-0a595803234985c4e8386306f21c2f2720d2e8c7.zip gdb-0a595803234985c4e8386306f21c2f2720d2e8c7.tar.gz gdb-0a595803234985c4e8386306f21c2f2720d2e8c7.tar.bz2 |
* m68klinux-nat.c (IS_SIGTRAMP, IS_RT_SIGTRAMP)
(m68k_linux_in_sigtramp, SIGCONTEXT_PC_OFFSET)
(UCONTEXT_PC_OFFSET, m68k_linux_sigtramp_saved_pc)
(m68k_linux_frame_saved_pc): Move to ...
* m68klinux-tdep.c: ... here. New file.
* Makefile.in (m68klinux-tdep.o): Add dependencies.
* config/m68k/linux.mt (TDEPFILES): Add m68klinux-tdep.o.
Diffstat (limited to 'gdb/m68klinux-nat.c')
-rw-r--r-- | gdb/m68klinux-nat.c | 97 |
1 files changed, 0 insertions, 97 deletions
diff --git a/gdb/m68klinux-nat.c b/gdb/m68klinux-nat.c index b2d3a6f..b206852 100644 --- a/gdb/m68klinux-nat.c +++ b/gdb/m68klinux-nat.c @@ -594,103 +594,6 @@ kernel_u_size (void) return (sizeof (struct user)); } -/* Check whether insn1 and insn2 are parts of a signal trampoline. */ - -#define IS_SIGTRAMP(insn1, insn2) \ - (/* addaw #20,sp; moveq #119,d0; trap #0 */ \ - (insn1 == 0xdefc0014 && insn2 == 0x70774e40) \ - /* moveq #119,d0; trap #0 */ \ - || insn1 == 0x70774e40) - -#define IS_RT_SIGTRAMP(insn1, insn2) \ - (/* movel #173,d0; trap #0 */ \ - (insn1 == 0x203c0000 && insn2 == 0x00ad4e40) \ - /* moveq #82,d0; notb d0; trap #0 */ \ - || (insn1 == 0x70524600 && (insn2 >> 16) == 0x4e40)) - -/* Return non-zero if PC points into the signal trampoline. For the sake - of m68k_linux_frame_saved_pc we also distinguish between non-RT and RT - signal trampolines. */ - -int -m68k_linux_in_sigtramp (CORE_ADDR pc) -{ - CORE_ADDR sp; - char buf[12]; - unsigned long insn0, insn1, insn2; - - if (read_memory_nobpt (pc - 4, buf, sizeof (buf))) - return 0; - insn1 = extract_unsigned_integer (buf + 4, 4); - insn2 = extract_unsigned_integer (buf + 8, 4); - if (IS_SIGTRAMP (insn1, insn2)) - return 1; - if (IS_RT_SIGTRAMP (insn1, insn2)) - return 2; - - insn0 = extract_unsigned_integer (buf, 4); - if (IS_SIGTRAMP (insn0, insn1)) - return 1; - if (IS_RT_SIGTRAMP (insn0, insn1)) - return 2; - - insn0 = (insn0 << 16) | (insn1 >> 16); - insn1 = (insn1 << 16) | (insn2 >> 16); - if (IS_SIGTRAMP (insn0, insn1)) - return 1; - if (IS_RT_SIGTRAMP (insn0, insn1)) - return 2; - - return 0; -} - -/* Offset to saved PC in sigcontext, from <asm/sigcontext.h>. */ -#define SIGCONTEXT_PC_OFFSET 26 - -/* Offset to saved PC in ucontext, from <asm/ucontext.h>. */ -#define UCONTEXT_PC_OFFSET 88 - -/* Get saved user PC for sigtramp from sigcontext or ucontext. */ - -static CORE_ADDR -m68k_linux_sigtramp_saved_pc (struct frame_info *frame) -{ - CORE_ADDR sigcontext_addr; - char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT]; - int ptrbytes = TARGET_PTR_BIT / TARGET_CHAR_BIT; - int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT; - - /* Get sigcontext address, it is the third parameter on the stack. */ - if (frame->next) - sigcontext_addr = read_memory_integer (FRAME_ARGS_ADDRESS (frame->next) - + FRAME_ARGS_SKIP - + sigcontext_offs, - ptrbytes); - else - sigcontext_addr = read_memory_integer (read_register (SP_REGNUM) - + sigcontext_offs, - ptrbytes); - - /* Don't cause a memory_error when accessing sigcontext in case the - stack layout has changed or the stack is corrupt. */ - if (m68k_linux_in_sigtramp (frame->pc) == 2) - target_read_memory (sigcontext_addr + UCONTEXT_PC_OFFSET, buf, ptrbytes); - else - target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes); - return extract_unsigned_integer (buf, ptrbytes); -} - -/* Return the saved program counter for FRAME. */ - -CORE_ADDR -m68k_linux_frame_saved_pc (struct frame_info *frame) -{ - if ((get_frame_type (frame) == SIGTRAMP_FRAME)) - return m68k_linux_sigtramp_saved_pc (frame); - - return read_memory_integer (frame->frame + 4, 4); -} - /* Register that we are able to handle GNU/Linux ELF core file formats. */ |