X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcs.c;h=0b874fd636f207df0b7378e3186edbda08158e27;hb=bdbff6b6e5f78f5a1689f5d77814196ee2e4f6cb;hp=a77de77a7a1755983d0d7258a07c9cbbabb74519;hpb=b1f2d60bdd24fb6f758ad049c0a6859966a38955;p=palacios.git diff --git a/palacios/src/palacios/vmcs.c b/palacios/src/palacios/vmcs.c index a77de77..0b874fd 100644 --- a/palacios/src/palacios/vmcs.c +++ b/palacios/src/palacios/vmcs.c @@ -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; } }