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.


renamed guest cpu/mem mode functions
Jack Lange [Thu, 23 Apr 2009 03:41:53 +0000 (22:41 -0500)]
palacios/include/palacios/vm_guest.h
palacios/include/palacios/vmm.h
palacios/src/palacios/svm_handler.c
palacios/src/palacios/vmm_ctrl_regs.c
palacios/src/palacios/vmm_direct_paging.c
palacios/src/palacios/vmm_mem.c
palacios/src/palacios/vmm_shadow_paging.c
palacios/src/palacios/vmm_xed.c

index e2c2739..63decc2 100644 (file)
@@ -187,8 +187,8 @@ struct guest_info {
 
 
 uint_t v3_get_addr_width(struct guest_info * info);
-v3_cpu_mode_t v3_get_cpu_mode(struct guest_info * info);
-v3_mem_mode_t v3_get_mem_mode(struct guest_info * info);
+v3_cpu_mode_t v3_get_vm_cpu_mode(struct guest_info * info);
+v3_mem_mode_t v3_get_vm_mem_mode(struct guest_info * info);
 
 
 const uchar_t * v3_cpu_mode_to_str(v3_cpu_mode_t mode);
index 347157f..26c5c5e 100644 (file)
 typedef enum v3_cpu_arch {V3_INVALID_CPU, V3_SVM_CPU, V3_SVM_REV3_CPU, V3_VMX_CPU} v3_cpu_arch_t;
 
 
+v3_cpu_mode_t v3_get_host_cpu_mode();
+
+
 #endif //!__V3VEE__
 
 
index 6d38fb7..7d6b61b 100644 (file)
@@ -64,8 +64,8 @@ int v3_handle_svm_exit(struct guest_info * info) {
     info->ctrl_regs.efer = guest_state->efer;
     
     get_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments));
-    info->cpu_mode = v3_get_cpu_mode(info);
-    info->mem_mode = v3_get_mem_mode(info);
+    info->cpu_mode = v3_get_vm_cpu_mode(info);
+    info->mem_mode = v3_get_vm_mem_mode(info);
 
 
     exit_code = guest_ctrl->exit_code;
index 6f99e39..bdb6e12 100644 (file)
@@ -118,7 +118,7 @@ static int handle_mov_to_cr0(struct guest_info * info, struct x86_instr * dec_in
     // Was there a paging transition
     // Meaning we need to change the page tables
     if (paging_transition) {
-       if (v3_get_mem_mode(info) == VIRTUAL_MEM) {
+       if (v3_get_vm_mem_mode(info) == VIRTUAL_MEM) {
            
            struct efer_64 * guest_efer  = (struct efer_64 *)&(info->guest_efer);
            struct efer_64 * shadow_efer = (struct efer_64 *)&(info->ctrl_regs.efer);
@@ -231,8 +231,8 @@ int v3_handle_cr0_read(struct guest_info * info) {
     if (dec_instr.op_type == V3_OP_MOVCR2) {
        PrintDebug("MOVCR2 (mode=%s)\n", v3_cpu_mode_to_str(info->cpu_mode));
 
-       if ((v3_get_cpu_mode(info) == LONG) || 
-           (v3_get_cpu_mode(info) == LONG_32_COMPAT)) {
+       if ((v3_get_vm_cpu_mode(info) == LONG) || 
+           (v3_get_vm_cpu_mode(info) == LONG_32_COMPAT)) {
            struct cr0_64 * dst_reg = (struct cr0_64 *)(dec_instr.dst_operand.operand);
        
            if (info->shdw_pg_mode == SHADOW_PAGING) {
@@ -382,8 +382,8 @@ int v3_handle_cr3_read(struct guest_info * info) {
        
        if (info->shdw_pg_mode == SHADOW_PAGING) {
            
-           if ((v3_get_cpu_mode(info) == LONG) || 
-               (v3_get_cpu_mode(info) == LONG_32_COMPAT)) {
+           if ((v3_get_vm_cpu_mode(info) == LONG) || 
+               (v3_get_vm_cpu_mode(info) == LONG_32_COMPAT)) {
                struct cr3_64 * dst_reg = (struct cr3_64 *)(dec_instr.dst_operand.operand);
                struct cr3_64 * guest_cr3 = (struct cr3_64 *)&(info->shdw_pg_state.guest_cr3);
                *dst_reg = *guest_cr3;
@@ -396,8 +396,8 @@ int v3_handle_cr3_read(struct guest_info * info) {
        } else if (info->shdw_pg_mode == NESTED_PAGING) {
            
            // This is just a passthrough operation which we probably don't need here
-           if ((v3_get_cpu_mode(info) == LONG) || 
-               (v3_get_cpu_mode(info) == LONG_32_COMPAT)) {
+           if ((v3_get_vm_cpu_mode(info) == LONG) || 
+               (v3_get_vm_cpu_mode(info) == LONG_32_COMPAT)) {
                struct cr3_64 * dst_reg = (struct cr3_64 *)(dec_instr.dst_operand.operand);
                struct cr3_64 * guest_cr3 = (struct cr3_64 *)&(info->ctrl_regs.cr3);
                *dst_reg = *guest_cr3;
@@ -431,7 +431,7 @@ int v3_handle_cr4_write(struct guest_info * info) {
     int ret;
     int flush_tlb=0;
     struct x86_instr dec_instr;
-    v3_cpu_mode_t cpu_mode = v3_get_cpu_mode(info);
+    v3_cpu_mode_t cpu_mode = v3_get_vm_cpu_mode(info);
     
     if (info->mem_mode == PHYSICAL_MEM) { 
        ret = read_guest_pa_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr);
@@ -451,7 +451,7 @@ int v3_handle_cr4_write(struct guest_info * info) {
     
     // Check to see if we need to flush the tlb
     
-    if (v3_get_mem_mode(info) == VIRTUAL_MEM) { 
+    if (v3_get_vm_mem_mode(info) == VIRTUAL_MEM) { 
        struct cr4_32 * new_cr4 = (struct cr4_32 *)(dec_instr.src_operand.operand);
        struct cr4_32 * cr4 = (struct cr4_32 *)&(info->ctrl_regs.cr4);
        
@@ -479,7 +479,7 @@ int v3_handle_cr4_write(struct guest_info * info) {
        PrintDebug("Old CR4=%x\n", *(uint_t *)cr4);
        
        if ((info->shdw_pg_mode == SHADOW_PAGING)) { 
-           if (v3_get_mem_mode(info) == PHYSICAL_MEM) {
+           if (v3_get_vm_mem_mode(info) == PHYSICAL_MEM) {
                
                if ((cr4->pae == 0) && (new_cr4->pae == 1)) {
                    PrintDebug("Creating PAE passthrough tables\n");
index 257efa3..e6b1052 100644 (file)
@@ -50,7 +50,7 @@ int v3_init_passthrough_pts(struct guest_info * info) {
 }
 
 int v3_reset_passthrough_pts(struct guest_info * info) {
-    v3_cpu_mode_t mode = v3_get_cpu_mode(info);
+    v3_cpu_mode_t mode = v3_get_vm_cpu_mode(info);
 
     // Delete the old direct map page tables
     switch(mode) {
@@ -88,7 +88,7 @@ int v3_activate_passthrough_pt(struct guest_info * info) {
 
 
 int v3_handle_passthrough_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
-    v3_cpu_mode_t mode = v3_get_cpu_mode(info);
+    v3_cpu_mode_t mode = v3_get_vm_cpu_mode(info);
 
     switch(mode) {
        case REAL:
@@ -137,7 +137,7 @@ int v3_handle_nested_pagefault(struct guest_info * info, addr_t fault_addr, pf_e
 }
 
 int v3_invalidate_passthrough_addr(struct guest_info * info, addr_t inv_addr) {
-    v3_cpu_mode_t mode = v3_get_cpu_mode(info);
+    v3_cpu_mode_t mode = v3_get_vm_cpu_mode(info);
 
     switch(mode) {
        case REAL:
index 5d9b4ea..2bdf5aa 100644 (file)
@@ -210,7 +210,7 @@ struct v3_shadow_region * insert_shadow_region(struct guest_info * info,
     // flush virtual page tables 
     // 3 cases shadow, shadow passthrough, and nested
     if (info->shdw_pg_mode == SHADOW_PAGING) {
-       v3_mem_mode_t mem_mode = v3_get_mem_mode(info);
+       v3_mem_mode_t mem_mode = v3_get_vm_mem_mode(info);
 
        if (mem_mode == PHYSICAL_MEM) {
            addr_t cur_addr;
@@ -338,7 +338,7 @@ void v3_delete_shadow_region(struct guest_info * info, struct v3_shadow_region *
     // flush virtual page tables 
     // 3 cases shadow, shadow passthrough, and nested
     if (info->shdw_pg_mode == SHADOW_PAGING) {
-       v3_mem_mode_t mem_mode = v3_get_mem_mode(info);
+       v3_mem_mode_t mem_mode = v3_get_vm_mem_mode(info);
            
        if (mem_mode == PHYSICAL_MEM) {
            addr_t cur_addr;
index a3c802f..b2d3b6c 100644 (file)
@@ -78,7 +78,7 @@ int v3_init_shadow_page_state(struct guest_info * info) {
 // creates new shadow page tables
 // updates the shadow CR3 register to point to the new pts
 int v3_activate_shadow_pt(struct guest_info * info) {
-    switch (v3_get_cpu_mode(info)) {
+    switch (v3_get_vm_cpu_mode(info)) {
 
        case PROTECTED:
            return activate_shadow_pt_32(info);
@@ -89,7 +89,7 @@ int v3_activate_shadow_pt(struct guest_info * info) {
        case LONG_16_COMPAT:
            return activate_shadow_pt_64(info);
        default:
-           PrintError("Invalid CPU mode: %s\n", v3_cpu_mode_to_str(v3_get_cpu_mode(info)));
+           PrintError("Invalid CPU mode: %s\n", v3_cpu_mode_to_str(v3_get_vm_cpu_mode(info)));
            return -1;
     }
 
@@ -107,12 +107,12 @@ int v3_invalidate_shadow_pts(struct guest_info * info) {
 
 int v3_handle_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
   
-    if (v3_get_mem_mode(info) == PHYSICAL_MEM) {
+    if (v3_get_vm_mem_mode(info) == PHYSICAL_MEM) {
        // If paging is not turned on we need to handle the special cases
        return v3_handle_passthrough_pagefault(info, fault_addr, error_code);
-    } else if (v3_get_mem_mode(info) == VIRTUAL_MEM) {
+    } else if (v3_get_vm_mem_mode(info) == VIRTUAL_MEM) {
 
-       switch (v3_get_cpu_mode(info)) {
+       switch (v3_get_vm_cpu_mode(info)) {
            case PROTECTED:
                return handle_shadow_pagefault_32(info, fault_addr, error_code);
                break;
@@ -124,7 +124,7 @@ int v3_handle_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_e
                return handle_shadow_pagefault_64(info, fault_addr, error_code);
                break;
            default:
-               PrintError("Unhandled CPU Mode: %s\n", v3_cpu_mode_to_str(v3_get_cpu_mode(info)));
+               PrintError("Unhandled CPU Mode: %s\n", v3_cpu_mode_to_str(v3_get_vm_cpu_mode(info)));
                return -1;
        }
     } else {
@@ -140,14 +140,14 @@ int v3_handle_shadow_invlpg(struct guest_info * info) {
     int ret = 0;
     addr_t vaddr = 0;
 
-    if (v3_get_mem_mode(info) != VIRTUAL_MEM) {
+    if (v3_get_vm_mem_mode(info) != VIRTUAL_MEM) {
        // Paging must be turned on...
        // should handle with some sort of fault I think
        PrintError("ERROR: INVLPG called in non paged mode\n");
        return -1;
     }
 
-    if (v3_get_mem_mode(info) == PHYSICAL_MEM) { 
+    if (v3_get_vm_mem_mode(info) == PHYSICAL_MEM) { 
        ret = read_guest_pa_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr);
     } else { 
        ret = read_guest_va_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr);
@@ -174,7 +174,7 @@ int v3_handle_shadow_invlpg(struct guest_info * info) {
 
     info->rip += dec_instr.instr_length;
 
-    switch (v3_get_cpu_mode(info)) {
+    switch (v3_get_vm_cpu_mode(info)) {
        case PROTECTED:
            return handle_shadow_invlpg_32(info, vaddr);
        case PROTECTED_PAE:
@@ -184,7 +184,7 @@ int v3_handle_shadow_invlpg(struct guest_info * info) {
        case LONG_16_COMPAT:
            return handle_shadow_invlpg_64(info, vaddr);
        default:
-           PrintError("Invalid CPU mode: %s\n", v3_cpu_mode_to_str(v3_get_cpu_mode(info)));
+           PrintError("Invalid CPU mode: %s\n", v3_cpu_mode_to_str(v3_get_vm_cpu_mode(info)));
            return -1;
     }
 }
index 25ca076..3511f8a 100644 (file)
@@ -645,7 +645,7 @@ static int get_memory_operand(struct guest_info * info,  xed_decoded_inst_t * xe
 
     // This is a horrendous hack...
     // XED really screwed the pooch in calculating the displacement
-    if (v3_get_cpu_mode(info) == LONG) {
+    if (v3_get_vm_cpu_mode(info) == LONG) {
        displacement = mem_op.displacement;
     } else {
        displacement = MASK(mem_op.displacement, mem_op.displacement_size);