diff options
author | ach61@arcadians.cl.cam.ac.uk <ach61@arcadians.cl.cam.ac.uk> | 2005-07-17 14:16:21 +0000 |
---|---|---|
committer | ach61@arcadians.cl.cam.ac.uk <ach61@arcadians.cl.cam.ac.uk> | 2005-07-17 14:16:21 +0000 |
commit | c5fe655bd2bea321b637dd0e3c58302c174004c3 (patch) | |
tree | d9ffed6ef38b21c9c94fbf4c57e3de7b1b35928e /tools/debugger/pdb/linux-2.6-module/debug.c | |
parent | 25e97c409b25e0e6da8a7b0dcfd204cbb944c060 (diff) | |
download | xen-c5fe655bd2bea321b637dd0e3c58302c174004c3.tar.gz xen-c5fe655bd2bea321b637dd0e3c58302c174004c3.tar.bz2 xen-c5fe655bd2bea321b637dd0e3c58302c174004c3.zip |
pdb: read/write registers for process target
Diffstat (limited to 'tools/debugger/pdb/linux-2.6-module/debug.c')
-rw-r--r-- | tools/debugger/pdb/linux-2.6-module/debug.c | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/tools/debugger/pdb/linux-2.6-module/debug.c b/tools/debugger/pdb/linux-2.6-module/debug.c index 744be03b73..ba1825cc30 100644 --- a/tools/debugger/pdb/linux-2.6-module/debug.c +++ b/tools/debugger/pdb/linux-2.6-module/debug.c @@ -55,51 +55,71 @@ pdb_detach (int pid) /* * from linux-2.6.11/arch/i386/kernel/ptrace.c::getreg() */ -int -pdb_read_register (int pid, pdb_op_rd_reg_p op, unsigned long *dest) + +static unsigned long +_pdb_get_register (struct task_struct *target, int reg) { - int rc = 0; - struct task_struct *target; + unsigned long result = ~0UL; unsigned long offset; unsigned char *stack = 0L; - *dest = ~0UL; - - read_lock(&tasklist_lock); - target = find_task_by_pid(pid); - if (target) - get_task_struct(target); - read_unlock(&tasklist_lock); - - switch (op->reg) + switch (reg) { case FS: - *dest = target->thread.fs; + result = target->thread.fs; break; case GS: - *dest = target->thread.gs; + result = target->thread.gs; break; case DS: case ES: case SS: case CS: - *dest = 0xffff; + result = 0xffff; /* fall through */ default: - if (op->reg > GS) - op->reg -= 2; + if (reg > GS) + reg -= 2; - offset = op->reg * sizeof(long); + offset = reg * sizeof(long); offset -= sizeof(struct pt_regs); stack = (unsigned char *)target->thread.esp0; stack += offset; - *dest &= *((int *)stack); + result &= *((int *)stack); } - /* - printk ("pdb read register: 0x%x %2d 0x%p 0x%lx\n", - pid, op->reg, stack, *dest); - */ + return result; +} + +int +pdb_read_register (int pid, pdb_op_rd_regs_p op) +{ + int rc = 0; + struct task_struct *target; + + read_lock(&tasklist_lock); + target = find_task_by_pid(pid); + if (target) + get_task_struct(target); + read_unlock(&tasklist_lock); + + op->reg[ 0] = _pdb_get_register(target, LINUX_EAX); + op->reg[ 1] = _pdb_get_register(target, LINUX_ECX); + op->reg[ 2] = _pdb_get_register(target, LINUX_EDX); + op->reg[ 3] = _pdb_get_register(target, LINUX_EBX); + op->reg[ 4] = _pdb_get_register(target, LINUX_ESP); + op->reg[ 5] = _pdb_get_register(target, LINUX_EBP); + op->reg[ 6] = _pdb_get_register(target, LINUX_ESI); + op->reg[ 7] = _pdb_get_register(target, LINUX_EDI); + op->reg[ 8] = _pdb_get_register(target, LINUX_EIP); + op->reg[ 9] = _pdb_get_register(target, LINUX_EFL); + + op->reg[10] = _pdb_get_register(target, LINUX_CS); + op->reg[11] = _pdb_get_register(target, LINUX_SS); + op->reg[12] = _pdb_get_register(target, LINUX_DS); + op->reg[13] = _pdb_get_register(target, LINUX_ES); + op->reg[14] = _pdb_get_register(target, LINUX_FS); + op->reg[15] = _pdb_get_register(target, LINUX_GS); return rc; } |