aboutsummaryrefslogtreecommitdiff
path: root/gdb/m68k-tdep.c
diff options
context:
space:
mode:
authorPhilippe De Muyter <phdm@macqel.be>2000-03-24 11:12:11 +0000
committerPhilippe De Muyter <phdm@macqel.be>2000-03-24 11:12:11 +0000
commit89c3b6d36d48e22b272c335ef9b13bc5ec04c67c (patch)
tree5f69f464cdf1f3b31e969b34e1be82dd70a3dd82 /gdb/m68k-tdep.c
parentb9deaee7a0c35ded5c899c686db412c6587be1de (diff)
downloadgdb-89c3b6d36d48e22b272c335ef9b13bc5ec04c67c.zip
gdb-89c3b6d36d48e22b272c335ef9b13bc5ec04c67c.tar.gz
gdb-89c3b6d36d48e22b272c335ef9b13bc5ec04c67c.tar.bz2
* 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.
Diffstat (limited to 'gdb/m68k-tdep.c')
-rw-r--r--gdb/m68k-tdep.c259
1 files changed, 162 insertions, 97 deletions
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;