diff options
-rw-r--r-- | gdb/ChangeLog | 19 | ||||
-rw-r--r-- | gdb/config/m68k/tm-delta68.h | 11 | ||||
-rw-r--r-- | gdb/m68k-tdep.c | 259 |
3 files changed, 192 insertions, 97 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c1dcbaf..5312fd9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +Thu Mar 23 13:18:26 2000 Philippe De Muyter <phdm@macqel.be> + + * m68k-tdep.c (P_LINKL_FP, P_LINKW_FP): Macros renamed from P_LINK_L + and P_LINK_W. + (P_PEA_FP, P_MOVL_SP_FP): New macros. + (P_MOVL, P_LEAL, P_MOVML): Macros renamed from P_MOV_L, P_LEA_L and + P_MOVM_L. + (altos_skip_prologue, isi_skip_prologue): Use P_* macros, not octal + constants. + (delta68_in_sigtramp): New function. + (delta68_frame_args_address, delta68_frame_saved_pc): Ditto. + (m68k_skip_prologue): Use P_* macros, not hex constants. + (m68k_find_saved_regs): Do not expect a fixed sequence of register save + instructions, but accept them in any order; use P_* macros, not octal + or hex constants; recognize also `fmovemx to (fp + displacement)' and + `moveml to (fp + displacement)'. + * m68/tm-delta68.h (IN_SIGTRAMP): New macro. + (FRAME_SAVED_PC, FRAME_ARGS_ADDRESS): Ditto. + Fri Mar 24 13:44:57 2000 Andrew Cagney <cagney@b1.cygnus.com> * MAINTAINERS: Add Fernando Nasser to testsuite maintainers. diff --git a/gdb/config/m68k/tm-delta68.h b/gdb/config/m68k/tm-delta68.h index 260f733..97953bd 100644 --- a/gdb/config/m68k/tm-delta68.h +++ b/gdb/config/m68k/tm-delta68.h @@ -92,3 +92,14 @@ extern int delta68_frame_num_args PARAMS ((struct frame_info * fi)); #undef EXTRACT_STRUCT_VALUE_ADDRESS #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF)\ (*(CORE_ADDR *)((char*)(REGBUF) + 8 * 4)) + +extern int delta68_in_sigtramp PARAMS ((CORE_ADDR pc, char * name)); +#define IN_SIGTRAMP(pc,name) delta68_in_sigtramp (pc, name) + +extern CORE_ADDR delta68_frame_saved_pc PARAMS ((struct frame_info * fi)); +#undef FRAME_SAVED_PC +#define FRAME_SAVED_PC(fi) delta68_frame_saved_pc (fi) + +extern CORE_ADDR delta68_frame_args_address PARAMS ((struct frame_info * fi)); +#undef FRAME_ARGS_ADDRESS +#define FRAME_ARGS_ADDRESS(fi) delta68_frame_args_address (fi) diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index 475e909..a6cecfe 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -27,6 +27,18 @@ #include "inferior.h" +#define P_LINKL_FP 0x480e +#define P_LINKW_FP 0x4e56 +#define P_PEA_FP 0x4856 +#define P_MOVL_SP_FP 0x2c4f +#define P_MOVL 0x207c +#define P_JSR 0x4eb9 +#define P_BSR 0x61ff +#define P_LEAL 0x43fb +#define P_MOVML 0x48ef +#define P_FMOVM 0xf237 +#define P_TRAP 0x4e40 + /* The only reason this is here is the tm-altos.h reference below. It was moved back here from tm-m68k.h. FIXME? */ @@ -35,9 +47,9 @@ altos_skip_prologue (pc) CORE_ADDR pc; { register int op = read_memory_integer (pc, 2); - if (op == 0047126) + if (op == P_LINKW_FP) pc += 4; /* Skip link #word */ - else if (op == 0044016) + else if (op == P_LINKL_FP) pc += 6; /* Skip link #long */ /* Not sure why branches are here. */ /* From tm-isi.h, tm-altos.h */ @@ -58,9 +70,9 @@ isi_skip_prologue (pc) CORE_ADDR pc; { register int op = read_memory_integer (pc, 2); - if (op == 0047126) + if (op == P_LINKW_FP) pc += 4; /* Skip link #word */ - else if (op == 0044016) + else if (op == P_LINKL_FP) pc += 6; /* Skip link #long */ /* Not sure why branches are here. */ /* From tm-isi.h, tm-altos.h */ @@ -73,6 +85,41 @@ isi_skip_prologue (pc) return pc; } +int +delta68_in_sigtramp (pc, name) + CORE_ADDR pc; + char *name; +{ + return strcmp (name, "_sigcode") == 0; +} + +CORE_ADDR +delta68_frame_args_address (frame_info) + struct frame_info * frame_info; +{ + /* we assume here that the only frameless functions are the system calls + or other functions who do not put anything on the stack. */ + if (frame_info->signal_handler_caller) + return frame_info->frame + 12; + else if (frameless_look_for_prologue (frame_info)) + { + /* Check for an interrupted system call */ + if (frame_info->next && frame_info->next->signal_handler_caller) + return frame_info->next->frame + 16; + else + return frame_info->frame + 4; + } + else + return frame_info->frame; +} + +CORE_ADDR +delta68_frame_saved_pc (frame_info) + struct frame_info * frame_info; +{ + return read_memory_integer (delta68_frame_args_address (frame_info) + 4, 4); +} + /* Return number of args passed to a frame. Can return -1, meaning no way to tell. */ @@ -246,16 +293,6 @@ m68k_pop_frame () */ -#define P_LINK_L 0x480e -#define P_LINK_W 0x4e56 -#define P_MOV_L 0x207c -#define P_JSR 0x4eb9 -#define P_BSR 0x61ff -#define P_LEA_L 0x43fb -#define P_MOVM_L 0x48ef -#define P_FMOVM 0xf237 -#define P_TRAP 0x4e40 - CORE_ADDR m68k_skip_prologue (ip) CORE_ADDR ip; @@ -275,30 +312,20 @@ m68k_skip_prologue (ip) op = read_memory_integer (ip, 2); op &= 0xFFFF; - if (op == P_LINK_W) - { - ip += 4; /* Skip link.w */ - } - else if (op == 0x4856) + if (op == P_LINKW_FP) + ip += 4; /* Skip link.w */ + else if (op == P_PEA_FP) ip += 2; /* Skip pea %fp */ - else if (op == 0x2c4f) + else if (op == P_MOVL_SP_FP) ip += 2; /* Skip move.l %sp, %fp */ - else if (op == P_LINK_L) - { - ip += 6; /* Skip link.l */ - } - else if (op == P_MOVM_L) - { - ip += 6; /* Skip movm.l */ - } + else if (op == P_LINKL_FP) + ip += 6; /* Skip link.l */ + else if (op == P_MOVML) + ip += 6; /* Skip movm.l */ else if (op == P_FMOVM) - { - ip += 10; /* Skip fmovm */ - } + ip += 10; /* Skip fmovm */ else - { - break; /* Found unknown code, bail out. */ - } + break; /* Found unknown code, bail out. */ } return (ip); } @@ -335,26 +362,31 @@ m68k_find_saved_regs (frame_info, saved_regs) { pc = get_pc_function_start ((frame_info)->pc); - if (0x4856 == read_memory_integer (pc, 2) - && 0x2c4f == read_memory_integer (pc + 2, 2)) + nextinsn = read_memory_integer (pc, 2); + if (P_PEA_FP == nextinsn + && P_MOVL_SP_FP == read_memory_integer (pc + 2, 2)) { - /* - pea %fp + /* pea %fp move.l %sp, %fp */ - - pc += 4; next_addr = frame_info->frame; + pc += 4; } - else if (044016 == read_memory_integer (pc, 2)) + else if (P_LINKL_FP == nextinsn) /* link.l %fp */ /* Find the address above the saved regs using the amount of storage from the link instruction. */ - next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 4), pc += 4; - else if (047126 == read_memory_integer (pc, 2)) + { + next_addr = (frame_info)->frame + read_memory_integer (pc + 2, 4); + pc += 6; + } + else if (P_LINKW_FP == nextinsn) /* link.w %fp */ /* Find the address above the saved regs using the amount of storage from the link instruction. */ - next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 2), pc += 2; + { + next_addr = (frame_info)->frame + read_memory_integer (pc + 2, 2); + pc += 4; + } else goto lose; @@ -362,66 +394,99 @@ m68k_find_saved_regs (frame_info, saved_regs) if ((0177777 & read_memory_integer (pc, 2)) == 0157774) next_addr += read_memory_integer (pc += 2, 4), pc += 4; } - regmask = read_memory_integer (pc + 2, 2); - /* Here can come an fmovem. Check for it. */ - nextinsn = 0xffff & read_memory_integer (pc, 2); - if (0xf227 == nextinsn - && (regmask & 0xff00) == 0xe000) + for ( ; ; ) { - pc += 4; /* Regmask's low bit is for register fp7, the first pushed */ - for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1) - if (regmask & 1) - saved_regs->regs[regnum] = (next_addr -= 12); + nextinsn = 0xffff & read_memory_integer (pc, 2); regmask = read_memory_integer (pc + 2, 2); - } - - /* next should be a moveml to (sp) or -(sp) or a movl r,-(sp) */ - if (0044327 == read_memory_integer (pc, 2)) - { - pc += 4; /* Regmask's low bit is for register 0, the first written */ - for (regnum = 0; regnum < 16; regnum++, regmask >>= 1) - if (regmask & 1) - saved_regs->regs[regnum] = (next_addr += 4) - 4; - } - else if (0044347 == read_memory_integer (pc, 2)) - { - pc += 4; /* Regmask's low bit is for register 15, the first pushed */ - for (regnum = 15; regnum >= 0; regnum--, regmask >>= 1) - if (regmask & 1) - saved_regs->regs[regnum] = (next_addr -= 4); - } - else if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2))) - { - regnum = 0xf & read_memory_integer (pc, 2); - pc += 2; - saved_regs->regs[regnum] = (next_addr -= 4); - /* gcc, at least, may use a pair of movel instructions when saving - exactly 2 registers. */ - if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2))) + /* fmovemx to -(sp) */ + if (0xf227 == nextinsn && (regmask & 0xff00) == 0xe000) { - regnum = 0xf & read_memory_integer (pc, 2); - pc += 2; + /* Regmask's low bit is for register fp7, the first pushed */ + for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1) + if (regmask & 1) + saved_regs->regs[regnum] = (next_addr -= 12); + pc += 4; + } + /* fmovemx to (fp + displacement) */ + else if (0171056 == nextinsn && (regmask & 0xff00) == 0xf000) + { + register CORE_ADDR addr; + + addr = (frame_info)->frame + read_memory_integer (pc + 4, 2); + /* Regmask's low bit is for register fp7, the first pushed */ + for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1) + if (regmask & 1) + { + saved_regs->regs[regnum] = addr; + addr += 12; + } + pc += 6; + } + /* moveml to (sp) */ + else if (0044327 == nextinsn) + { + /* Regmask's low bit is for register 0, the first written */ + for (regnum = 0; regnum < 16; regnum++, regmask >>= 1) + if (regmask & 1) + { + saved_regs->regs[regnum] = next_addr; + next_addr += 4; + } + pc += 4; + } + /* moveml to (fp + displacement) */ + else if (0044356 == nextinsn) + { + register CORE_ADDR addr; + + addr = (frame_info)->frame + read_memory_integer (pc + 4, 2); + /* Regmask's low bit is for register 0, the first written */ + for (regnum = 0; regnum < 16; regnum++, regmask >>= 1) + if (regmask & 1) + { + saved_regs->regs[regnum] = addr; + addr += 4; + } + pc += 6; + } + /* moveml to -(sp) */ + else if (0044347 == nextinsn) + { + /* Regmask's low bit is for register 15, the first pushed */ + for (regnum = 16; --regnum >= 0; regmask >>= 1) + if (regmask & 1) + saved_regs->regs[regnum] = (next_addr -= 4); + pc += 4; + } + /* movl r,-(sp) */ + else if (0x2f00 == (0xfff0 & nextinsn)) + { + regnum = 0xf & nextinsn; saved_regs->regs[regnum] = (next_addr -= 4); + pc += 2; } + /* fmovemx to index of sp */ + else if (0xf236 == nextinsn && (regmask & 0xff00) == 0xf000) + { + /* Regmask's low bit is for register fp0, the first written */ + for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1) + if (regmask & 1) + { + saved_regs->regs[regnum] = next_addr; + next_addr += 12; + } + pc += 10; + } + /* clrw -(sp); movw ccr,-(sp) */ + else if (0x4267 == nextinsn && 0x42e7 == regmask) + { + saved_regs->regs[PS_REGNUM] = (next_addr -= 4); + pc += 4; + } + else + break; } - - /* fmovemx to index of sp may follow. */ - regmask = read_memory_integer (pc + 2, 2); - nextinsn = 0xffff & read_memory_integer (pc, 2); - if (0xf236 == nextinsn - && (regmask & 0xff00) == 0xf000) - { - pc += 10; /* Regmask's low bit is for register fp0, the first written */ - for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1) - if (regmask & 1) - saved_regs->regs[regnum] = (next_addr += 12) - 12; - regmask = read_memory_integer (pc + 2, 2); - } - - /* clrw -(sp); movw ccr,-(sp) may follow. */ - if (0x426742e7 == read_memory_integer (pc, 4)) - saved_regs->regs[PS_REGNUM] = (next_addr -= 4); lose:; saved_regs->regs[SP_REGNUM] = (frame_info)->frame + 8; saved_regs->regs[FP_REGNUM] = (frame_info)->frame; |