2002-09-23 Michal Ludvig <mludvig@suse.cz>
Merged x86-64 port by Andi Kleen <ak@suse.de>
and Michal Ludvig <mludvig@suse.cz>
* Makefile.in: New target 'headers'. Failure ignored.
* acconfig.h: New defines for x86-64.
* configure.in: Ditto.
* defs.h: Ditto.
* file.c: Ditto.
* signal.c: Ditto.
* process.c: Added support for x86-64.
* util.c: Ditto.
* syscall.c: Ditto + added automatic personality switching.
* linux/syscall.h: Ditto.
* linux/x86_64: New directory.
* linux/x86_64/Makefile.in: New file.
* linux/x86_64/gentab.pl: Ditto.
* linux/x86_64/i386-headers.diff: Ditto.
* linux/x86_64/makeheaders.sh: Ditto.
* linux/x86_64/syscallent.h: Ditto.
* mem.c (print_mmap): Always print arg[4] as int.
diff --git a/util.c b/util.c
index 3d4fee3..d34a66d 100644
--- a/util.c
+++ b/util.c
@@ -908,7 +908,9 @@
errno = 0;
val = ptrace(PTRACE_PEEKUSER, pid, (char *) off, 0);
if (val == -1 && errno) {
- perror("upeek: ptrace(PTRACE_PEEKUSER, ... )");
+ char buf[60];
+ sprintf(buf,"upeek: ptrace(PTRACE_PEEKUSER,%d,%lu,0)",pid,off);
+ perror(buf);
return -1;
}
*res = val;
@@ -927,6 +929,9 @@
#if defined(I386)
if (upeek(tcp->pid, 4*EIP, &pc) < 0)
return -1;
+#elif defined(X86_64)
+ if (upeek(tcp->pid, 8*RIP, &pc) < 0)
+ return -1;
#elif defined(IA64)
if (upeek(tcp->pid, PT_B0, &pc) < 0)
return -1;
@@ -1002,6 +1007,14 @@
return;
}
tprintf("[%08lx] ", eip);
+#elif defined(X86_64)
+ long rip;
+
+ if (upeek(tcp->pid, 8*RIP, &rip) < 0) {
+ tprintf("[????????] ");
+ return;
+ }
+ tprintf("[%16lx] ", rip);
#elif defined(IA62)
long ip;
@@ -1212,7 +1225,7 @@
}
#else /* !IA64 */
-#if defined (I386)
+#if defined (I386) || defined(X86_64)
#define LOOP 0x0000feeb
#elif defined (M68K)
#define LOOP 0x60fe0000
@@ -1245,6 +1258,9 @@
#if defined (I386)
if (upeek(tcp->pid, 4*EIP, &tcp->baddr) < 0)
return -1;
+#elif defined (X86_64)
+ if (upeek(tcp->pid, 8*RIP, &tcp->baddr) < 0)
+ return -1;
#elif defined (M68K)
if (upeek(tcp->pid, 4*PT_PC, &tcp->baddr) < 0)
return -1;
@@ -1346,7 +1362,7 @@
{
#ifdef LINUX
-#if defined(I386)
+#if defined(I386) || defined(X86_64)
long eip;
#elif defined(POWERPC)
long pc;
@@ -1467,6 +1483,17 @@
eip, tcp->baddr);
return 0;
}
+#elif defined(X86_64)
+ if (upeek(tcp->pid, 8*RIP, &eip) < 0)
+ return -1;
+ if (eip != tcp->baddr) {
+ /* The breakpoint has not been reached yet. */
+ if (debug)
+ fprintf(stderr,
+ "NOTE: PC not at bpt (pc %#lx baddr %#lx)\n",
+ eip, tcp->baddr);
+ return 0;
+ }
#elif defined(POWERPC)
if (upeek(tcp->pid, 4*PT_NIP, &pc) < 0)
return -1;