aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/arm-linux-tdep.c9
-rw-r--r--gdb/arm-tdep.c20
-rw-r--r--gdb/arm-tdep.h3
4 files changed, 25 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 42b8b93..f6050a9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
2011-04-07 Yao Qi <yao@codesourcery.com>
+ * arm-linux-tdep.c (arm_linux_copy_svc): Remove parameters INSN
+ and TO.
+ * arm-tdep.c (cleanup_svc): Handle variable instruction size.
+ (arm_copy_svc): Remove parameters INSN and TO.
+ (decode_svc_copro): Update caller.
+ * arm-tdep.h (struct displaced_step_closure): Remove parameters
+ from function pointer `copy_svc_os'.
+
+2011-04-07 Yao Qi <yao@codesourcery.com>
+
* arm-tdep.c (cleanup_branch): Set a correct return address in
LR for ARM and Thumb.
diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c
index 9db125e..b7ff5ec 100644
--- a/gdb/arm-linux-tdep.c
+++ b/gdb/arm-linux-tdep.c
@@ -795,8 +795,8 @@ arm_linux_cleanup_svc (struct gdbarch *gdbarch,
}
static int
-arm_linux_copy_svc (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
- struct regcache *regs, struct displaced_step_closure *dsc)
+arm_linux_copy_svc (struct gdbarch *gdbarch, struct regcache *regs,
+ struct displaced_step_closure *dsc)
{
CORE_ADDR return_to = 0;
@@ -805,10 +805,6 @@ arm_linux_copy_svc (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
int is_sigreturn = 0;
int is_thumb;
- if (debug_displaced)
- fprintf_unfiltered (gdb_stdlog, "displaced: copying Linux svc insn %.8lx\n",
- (unsigned long) insn);
-
frame = get_current_frame ();
is_sigreturn = arm_linux_sigreturn_return_addr(frame, svc_number,
@@ -862,7 +858,6 @@ arm_linux_copy_svc (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
Cleanup: if pc lands in scratch space, pc <- insn_addr + 4
else leave pc alone. */
- dsc->modinsn[0] = insn;
dsc->cleanup = &arm_linux_cleanup_svc;
/* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 024191b..f33dc10 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -6358,7 +6358,7 @@ static void
cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
struct displaced_step_closure *dsc)
{
- CORE_ADDR resume_addr = dsc->insn_addr + 4;
+ CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
if (debug_displaced)
fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
@@ -6368,12 +6368,9 @@ cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
}
static int
-copy_svc (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
+copy_svc (struct gdbarch *gdbarch, uint32_t insn,
struct regcache *regs, struct displaced_step_closure *dsc)
{
- /* Allow OS-specific code to override SVC handling. */
- if (dsc->u.svc.copy_svc_os)
- return dsc->u.svc.copy_svc_os (gdbarch, insn, to, regs, dsc);
if (debug_displaced)
fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
@@ -6385,12 +6382,19 @@ copy_svc (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
dsc->modinsn[0] = insn;
- dsc->cleanup = &cleanup_svc;
/* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
instruction. */
dsc->wrote_to_pc = 1;
- return 0;
+ /* Allow OS-specific code to override SVC handling. */
+ if (dsc->u.svc.copy_svc_os)
+ return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
+ else
+ {
+ dsc->cleanup = &cleanup_svc;
+ return 0;
+ }
+
}
/* Copy undefined instructions. */
@@ -6843,7 +6847,7 @@ decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
return copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
else if ((op1 & 0x30) == 0x30)
- return copy_svc (gdbarch, insn, to, regs, dsc);
+ return copy_svc (gdbarch, insn, regs, dsc);
else
return copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
}
diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h
index f047351..fe27c7f 100644
--- a/gdb/arm-tdep.h
+++ b/gdb/arm-tdep.h
@@ -258,8 +258,7 @@ struct displaced_step_closure
{
/* If non-NULL, override generic SVC handling (e.g. for a particular
OS). */
- int (*copy_svc_os) (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
- struct regcache *regs,
+ int (*copy_svc_os) (struct gdbarch *gdbarch, struct regcache *regs,
struct displaced_step_closure *dsc);
} svc;
} u;