vmm: Add a vmcall for tracing the TF (XCC)

This vmcall will print the current context, minus r11.  It was useful in
debugging a brutal bug.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/include/ros/vmm.h b/kern/include/ros/vmm.h
index 4a015c7..7e03fdb 100644
--- a/kern/include/ros/vmm.h
+++ b/kern/include/ros/vmm.h
@@ -12,6 +12,7 @@
 #define VMCALL_PRINTC		0x1
 #define VMCALL_SMPBOOT		0x2
 #define VMCALL_GET_TSCFREQ	0x3
+#define VMCALL_TRACE_TF		0x4
 
 #define VMM_CTL_GET_EXITS		1
 #define VMM_CTL_SET_EXITS		2
diff --git a/user/vmm/vmexit.c b/user/vmm/vmexit.c
index 39ed0ce..3517ebc 100644
--- a/user/vmm/vmexit.c
+++ b/user/vmm/vmexit.c
@@ -258,6 +258,39 @@
 	case VMCALL_GET_TSCFREQ:
 		retval = handle_vmcall_get_tscfreq(gth);
 		break;
+	case VMCALL_TRACE_TF:
+		trace_printf("  rax  0x%016lx\n",      vm_tf->tf_r11);
+		trace_printf("  rbx  0x%016lx\n",      vm_tf->tf_rbx);
+		trace_printf("  rcx  0x%016lx\n",      vm_tf->tf_rcx);
+		trace_printf("  rdx  0x%016lx\n",      vm_tf->tf_rdx);
+		trace_printf("  rbp  0x%016lx\n",      vm_tf->tf_rbp);
+		trace_printf("  rsi  0x%016lx\n",      vm_tf->tf_rsi);
+		trace_printf("  rdi  0x%016lx\n",      vm_tf->tf_rdi);
+		trace_printf("  r8   0x%016lx\n",      vm_tf->tf_r8);
+		trace_printf("  r9   0x%016lx\n",      vm_tf->tf_r9);
+		trace_printf("  r10  0x%016lx\n",      vm_tf->tf_r10);
+		trace_printf("  r11  0x%016lx\n",      0xdeadbeef);
+		trace_printf("  r12  0x%016lx\n",      vm_tf->tf_r12);
+		trace_printf("  r13  0x%016lx\n",      vm_tf->tf_r13);
+		trace_printf("  r14  0x%016lx\n",      vm_tf->tf_r14);
+		trace_printf("  r15  0x%016lx\n",      vm_tf->tf_r15);
+		trace_printf("  rip  0x%016lx\n",      vm_tf->tf_rip);
+		trace_printf("  rflg 0x%016lx\n",      vm_tf->tf_rflags);
+		trace_printf("  rsp  0x%016lx\n",      vm_tf->tf_rsp);
+		trace_printf("  cr2  0x%016lx\n",      vm_tf->tf_cr2);
+		trace_printf("  cr3  0x%016lx\n",      vm_tf->tf_cr3);
+		trace_printf("Gpcore 0x%08x\n",        vm_tf->tf_guest_pcoreid);
+		trace_printf("Flags  0x%08x\n",        vm_tf->tf_flags);
+		trace_printf("Inject 0x%08x\n",        vm_tf->tf_trap_inject);
+		trace_printf("ExitRs 0x%08x\n",        vm_tf->tf_exit_reason);
+		trace_printf("ExitQl 0x%08x\n",        vm_tf->tf_exit_qual);
+		trace_printf("Intr1  0x%016lx\n",      vm_tf->tf_intrinfo1);
+		trace_printf("Intr2  0x%016lx\n",      vm_tf->tf_intrinfo2);
+		trace_printf("GIntr  0x----%04x\n",    vm_tf->tf_guest_intr_status);
+		trace_printf("GVA    0x%016lx\n",      vm_tf->tf_guest_va);
+		trace_printf("GPA    0x%016lx\n",      vm_tf->tf_guest_pa);
+		retval = true;
+		break;
 	}
 
 	if (retval)