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'.
This commit is contained in:
Yao Qi 2011-04-07 04:18:02 +00:00
parent 8c8dba6d3d
commit bd18283a08
4 changed files with 25 additions and 17 deletions

View File

@ -1,3 +1,13 @@
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

View File

@ -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

View File

@ -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;
/* 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. */
}

View File

@ -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;