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.


clear instruction to 0 before decoding with xed
[palacios.git] / palacios / src / palacios / vmcs.c
index a77de77..0b874fd 100644 (file)
@@ -227,7 +227,14 @@ int v3_vmx_save_vmcs(struct guest_info * info) {
 
     check_vmcs_read(VMCS_GUEST_RFLAGS, &(info->ctrl_regs.rflags));
     if (((struct vmx_data *)info->vmm_data)->ia32e_avail) {
+#ifdef __V3_64BIT__
         check_vmcs_read(VMCS_GUEST_EFER, &(info->ctrl_regs.efer));
+#else
+       uint32_t hi, lo;
+        check_vmcs_read(VMCS_GUEST_EFER, &hi);
+        check_vmcs_read(VMCS_GUEST_EFER_HIGH, &lo);
+        info->ctrl_regs.efer = ((uint64_t) hi << 32) | lo;
+#endif
     }
 
     error =  v3_read_vmcs_segments(&(info->segments));
@@ -844,6 +851,7 @@ int v3_vmcs_get_field_len(vmcs_field_t field) {
         case VMCS_GUEST_DBG_CTL_HIGH:
         case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
        case VMCS_HOST_PERF_GLOBAL_CTRL_HIGH:
+       case VMCS_GUEST_EFER_HIGH:
             return 4;
 
             /* Natural Width Control Fields */
@@ -907,10 +915,11 @@ int v3_vmcs_get_field_len(vmcs_field_t field) {
         case VMCS_HOST_SYSENTER_EIP:
         case VMCS_HOST_RSP:
         case VMCS_HOST_RIP:
+       case VMCS_GUEST_EFER:
             return sizeof(addr_t);
 
         default:
-           PrintError("Invalid VMCS field\n");
+           PrintError("Invalid VMCS field: 0x%x\n", field);
             return -1;
     }
 }