aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Carrez <stcarrez@nerim.fr>2000-08-29 19:12:27 +0000
committerStephane Carrez <stcarrez@nerim.fr>2000-08-29 19:12:27 +0000
commit184651e316776835122a25af307c2e1576d30a88 (patch)
tree52f0584afc0d4a88ff8bd35f87e1e9c54b115750
parent9a8f29e36f63f773d2a8af0265e3173e6ed5a6e8 (diff)
downloadgdb-184651e316776835122a25af307c2e1576d30a88.zip
gdb-184651e316776835122a25af307c2e1576d30a88.tar.gz
gdb-184651e316776835122a25af307c2e1576d30a88.tar.bz2
Fix stack offset correction for 68hc11
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/m68hc11-tdep.c37
2 files changed, 37 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0c9f2e9..90a5c96 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,16 @@
+2000-08-29 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * m68hc11-tdep.c (stack_correction): New variable for stack offset
+ correction (1 for 68hc11, 0 for 68hc12).
+ (m68hc11_saved_pc_after_call): Use it.
+ (m68hc11_frame_chain): Likewise.
+ (m68hc11_frame_init_saved_regs): Likewise.
+ (m68hc11_init_extra_frame_info): Likewise.
+ (m68hc11_push_return_address): Likewise.
+ (m68hc11_push_arguments): Struct address must be corrected by
+ applying the stack_correction offset.
+ (m68hc11_store_struct_return): Likewise.
+
2000-08-28 Kevin Buettner <kevinb@redhat.com>
* gdbserver/utils.c (error, fatal): Protoize.
diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
index 6f8db5f..7b19979 100644
--- a/gdb/m68hc11-tdep.c
+++ b/gdb/m68hc11-tdep.c
@@ -120,6 +120,12 @@ static int soft_min_addr;
static int soft_max_addr;
static int soft_reg_initialized = 0;
+/* Stack pointer correction value. For 68hc11, the stack pointer points
+ to the next push location. An offset of 1 must be applied to obtain
+ the address where the last value is saved. For 68hc12, the stack
+ pointer points to the last value pushed. No offset is necessary. */
+static int stack_correction = 1;
+
/* Look in the symbol table for the address of a pseudo register
in memory. If we don't find it, pretend the register is not used
and not available. */
@@ -275,7 +281,7 @@ m68hc11_saved_pc_after_call (struct frame_info *frame)
{
CORE_ADDR addr;
- addr = read_register (HARD_SP_REGNUM) + 1;
+ addr = read_register (HARD_SP_REGNUM) + stack_correction;
addr &= 0x0ffff;
return read_memory_integer (addr, 2) & 0x0FFFF;
}
@@ -618,7 +624,7 @@ m68hc11_frame_chain (struct frame_info *frame)
return (CORE_ADDR) 0;
}
- addr = frame->frame + frame->extra_info->size + 1 - 2;
+ addr = frame->frame + frame->extra_info->size + stack_correction - 2;
addr = read_memory_unsigned_integer (addr, 2) & 0x0FFFF;
if (addr == 0)
{
@@ -637,7 +643,8 @@ static void
m68hc11_frame_init_saved_regs (struct frame_info *fi)
{
CORE_ADDR pc;
-
+ CORE_ADDR addr;
+
if (fi->saved_regs == NULL)
frame_saved_regs_zalloc (fi);
else
@@ -647,8 +654,9 @@ m68hc11_frame_init_saved_regs (struct frame_info *fi)
m68hc11_guess_from_prologue (pc, fi->frame, &pc, &fi->extra_info->size,
fi->saved_regs);
- fi->saved_regs[SOFT_FP_REGNUM] = fi->frame + fi->extra_info->size + 1 - 2;
- fi->saved_regs[HARD_SP_REGNUM] = fi->frame + fi->extra_info->size + 1;
+ addr = fi->frame + fi->extra_info->size + stack_correction;
+ fi->saved_regs[SOFT_FP_REGNUM] = addr - 2;
+ fi->saved_regs[HARD_SP_REGNUM] = addr;
fi->saved_regs[HARD_PC_REGNUM] = fi->saved_regs[HARD_SP_REGNUM];
}
@@ -671,7 +679,7 @@ m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
}
else
{
- addr = fi->frame + fi->extra_info->size + 1;
+ addr = fi->frame + fi->extra_info->size + stack_correction;
addr = read_memory_unsigned_integer (addr, 2) & 0x0ffff;
fi->extra_info->return_pc = addr;
#if 0
@@ -750,7 +758,10 @@ m68hc11_push_arguments (int nargs,
first_stack_argnum = 0;
if (struct_return)
{
- write_register (HARD_D_REGNUM, struct_addr);
+ /* The struct is allocated on the stack and gdb used the stack
+ pointer for the address of that struct. We must apply the
+ stack offset on the address. */
+ write_register (HARD_D_REGNUM, struct_addr + stack_correction);
}
else if (nargs > 0)
{
@@ -777,7 +788,7 @@ m68hc11_push_arguments (int nargs,
}
sp -= stack_alloc;
- stack_offset = 1;
+ stack_offset = stack_correction;
for (argnum = first_stack_argnum; argnum < nargs; argnum++)
{
type = VALUE_TYPE (args[argnum]);
@@ -808,7 +819,10 @@ m68hc11_register_virtual_type (int reg_nr)
static void
m68hc11_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
{
- write_register (HARD_D_REGNUM, addr);
+ /* The struct address computed by gdb is on the stack.
+ It uses the stack pointer so we must apply the stack
+ correction offset. */
+ write_register (HARD_D_REGNUM, addr + stack_correction);
}
static void
@@ -878,10 +892,7 @@ m68hc11_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
pc = read_register (HARD_PC_REGNUM);
sp -= 2;
store_unsigned_integer (valbuf, 2, pc);
- write_memory (sp + 1, valbuf, 2);
-#if 0
- write_register (HARD_PC_REGNUM, CALL_DUMMY_ADDRESS ());
-#endif
+ write_memory (sp + stack_correction, valbuf, 2);
return sp;
}