diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/arm-linux-tdep.c | 9 | ||||
-rw-r--r-- | gdb/arm-tdep.c | 20 | ||||
-rw-r--r-- | gdb/arm-tdep.h | 3 |
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; |