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;