Index: kernel/arch/amd64/include/interrupt.h
===================================================================
--- kernel/arch/amd64/include/interrupt.h	(revision 06737a07ba2ef01fe8fbdb942d826c4ad9952c15)
+++ kernel/arch/amd64/include/interrupt.h	(revision a043e39e07f7ee6a044d2099a1448556efb5e986)
@@ -112,5 +112,5 @@
 extern void (* eoi_function)(void);
 
-extern void decode_istate(int n, istate_t *istate);
+extern void decode_istate(istate_t *istate);
 extern void interrupt_init(void);
 extern void trap_virtual_enable_irqs(uint16_t irqmask);
Index: kernel/arch/amd64/src/asm_utils.S
===================================================================
--- kernel/arch/amd64/src/asm_utils.S	(revision 06737a07ba2ef01fe8fbdb942d826c4ad9952c15)
+++ kernel/arch/amd64/src/asm_utils.S	(revision a043e39e07f7ee6a044d2099a1448556efb5e986)
@@ -50,9 +50,4 @@
 .global interrupt_handlers
 .global syscall_entry
-.global panic_printf
-
-panic_printf:
-	movq $halt, (%rsp)
-	jmp printf
 
 .global cpuid
@@ -232,6 +227,11 @@
 	cld
 
-	# Stop stack traces here
-	xorq %rbp, %rbp
+	#
+	# Stop stack traces here if we came from userspace.
+	#
+	movq %cs, %rax
+	xorq %rdx, %rdx
+	cmpq %rax, IREGISTER_SPACE+16(%rsp)
+	cmovneq %rdx, %rbp
 
 	movq $(\i), %rdi   	# %rdi - first parameter
@@ -287,4 +287,7 @@
 	pushq %rcx
 	pushq %r11
+	pushq %rbp
+
+	xorq %rbp, %rbp		# stop the stack traces here
 
 	movq %r10, %rcx		# Copy the 4th argument where it is expected 
@@ -293,4 +296,5 @@
 	addq $8, %rsp
 		
+	popq %rbp
 	popq %r11
 	popq %rcx
Index: kernel/arch/amd64/src/interrupt.c
===================================================================
--- kernel/arch/amd64/src/interrupt.c	(revision 06737a07ba2ef01fe8fbdb942d826c4ad9952c15)
+++ kernel/arch/amd64/src/interrupt.c	(revision a043e39e07f7ee6a044d2099a1448556efb5e986)
@@ -63,22 +63,15 @@
 void (* eoi_function)(void) = NULL;
 
-void decode_istate(int n, istate_t *istate)
-{
-	const char *symbol = symtab_fmt_name_lookup(istate->rip);
-	
-	printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n", n, __func__);
-	printf("%%rip: %#llx (%s)\n", istate->rip, symbol);
-	printf("ERROR_WORD=%#llx\n", istate->error_word);
-	printf("%%cs=%#llx, rflags=%#llx, %%cr0=%#llx\n", istate->cs,
-	    istate->rflags, read_cr0());
-	printf("%%rax=%#llx, %%rcx=%#llx, %%rdx=%#llx\n", istate->rax,
+void decode_istate(istate_t *istate)
+{
+	printf("error_word=%#llx\n", istate->error_word);
+	printf("cs =%#0.16llx\trflags=%#0.16llx\n", istate->cs,
+	    istate->rflags);
+	printf("rax=%#0.16llx\trbx=%#0.16llx\trcx=%#0.16llx\n", istate->rax,
 	    istate->rcx, istate->rdx);
-	printf("%%rsi=%#llx, %%rdi=%#llx, %%r8=%#llx\n", istate->rsi,
+	printf("rsi=%#0.16llx\trdi=%#0.16llx\tr8 =%#0.16llx\n", istate->rsi,
 	    istate->rdi, istate->r8);
-	printf("%%r9=%#llx, %%r10=%#llx, %%r11=%#llx\n", istate->r9,
+	printf("r9 =%#0.16llx\tr10=%#0.16llx\tr11=%#0.16llx\n", istate->r9,
 	    istate->r10, istate->r11);
-	printf("%%rsp=%#llx\n", &istate->stack[0]);
-	
-	stack_trace_istate(istate);
 }
 
@@ -95,6 +88,5 @@
 {
 	fault_if_from_uspace(istate, "Unserviced interrupt: %u.", n);
-	decode_istate(n, istate);
-	panic("Unserviced interrupt.");
+	panic_badtrap(istate, n, "Unserviced interrupt.");
 }
 
@@ -102,6 +94,5 @@
 {
 	fault_if_from_uspace(istate, "Divide error.");
-	decode_istate(n, istate);
-	panic("Divide error.");
+	panic_badtrap(istate, n, "Divide error.");
 }
 
@@ -129,7 +120,5 @@
 		fault_if_from_uspace(istate, "General protection fault.");
 	}
-	
-	decode_istate(n, istate);
-	panic("General protection fault.");
+	panic_badtrap(istate, n, "General protection fault.");
 }
 
@@ -137,6 +126,5 @@
 {
 	fault_if_from_uspace(istate, "Stack fault.");
-	decode_istate(n, istate);
-	panic("Stack fault.");
+	panic_badtrap(istate, n, "Stack fault.");
 }
 
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision 06737a07ba2ef01fe8fbdb942d826c4ad9952c15)
+++ kernel/arch/amd64/src/mm/page.c	(revision a043e39e07f7ee6a044d2099a1448556efb5e986)
@@ -196,8 +196,5 @@
 	if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
 		fault_if_from_uspace(istate, "Page fault: %#x.", page);
-
-		decode_istate(n, istate);
-		printf("Page fault address: %llx.\n", page);
-		panic("Page fault.");
+		panic_memtrap(istate, access, page, "Page fault.");
 	}
 }
