diff options
Diffstat (limited to 'wrapper/ptrace.c')
| -rw-r--r-- | wrapper/ptrace.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/wrapper/ptrace.c b/wrapper/ptrace.c index 706b13e..7e5dfa8 100644 --- a/wrapper/ptrace.c +++ b/wrapper/ptrace.c @@ -84,3 +84,75 @@ int cont(int pid) { return 0; } + + +/* user_regs_struct is copied from sys/user.h so that we can debug a + 32-bit executable on a 64-bit platform. */ +struct amd64_user_regs_struct { + __extension__ unsigned long long r15; + __extension__ unsigned long long r14; + __extension__ unsigned long long r13; + __extension__ unsigned long long r12; + __extension__ unsigned long long rbp; + __extension__ unsigned long long rbx; + __extension__ unsigned long long r11; + __extension__ unsigned long long r10; + __extension__ unsigned long long r9; + __extension__ unsigned long long r8; + __extension__ unsigned long long rax; + __extension__ unsigned long long rcx; + __extension__ unsigned long long rdx; + __extension__ unsigned long long rsi; + __extension__ unsigned long long rdi; + __extension__ unsigned long long orig_rax; + __extension__ unsigned long long rip; + __extension__ unsigned long long cs; + __extension__ unsigned long long eflags; + __extension__ unsigned long long rsp; + __extension__ unsigned long long ss; + __extension__ unsigned long long fs_base; + __extension__ unsigned long long gs_base; + __extension__ unsigned long long ds; + __extension__ unsigned long long es; + __extension__ unsigned long long fs; + __extension__ unsigned long long gs; +}; + + +struct i386_user_regs_struct { + unsigned long ebx; + unsigned long ecx; + unsigned long edx; + unsigned long esi; + unsigned long edi; + unsigned long ebp; + unsigned long eax; + unsigned long xds; + unsigned long xes; + unsigned long xfs; + unsigned long xgs; + unsigned long orig_eax; + unsigned long eip; + unsigned long xcs; + unsigned long eflags; + unsigned long esp; + unsigned long xss; +}; + + +unsigned long long getreg64(int pid, int idx) { + struct amd64_user_regs_struct regs; + + ptrace(PTRACE_GETREGS, pid, NULL, ®s); + + return ((unsigned long long *) ®s)[idx]; +} + + +unsigned long getreg32(int pid, int idx) { + struct i386_user_regs_struct regs; + + ptrace(PTRACE_GETREGS, pid, NULL, ®s); + + return ((unsigned long *) ®s)[idx]; +} |