Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Succesfully launches and jumps into the exit handler. Need to write a proper exit...
[palacios.git] / palacios / src / palacios / vmcs.c
index 5ab9a0c..a7da803 100644 (file)
@@ -22,7 +22,7 @@
 #include <palacios/vmm.h>
 
 
-static const char * vmcs_field_to_str(vmcs_field_t field);
+// static const char * v3_vmcs_field_to_str(vmcs_field_t field);
 
 //extern char * exception_names;
 //
@@ -40,122 +40,136 @@ static inline void print_vmcs_field(vmcs_field_t vmcs_index) {
     };
     
     if (len == 2) {
-       PrintDebug("%s: %x\n", vmcs_field_to_str(vmcs_index), (uint16_t)val);
+       PrintDebug("%s: %x\n", v3_vmcs_field_to_str(vmcs_index), (uint16_t)val);
     } else if (len == 4) {
-       PrintDebug("%s: %x\n", vmcs_field_to_str(vmcs_index), (uint32_t)val);
+       PrintDebug("%s: %x\n", v3_vmcs_field_to_str(vmcs_index), (uint32_t)val);
     } else if (len == 8) {
-       PrintDebug("%s: %p\n", vmcs_field_to_str(vmcs_index), (void *)(addr_t)val);
+       PrintDebug("%s: %p\n", v3_vmcs_field_to_str(vmcs_index), (void *)(addr_t)val);
     }
 }
 
 
-static inline void print_vmcs_segments() {
-    // see vm_guest.c
-}
-
-
-
-
-/*
-void print_debug_vmcs_load_guest() {
-    const int wordsize = sizeof(addr_t);
-    uint64_t temp;
-    struct vmcs_segment_access tmp_seg;
-
-    PrintDebug("\n====== Loading Guest State ======\n");
-    PRINT_VMREAD("Guest CR0: %x\n", GUEST_CR0, wordsize);
-    PRINT_VMREAD("Guest CR3: %x\n", GUEST_CR3, wordsize);
-    PRINT_VMREAD("Guest CR4: %x\n", GUEST_CR4, wordsize);
-    PRINT_VMREAD("Guest DR7: %x\n", GUEST_DR7, wordsize);
-
-    READ_VMCS_SEG(&tmp_seg,CS,wordsize);
-    print_vmcs_segment("CS", &tmp_seg);
-    
-    READ_VMCS_SEG(&tmp_seg,SS,wordsize);
-    print_vmcs_segment("SS", &tmp_seg);
-
-    READ_VMCS_SEG(&tmp,DS,wordsize);
-    print_vmcs_segment("DS", &tmp_seg);
-
-    READ_VMCS_SEG(&tmp_seg,ES,wordsize);
-    print_vmcs_segment("ES", &tmp_seg);
-
-    READ_VMCS_SEG(&tmp_seg,FS,wordsize);
-    print_vmcs_segment("FS", &tmp_seg);
 
-    READ_VMCS_SEG(&tmp_seg,GS,wordsize);
-    print_vmcs_segment("GS", &tmp_seg);
-
-    READ_VMCS_SEG(&tmp_seg,TR,wordsize);
-    print_vmcs_segment("TR", &tmp_seg);
-
-    READ_VMCS_SEG(&tmp_seg,LDTR,wordsize);
-    print_vmcs_segment("LDTR", &tmp_seg);
-    
-    PrintDebug("\n==GDTR==\n");
-    PRINT_VMREAD("GDTR Base: %x\n", GUEST_GDTR_BASE, wordsize);
-    PRINT_VMREAD("GDTR Limit: %x\n", GUEST_GDTR_LIMIT, 32);
-    PrintDebug("====\n");
-
-    PrintDebug("\n==LDTR==\n");
-    PRINT_VMREAD("LDTR Base: %x\n", GUEST_LDTR_BASE, wordsize);
-    PRINT_VMREAD("LDTR Limit: %x\n", GUEST_LDTR_LIMIT, 32);
-    PrintDebug("=====\n");
-
-    PRINT_VMREAD("Guest RSP: %x\n", GUEST_RSP, wordsize);
-    PRINT_VMREAD("Guest RIP: %x\n", GUEST_RIP, wordsize);
-    PRINT_VMREAD("Guest RFLAGS: %x\n", GUEST_RFLAGS, wordsize);
-    PRINT_VMREAD("Guest Activity state: %x\n", GUEST_ACTIVITY_STATE, 32);
-    PRINT_VMREAD("Guest Interruptibility state: %x\n", GUEST_INT_STATE, 32);
-    PRINT_VMREAD("Guest pending debug: %x\n", GUEST_PENDING_DEBUG_EXCS, wordsize);
-
-    PRINT_VMREAD("IA32_DEBUGCTL: %x\n", GUEST_IA32_DEBUGCTL, 64);
-    PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", GUEST_IA32_SYSENTER_CS, 32);
-    PRINT_VMREAD("IA32_SYSTENTER_ESP: %x\n", GUEST_IA32_SYSENTER_ESP, wordsize);
-    PRINT_VMREAD("IA32_SYSTENTER_EIP: %x\n", GUEST_IA32_SYSENTER_EIP, wordsize);
-    PRINT_VMREAD("IA32_PERF_GLOBAL_CTRL: %x\n", GUEST_IA32_PERF_GLOBAL_CTRL, wordsize);
-    PRINT_VMREAD("VMCS Link Ptr: %x\n", VMCS_LINK_PTR, 64);
-    // TODO: Maybe add VMX preemption timer and PDTE (Intel 20-8 Vol. 3b)
-}
-
-void print_debug_load_host() {
-    const int wordsize = sizeof(addr_t);
-    uint64_t temp;
-    vmcs_segment tmp_seg;
-
-    PrintDebug("\n====== Host State ========\n");
-    PRINT_VMREAD("Host CR0: %x\n", HOST_CR0, wordsize);
-    PRINT_VMREAD("Host CR3: %x\n", HOST_CR3, wordsize);
-    PRINT_VMREAD("Host CR4: %x\n", HOST_CR4, wordsize);
-    PRINT_VMREAD("Host RSP: %x\n", HOST_RSP, wordsize);
-    PRINT_VMREAD("Host RIP: %x\n", HOST_RIP, wordsize);
-    PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", HOST_IA32_SYSENTER_CS, 32);
-    PRINT_VMREAD("IA32_SYSENTER_ESP: %x\n", HOST_IA32_SYSENTER_ESP, wordsize);
-    PRINT_VMREAD("IA32_SYSENTER_EIP: %x\n", HOST_IA32_SYSENTER_EIP, wordsize);
-        
-    PRINT_VMREAD("Host CS Selector: %x\n", HOST_CS_SELECTOR, 16);
-    PRINT_VMREAD("Host SS Selector: %x\n", HOST_SS_SELECTOR, 16);
-    PRINT_VMREAD("Host DS Selector: %x\n", HOST_DS_SELECTOR, 16);
-    PRINT_VMREAD("Host ES Selector: %x\n", HOST_ES_SELECTOR, 16);
-    PRINT_VMREAD("Host FS Selector: %x\n", HOST_FS_SELECTOR, 16);
-    PRINT_VMREAD("Host GS Selector: %x\n", HOST_GS_SELECTOR, 16);
-    PRINT_VMREAD("Host TR Selector: %x\n", HOST_TR_SELECTOR, 16);
-
-    PRINT_VMREAD("Host FS Base: %x\n", HOST_FS_BASE, wordsize);
-    PRINT_VMREAD("Host GS Base: %x\n", HOST_GS_BASE, wordsize);
-    PRINT_VMREAD("Host TR Base: %x\n", HOST_TR_BASE, wordsize);
-    PRINT_VMREAD("Host GDTR Base: %x\n", HOST_GDTR_BASE, wordsize);
-    PRINT_VMREAD("Host IDTR Base: %x\n", HOSE_IDTR_BASE, wordsize);
+void v3_print_vmcs_guest_state()
+{
+    PrintDebug("\n===== VMCS Guest State =====\n");
+    print_vmcs_field(VMCS_GUEST_RIP);
+    print_vmcs_field(VMCS_GUEST_RSP);
+    print_vmcs_field(VMCS_GUEST_CR0);
+    print_vmcs_field(VMCS_GUEST_CR3);
+    print_vmcs_field(VMCS_GUEST_CR4);
+    print_vmcs_field(VMCS_GUEST_DR7);
+
+    PrintDebug("\n=== CS Segment===\n");
+    print_vmcs_field(VMCS_GUEST_CS_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_CS_BASE);
+    print_vmcs_field(VMCS_GUEST_CS_LIMIT);
+    print_vmcs_field(VMCS_GUEST_CS_ACCESS);
+
+    PrintDebug("\n=== SS Segment ===\n");
+    print_vmcs_field(VMCS_GUEST_SS_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_SS_BASE);
+    print_vmcs_field(VMCS_GUEST_SS_LIMIT);
+    print_vmcs_field(VMCS_GUEST_SS_ACCESS);
+
+    PrintDebug("\n=== DS Segment ===\n");
+    print_vmcs_field(VMCS_GUEST_DS_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_DS_BASE);
+    print_vmcs_field(VMCS_GUEST_DS_LIMIT);
+    print_vmcs_field(VMCS_GUEST_DS_ACCESS);
+
+    PrintDebug("\n=== ES Segment ===\n");
+    print_vmcs_field(VMCS_GUEST_ES_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_ES_BASE);
+    print_vmcs_field(VMCS_GUEST_ES_LIMIT);
+    print_vmcs_field(VMCS_GUEST_ES_ACCESS);
+
+    PrintDebug("\n=== FS Segment ===\n");
+    print_vmcs_field(VMCS_GUEST_FS_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_FS_BASE);
+    print_vmcs_field(VMCS_GUEST_FS_LIMIT);
+    print_vmcs_field(VMCS_GUEST_FS_ACCESS);
+
+    PrintDebug("\n=== GS Segment ===\n");
+    print_vmcs_field(VMCS_GUEST_GS_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_GS_BASE);
+    print_vmcs_field(VMCS_GUEST_GS_LIMIT);
+    print_vmcs_field(VMCS_GUEST_GS_ACCESS);
+
+    PrintDebug("\n=== LDTR Segment ===\n");
+    print_vmcs_field(VMCS_GUEST_LDTR_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_LDTR_BASE);
+    print_vmcs_field(VMCS_GUEST_LDTR_LIMIT);
+    print_vmcs_field(VMCS_GUEST_LDTR_ACCESS);
+
+    PrintDebug("\n=== TR Segment ===\n");
+    print_vmcs_field(VMCS_GUEST_TR_SELECTOR);
+    print_vmcs_field(VMCS_GUEST_TR_BASE);
+    print_vmcs_field(VMCS_GUEST_TR_LIMIT);
+    print_vmcs_field(VMCS_GUEST_TR_ACCESS);
+
+    PrintDebug("\n=== GDTR ===\n");
+    print_vmcs_field(VMCS_GUEST_GDTR_BASE);
+    print_vmcs_field(VMCS_GUEST_GDTR_LIMIT);
+
+    PrintDebug("\n=== IDTR ===\n");
+    print_vmcs_field(VMCS_GUEST_IDTR_BASE);
+    print_vmcs_field(VMCS_GUEST_IDTR_LIMIT);
+
+    PrintDebug("\n");
+    print_vmcs_field(VMCS_GUEST_RFLAGS);
+    print_vmcs_field(VMCS_GUEST_ACTIVITY_STATE);
+    print_vmcs_field(VMCS_GUEST_INT_STATE);
+    print_vmcs_field(VMCS_GUEST_PENDING_DBG_EXCP);
+
+    print_vmcs_field(VMCS_GUEST_DBG_CTL);
+    print_vmcs_field(VMCS_GUEST_SYSENTER_CS);
+    print_vmcs_field(VMCS_GUEST_SYSENTER_ESP);
+    print_vmcs_field(VMCS_GUEST_SYSENTER_EIP);
+    print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL);
+    print_vmcs_field(VMCS_LINK_PTR);
+
+    PrintDebug("\n");
 }
-
-void print_vmcs_segment(char * name, vmcs_segment* seg)
+       
+void v3_print_vmcs_host_state()
 {
-    PrintDebug("\n==VMCS %s Segment==\n",name);
-    PrintDebug("\tSelector: %x\n", seg->selector);
-    PrintDebug("\tBase Address: %x\n", seg->baseAddr);
-    PrintDebug("\tLimit: %x\n", seg->limit);
-    PrintDebug("\tAccess: %x\n", seg->access);
-}*/
+    PrintDebug("=== Control Fields===\n");
+    print_vmcs_field(VMCS_PIN_CTRLS);
+    print_vmcs_field(VMCS_PROC_CTRLS);
+    print_vmcs_field(VMCS_EXIT_CTRLS);
+    print_vmcs_field(VMCS_ENTRY_CTRLS);
+    print_vmcs_field(VMCS_EXCP_BITMAP);
+
+    PrintDebug("\n");
+    print_vmcs_field(VMCS_HOST_CR0);
+    print_vmcs_field(VMCS_HOST_CR3);
+    print_vmcs_field(VMCS_HOST_CR4);
+    print_vmcs_field(VMCS_HOST_RSP);
+    print_vmcs_field(VMCS_HOST_RIP);
+    print_vmcs_field(VMCS_HOST_SYSENTER_CS);
+    print_vmcs_field(VMCS_HOST_SYSENTER_ESP);
+    print_vmcs_field(VMCS_HOST_SYSENTER_EIP);
+    
+    PrintDebug("\n=== Segment Registers===\n");
+    PrintDebug("Selector:\n");
+    print_vmcs_field(VMCS_HOST_CS_SELECTOR);
+    print_vmcs_field(VMCS_HOST_SS_SELECTOR);
+    print_vmcs_field(VMCS_HOST_DS_SELECTOR);
+    print_vmcs_field(VMCS_HOST_ES_SELECTOR);
+    print_vmcs_field(VMCS_HOST_FS_SELECTOR);
+    print_vmcs_field(VMCS_HOST_GS_SELECTOR);
+    print_vmcs_field(VMCS_HOST_TR_SELECTOR);
+
+    PrintDebug("\nBase:\n");
+    print_vmcs_field(VMCS_HOST_FS_BASE);
+    print_vmcs_field(VMCS_HOST_GS_BASE);
+    print_vmcs_field(VMCS_HOST_TR_BASE);
+    print_vmcs_field(VMCS_HOST_GDTR_BASE);
+    print_vmcs_field(VMCS_HOST_IDTR_BASE);
+
+    PrintDebug("\n");
+}
 
 /*
  * Returns the field length in bytes
@@ -459,7 +473,7 @@ static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
 
 
 
-static const char * vmcs_field_to_str(vmcs_field_t field) {   
+const char * v3_vmcs_field_to_str(vmcs_field_t field) {   
     switch (field) {
         case VMCS_GUEST_ES_SELECTOR:
             return VMCS_GUEST_ES_SELECTOR_STR;