mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-18 21:34:13 +08:00
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:
@ -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>
|
2011-04-07 Yao Qi <yao@codesourcery.com>
|
||||||
|
|
||||||
* arm-tdep.c (cleanup_branch): Set a correct return address in
|
* arm-tdep.c (cleanup_branch): Set a correct return address in
|
||||||
|
@ -795,8 +795,8 @@ arm_linux_cleanup_svc (struct gdbarch *gdbarch,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
arm_linux_copy_svc (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
|
arm_linux_copy_svc (struct gdbarch *gdbarch, struct regcache *regs,
|
||||||
struct regcache *regs, struct displaced_step_closure *dsc)
|
struct displaced_step_closure *dsc)
|
||||||
{
|
{
|
||||||
CORE_ADDR return_to = 0;
|
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_sigreturn = 0;
|
||||||
int is_thumb;
|
int is_thumb;
|
||||||
|
|
||||||
if (debug_displaced)
|
|
||||||
fprintf_unfiltered (gdb_stdlog, "displaced: copying Linux svc insn %.8lx\n",
|
|
||||||
(unsigned long) insn);
|
|
||||||
|
|
||||||
frame = get_current_frame ();
|
frame = get_current_frame ();
|
||||||
|
|
||||||
is_sigreturn = arm_linux_sigreturn_return_addr(frame, svc_number,
|
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
|
Cleanup: if pc lands in scratch space, pc <- insn_addr + 4
|
||||||
else leave pc alone. */
|
else leave pc alone. */
|
||||||
|
|
||||||
dsc->modinsn[0] = insn;
|
|
||||||
|
|
||||||
dsc->cleanup = &arm_linux_cleanup_svc;
|
dsc->cleanup = &arm_linux_cleanup_svc;
|
||||||
/* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
|
/* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
|
||||||
|
@ -6358,7 +6358,7 @@ static void
|
|||||||
cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
|
cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
|
||||||
struct displaced_step_closure *dsc)
|
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)
|
if (debug_displaced)
|
||||||
fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
|
fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
|
||||||
@ -6368,12 +6368,9 @@ cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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)
|
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)
|
if (debug_displaced)
|
||||||
fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
|
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->modinsn[0] = insn;
|
||||||
|
|
||||||
dsc->cleanup = &cleanup_svc;
|
|
||||||
/* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
|
/* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
|
||||||
instruction. */
|
instruction. */
|
||||||
dsc->wrote_to_pc = 1;
|
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. */
|
/* 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)
|
else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
|
||||||
return copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
|
return copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
|
||||||
else if ((op1 & 0x30) == 0x30)
|
else if ((op1 & 0x30) == 0x30)
|
||||||
return copy_svc (gdbarch, insn, to, regs, dsc);
|
return copy_svc (gdbarch, insn, regs, dsc);
|
||||||
else
|
else
|
||||||
return copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
|
return copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
|
||||||
}
|
}
|
||||||
|
@ -258,8 +258,7 @@ struct displaced_step_closure
|
|||||||
{
|
{
|
||||||
/* If non-NULL, override generic SVC handling (e.g. for a particular
|
/* If non-NULL, override generic SVC handling (e.g. for a particular
|
||||||
OS). */
|
OS). */
|
||||||
int (*copy_svc_os) (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
|
int (*copy_svc_os) (struct gdbarch *gdbarch, struct regcache *regs,
|
||||||
struct regcache *regs,
|
|
||||||
struct displaced_step_closure *dsc);
|
struct displaced_step_closure *dsc);
|
||||||
} svc;
|
} svc;
|
||||||
} u;
|
} u;
|
||||||
|
Reference in New Issue
Block a user