summaryrefslogtreecommitdiff
path: root/wrapper/ptrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'wrapper/ptrace.c')
-rw-r--r--wrapper/ptrace.c72
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, &regs);
+
+ return ((unsigned long long *) &regs)[idx];
+}
+
+
+unsigned long getreg32(int pid, int idx) {
+ struct i386_user_regs_struct regs;
+
+ ptrace(PTRACE_GETREGS, pid, NULL, &regs);
+
+ return ((unsigned long *) &regs)[idx];
+}