diff --git a/tools/gdbinit-amd64 b/tools/gdbinit-amd64
new file mode 100644
index 0000000000000000000000000000000000000000..b621d6d49481a07a1db5df3f8059706c9da6825c
--- /dev/null
+++ b/tools/gdbinit-amd64
@@ -0,0 +1,205 @@
+## CMUCL debugging commands
+## Copyright (C) 2003 andreas fuchs <asf@void.at>
+## No warranty whatsoever (if applicable). 
+## Do whatever you want with this code.
+
+## Install by copying it to /path/to/cmucl-source/lisp/.gdbinit
+
+## Usage:
+## See http://sbcl-internals.cliki.net/gdb
+
+## most of these functions are tested on amd64 only. Please tell me
+## about results you get when trying on other architectures.
+
+define hookpost-stepi
+y
+  disasm_from
+end
+document hookpost-stepi
+ workaround for gdb strangeness. it won't print the disassembled
+ current insn, but a unusable line number in a nonexistent file.
+end
+
+define hookpost-nexti
+y
+  disasm_from
+end
+document hookpost-nexti
+ workaround for gdb strangeness. it won't print the disassembled
+ current insn, but a unusable line number in a nonexistent file.
+end
+
+set $SYM_NIL = 0
+
+define initialize
+y
+  printf "finding symbol nil from "
+  call lookup_by_name ("nil")
+  set $SYM_NIL = ((struct code*) $)->header
+  printf "nil found at value 0x%x\n", $SYM_NIL
+end
+document initialize
+  initialize the value of $SYM_NIL to the real NIL symbol.
+end
+
+
+define hookpost-attach
+y
+  #initialize
+end
+document hookpost-attach
+ call the initialization function
+end
+
+define hookpost-run
+y
+  initialize
+end
+document hookpost-run
+ call the initialization function
+end
+
+set $N_LOWTAG_BITS = 3
+set $LOWTAG_MASK = ((1<<$N_LOWTAG_BITS)-1) 
+
+define y
+end
+document y
+ convenience function: "y"es we want to redefine the command.
+end
+
+define id_lowtag
+y
+  printf "Lowtag of 0x%x: 0x%x (%s)\n", $arg0, $arg0 & 7, lowtag_Names[$arg0 & 7]
+end
+document id_lowtag 
+  identify the lowtag of the first arg (a lisp pointer)
+end
+
+define xlisp
+y
+  # list lowtag
+  if (($ & $LOWTAG_MASK) == 0x3)
+    print/x * ((struct cons*) ($ & ~$LOWTAG_MASK))
+  # function lowtag
+  else 
+    if (($ & $LOWTAG_MASK) == 0x1)
+      printf "0x%x is a function.\n", $
+      print/x * ((struct function *) ($ & ~$LOWTAG_MASK))
+      printf "name of function follows:\n"
+      print/x $.name
+      xlisp
+    else 
+      if (($ & $LOWTAG_MASK) == 0x4)
+	printf "0x%x is an (odd) fixnum: ", $
+	print ($ >> ($N_LOWTAG_BITS-1))
+      else
+	if (($ & $LOWTAG_MASK) == 0)
+	  printf "0x%x is an (even) fixnum: ", $
+	  print ($ >> ($N_LOWTAG_BITS-1))
+	else
+	  # assume it's a symbol
+	  if (($ & $LOWTAG_MASK) == 7)
+		printf "0x%x is a symbol.\n", $
+		print/x *((struct symbol *) ($ & ~$LOWTAG_MASK))
+		printf "name of symbol follows:\n"
+		x/s $.name + 9
+	  else
+	  	printf "Unknown lowtag when printing 0x%x: 0x%x.\n", $, $ & $LOWTAG_MASK
+	  end
+	end
+      end
+    end
+  end
+end
+document xlisp
+  examine the last (or second-to-last) lisp object. 
+  Currently, only functions and cons cells are supported.
+end
+
+define xlispa
+y
+  printf "examining "
+  print/x $arg0
+  xlisp
+end
+document xlispa
+  examine the first argument with xlisp.
+end
+
+
+define xcar
+y
+  print/x $.car
+  xlisp
+end
+document xcar
+  examine the CAR of the last object (assuming it was of type
+  struct cons).
+end
+
+define xcdr
+y
+  print/x $.cdr
+  xlisp
+end
+document xcdr
+  examine the CDR of the last object (assuming it was of type
+  struct cons).
+end
+
+define find_lispfunction
+y
+  printf "searching for address 0x%x: found ", $arg0
+  call component_ptr_from_pc($arg0)
+  printf "this object is probably a 'code' object...\n"
+  print/x * ((struct code*) $)
+  printf "trying 'entry_points' (i.e. a chain of functions): "
+  print/x $.entry_points
+  xlisp
+  while $.next != $SYM_NIL
+    $this_function = $
+    printf "next function: "
+    print/x $this_function.next
+    xcar
+    print/x $this_function
+    xcdr
+  end
+end
+document find_lispfunction
+  find function names of objects of which we know only a $PC address.
+  This function uses heuristics to find and display the entry points. 
+end
+
+define disasm_from
+y
+  disassemble $pc $pc+24
+end
+document disasm_from
+  disassemble the block of memory starting from $pc, for lack of a
+  useful disassembly routine.
+end
+
+
+set print pretty on
+
+# antifuchs's debugging routine
+
+
+define onwards
+y
+  set go=1
+  cont
+end
+
+define spinattach
+y
+ while 1
+	attach $arg0
+ end
+end
+
+
+set args -core lisp.core
+#handle SIGTRAP pass
+#handle SIGBUS pass