diff -ur src.old/sys/amd64/amd64/db_trace.c src/sys/amd64/amd64/db_trace.c --- src.old/sys/amd64/amd64/db_trace.c Sat Apr 29 18:55:51 2006 +++ src/sys/amd64/amd64/db_trace.c Sun Apr 30 04:02:47 2006 @@ -495,6 +495,19 @@ db_backtrace(curthread, NULL, frame, callpc, -1); } +void +db_trace_frame(struct trapframe *tf) +{ + struct amd64_frame *frame; + db_addr_t callpc; + + frame = (struct amd64_frame *)tf->tf_rbp; + callpc = (db_addr_t)tf->tf_rip; + frame = frame->f_frame; + db_backtrace(curthread, tf, frame, callpc, -1); +} + + int db_trace_thread(struct thread *thr, int count) { diff -ur src.old/sys/amd64/amd64/exception.S src/sys/amd64/amd64/exception.S --- src.old/sys/amd64/amd64/exception.S Sat Apr 29 18:55:51 2006 +++ src/sys/amd64/amd64/exception.S Sun Apr 30 03:08:35 2006 @@ -189,7 +189,9 @@ testb $SEL_RPL_MASK,TF_CS(%rsp) /* Did we come from kernel? */ jz 1f /* already running with kernel GS.base */ swapgs -1: call dblfault_handler +1: movq %rbp,TF_RBP(%rsp) + movq %rsp,%rdi + call dblfault_handler 2: hlt jmp 2b diff -ur src.old/sys/amd64/amd64/machdep.c src/sys/amd64/amd64/machdep.c --- src.old/sys/amd64/amd64/machdep.c Sat Apr 29 18:55:51 2006 +++ src/sys/amd64/amd64/machdep.c Sun Apr 30 00:44:16 2006 @@ -135,7 +135,7 @@ CTASSERT(offsetof(struct pcpu, pc_curthread) == 0); extern u_int64_t hammer_time(u_int64_t, u_int64_t); -extern void dblfault_handler(void); +extern void dblfault_handler(struct trapframe *); extern void printcpuinfo(void); /* XXX header file */ extern void identify_cpu(void); diff -ur src.old/sys/amd64/amd64/trap.c src/sys/amd64/amd64/trap.c --- src.old/sys/amd64/amd64/trap.c Sat Apr 29 18:55:51 2006 +++ src/sys/amd64/amd64/trap.c Sun Apr 30 04:05:13 2006 @@ -94,12 +94,14 @@ #endif #include +#include + extern void trap(struct trapframe frame); extern void syscall(struct trapframe frame); static int trap_pfault(struct trapframe *, int); static void trap_fatal(struct trapframe *, vm_offset_t); -void dblfault_handler(void); +void dblfault_handler(struct trapframe *); #define MAX_TRAP_MSG 30 static char *trap_msg[] = { @@ -705,9 +707,17 @@ * for example). */ void -dblfault_handler() +dblfault_handler(struct trapframe *frame) { printf("\nFatal double fault\n"); + printf("trap: 0x%lx\taddr: 0x%lx\n", frame->tf_trapno, frame->tf_addr); + printf("flags: 0x%lx\terr: 0x%lx\n", frame->tf_flags, frame->tf_err); + printf("rip: 0x%lx\tcs: 0x%lx\n", frame->tf_rip, frame->tf_cs); + printf("rflags: 0x%lx\trsp: 0x%lx\n", frame->tf_rflags, frame->tf_rsp); + printf("ss: 0x%lx\trbp: 0x%lx\n", frame->tf_ss, frame->tf_rbp); + + db_trace_frame(frame); + #ifdef SMP /* two separate prints in case of a trap on an unmapped page */ printf("cpuid = %d; ", PCPU_GET(cpuid)); Only in src/sys/amd64/include: atomic.h.orig diff -ur src.old/sys/ddb/ddb.h src/sys/ddb/ddb.h --- src.old/sys/ddb/ddb.h Sat Apr 29 18:56:07 2006 +++ src/sys/ddb/ddb.h Sun Apr 30 04:04:05 2006 @@ -124,6 +124,7 @@ boolean_t db_stop_at_pc(boolean_t *is_breakpoint); #define db_strcpy strcpy void db_trace_self(void); +void db_trace_frame(struct trapframe *); int db_trace_thread(struct thread *, int); int db_value_of_name(const char *name, db_expr_t *valuep); int db_write_bytes(vm_offset_t addr, size_t size, char *data); Only in src/sys/kern: subr_pcpu.c.orig Only in src/sys/sys: pcpu.h.orig Only in src/sys/vm: vm_page.c.orig Only in src/sys/vm: vm_page.h.orig Only in src/sys/vm: vm_pageq.c.orig