aboutsummaryrefslogtreecommitdiffstats
path: root/tools/debugger/pdb/linux-2.6-module/debug.c
diff options
context:
space:
mode:
authorach61@arcadians.cl.cam.ac.uk <ach61@arcadians.cl.cam.ac.uk>2005-07-17 14:16:21 +0000
committerach61@arcadians.cl.cam.ac.uk <ach61@arcadians.cl.cam.ac.uk>2005-07-17 14:16:21 +0000
commitc5fe655bd2bea321b637dd0e3c58302c174004c3 (patch)
treed9ffed6ef38b21c9c94fbf4c57e3de7b1b35928e /tools/debugger/pdb/linux-2.6-module/debug.c
parent25e97c409b25e0e6da8a7b0dcfd204cbb944c060 (diff)
downloadxen-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.c68
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;
}