summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuslan Bukin <br@FreeBSD.org>2016-10-26 14:26:45 +0000
committerRuslan Bukin <br@FreeBSD.org>2016-10-26 14:26:45 +0000
commit1d290950b2172ee76aed87b9ebf6080ee363e7fd (patch)
tree81984373152ed91f58cf34d114767eb1b9f75fd4
parent87e1355ba56252739df77a1247624088980220c1 (diff)
Notes
-rw-r--r--lib/libproc/proc_bkpt.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/libproc/proc_bkpt.c b/lib/libproc/proc_bkpt.c
index 4a100cbbd4eb4..3167206af2049 100644
--- a/lib/libproc/proc_bkpt.c
+++ b/lib/libproc/proc_bkpt.c
@@ -68,6 +68,14 @@ __FBSDID("$FreeBSD$");
#error "Add support for your architecture"
#endif
+/*
+ * Use 4-bytes holder for breakpoint instruction on all the platforms.
+ * Works for x86 as well until it is endian-little platform.
+ * (We are coping one byte only on x86 from this 4-bytes piece of
+ * memory).
+ */
+typedef uint32_t instr_t;
+
static int
proc_stop(struct proc_handle *phdl)
{
@@ -92,8 +100,9 @@ proc_bkptset(struct proc_handle *phdl, uintptr_t address,
unsigned long *saved)
{
struct ptrace_io_desc piod;
- unsigned long paddr, caddr;
+ unsigned long caddr;
int ret = 0, stopped;
+ instr_t instr;
*saved = 0;
if (phdl->status == PS_DEAD || phdl->status == PS_UNDEAD ||
@@ -115,10 +124,10 @@ proc_bkptset(struct proc_handle *phdl, uintptr_t address,
* Read the original instruction.
*/
caddr = address;
- paddr = 0;
+ instr = 0;
piod.piod_op = PIOD_READ_I;
piod.piod_offs = (void *)caddr;
- piod.piod_addr = &paddr;
+ piod.piod_addr = &instr;
piod.piod_len = BREAKPOINT_INSTR_SZ;
if (ptrace(PT_IO, proc_getpid(phdl), (caddr_t)&piod, 0) < 0) {
DPRINTF("ERROR: couldn't read instruction at address 0x%"
@@ -126,15 +135,15 @@ proc_bkptset(struct proc_handle *phdl, uintptr_t address,
ret = -1;
goto done;
}
- *saved = paddr;
+ *saved = instr;
/*
* Write a breakpoint instruction to that address.
*/
caddr = address;
- paddr = BREAKPOINT_INSTR;
+ instr = BREAKPOINT_INSTR;
piod.piod_op = PIOD_WRITE_I;
piod.piod_offs = (void *)caddr;
- piod.piod_addr = &paddr;
+ piod.piod_addr = &instr;
piod.piod_len = BREAKPOINT_INSTR_SZ;
if (ptrace(PT_IO, proc_getpid(phdl), (caddr_t)&piod, 0) < 0) {
DPRINTF("ERROR: couldn't write instruction at address 0x%"
@@ -156,8 +165,9 @@ proc_bkptdel(struct proc_handle *phdl, uintptr_t address,
unsigned long saved)
{
struct ptrace_io_desc piod;
- unsigned long paddr, caddr;
+ unsigned long caddr;
int ret = 0, stopped;
+ instr_t instr;
if (phdl->status == PS_DEAD || phdl->status == PS_UNDEAD ||
phdl->status == PS_IDLE) {
@@ -178,10 +188,10 @@ proc_bkptdel(struct proc_handle *phdl, uintptr_t address,
* Overwrite the breakpoint instruction that we setup previously.
*/
caddr = address;
- paddr = saved;
+ instr = saved;
piod.piod_op = PIOD_WRITE_I;
piod.piod_offs = (void *)caddr;
- piod.piod_addr = &paddr;
+ piod.piod_addr = &instr;
piod.piod_len = BREAKPOINT_INSTR_SZ;
if (ptrace(PT_IO, proc_getpid(phdl), (caddr_t)&piod, 0) < 0) {
DPRINTF("ERROR: couldn't write instruction at address 0x%"