diff options
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r-- | arch/x86/kvm/vmx.c | 441 |
1 files changed, 351 insertions, 90 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 064d0be67ecc..1f1da43ff2a2 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -373,6 +373,7 @@ struct nested_vmx { | |||
373 | * we must keep them pinned while L2 runs. | 373 | * we must keep them pinned while L2 runs. |
374 | */ | 374 | */ |
375 | struct page *apic_access_page; | 375 | struct page *apic_access_page; |
376 | u64 msr_ia32_feature_control; | ||
376 | }; | 377 | }; |
377 | 378 | ||
378 | #define POSTED_INTR_ON 0 | 379 | #define POSTED_INTR_ON 0 |
@@ -711,10 +712,10 @@ static void nested_release_page_clean(struct page *page) | |||
711 | kvm_release_page_clean(page); | 712 | kvm_release_page_clean(page); |
712 | } | 713 | } |
713 | 714 | ||
715 | static unsigned long nested_ept_get_cr3(struct kvm_vcpu *vcpu); | ||
714 | static u64 construct_eptp(unsigned long root_hpa); | 716 | static u64 construct_eptp(unsigned long root_hpa); |
715 | static void kvm_cpu_vmxon(u64 addr); | 717 | static void kvm_cpu_vmxon(u64 addr); |
716 | static void kvm_cpu_vmxoff(void); | 718 | static void kvm_cpu_vmxoff(void); |
717 | static void vmx_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3); | ||
718 | static int vmx_set_tss_addr(struct kvm *kvm, unsigned int addr); | 719 | static int vmx_set_tss_addr(struct kvm *kvm, unsigned int addr); |
719 | static void vmx_set_segment(struct kvm_vcpu *vcpu, | 720 | static void vmx_set_segment(struct kvm_vcpu *vcpu, |
720 | struct kvm_segment *var, int seg); | 721 | struct kvm_segment *var, int seg); |
@@ -1039,12 +1040,16 @@ static inline bool nested_cpu_has2(struct vmcs12 *vmcs12, u32 bit) | |||
1039 | (vmcs12->secondary_vm_exec_control & bit); | 1040 | (vmcs12->secondary_vm_exec_control & bit); |
1040 | } | 1041 | } |
1041 | 1042 | ||
1042 | static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12, | 1043 | static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12) |
1043 | struct kvm_vcpu *vcpu) | ||
1044 | { | 1044 | { |
1045 | return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS; | 1045 | return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS; |
1046 | } | 1046 | } |
1047 | 1047 | ||
1048 | static inline int nested_cpu_has_ept(struct vmcs12 *vmcs12) | ||
1049 | { | ||
1050 | return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_EPT); | ||
1051 | } | ||
1052 | |||
1048 | static inline bool is_exception(u32 intr_info) | 1053 | static inline bool is_exception(u32 intr_info) |
1049 | { | 1054 | { |
1050 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK)) | 1055 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK)) |
@@ -2155,6 +2160,7 @@ static u32 nested_vmx_pinbased_ctls_low, nested_vmx_pinbased_ctls_high; | |||
2155 | static u32 nested_vmx_exit_ctls_low, nested_vmx_exit_ctls_high; | 2160 | static u32 nested_vmx_exit_ctls_low, nested_vmx_exit_ctls_high; |
2156 | static u32 nested_vmx_entry_ctls_low, nested_vmx_entry_ctls_high; | 2161 | static u32 nested_vmx_entry_ctls_low, nested_vmx_entry_ctls_high; |
2157 | static u32 nested_vmx_misc_low, nested_vmx_misc_high; | 2162 | static u32 nested_vmx_misc_low, nested_vmx_misc_high; |
2163 | static u32 nested_vmx_ept_caps; | ||
2158 | static __init void nested_vmx_setup_ctls_msrs(void) | 2164 | static __init void nested_vmx_setup_ctls_msrs(void) |
2159 | { | 2165 | { |
2160 | /* | 2166 | /* |
@@ -2190,14 +2196,17 @@ static __init void nested_vmx_setup_ctls_msrs(void) | |||
2190 | * If bit 55 of VMX_BASIC is off, bits 0-8 and 10, 11, 13, 14, 16 and | 2196 | * If bit 55 of VMX_BASIC is off, bits 0-8 and 10, 11, 13, 14, 16 and |
2191 | * 17 must be 1. | 2197 | * 17 must be 1. |
2192 | */ | 2198 | */ |
2199 | rdmsr(MSR_IA32_VMX_EXIT_CTLS, | ||
2200 | nested_vmx_exit_ctls_low, nested_vmx_exit_ctls_high); | ||
2193 | nested_vmx_exit_ctls_low = VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR; | 2201 | nested_vmx_exit_ctls_low = VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR; |
2194 | /* Note that guest use of VM_EXIT_ACK_INTR_ON_EXIT is not supported. */ | 2202 | /* Note that guest use of VM_EXIT_ACK_INTR_ON_EXIT is not supported. */ |
2203 | nested_vmx_exit_ctls_high &= | ||
2195 | #ifdef CONFIG_X86_64 | 2204 | #ifdef CONFIG_X86_64 |
2196 | nested_vmx_exit_ctls_high = VM_EXIT_HOST_ADDR_SPACE_SIZE; | 2205 | VM_EXIT_HOST_ADDR_SPACE_SIZE | |
2197 | #else | ||
2198 | nested_vmx_exit_ctls_high = 0; | ||
2199 | #endif | 2206 | #endif |
2200 | nested_vmx_exit_ctls_high |= VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR; | 2207 | VM_EXIT_LOAD_IA32_PAT | VM_EXIT_SAVE_IA32_PAT; |
2208 | nested_vmx_exit_ctls_high |= (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | | ||
2209 | VM_EXIT_LOAD_IA32_EFER); | ||
2201 | 2210 | ||
2202 | /* entry controls */ | 2211 | /* entry controls */ |
2203 | rdmsr(MSR_IA32_VMX_ENTRY_CTLS, | 2212 | rdmsr(MSR_IA32_VMX_ENTRY_CTLS, |
@@ -2205,8 +2214,12 @@ static __init void nested_vmx_setup_ctls_msrs(void) | |||
2205 | /* If bit 55 of VMX_BASIC is off, bits 0-8 and 12 must be 1. */ | 2214 | /* If bit 55 of VMX_BASIC is off, bits 0-8 and 12 must be 1. */ |
2206 | nested_vmx_entry_ctls_low = VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR; | 2215 | nested_vmx_entry_ctls_low = VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR; |
2207 | nested_vmx_entry_ctls_high &= | 2216 | nested_vmx_entry_ctls_high &= |
2208 | VM_ENTRY_LOAD_IA32_PAT | VM_ENTRY_IA32E_MODE; | 2217 | #ifdef CONFIG_X86_64 |
2209 | nested_vmx_entry_ctls_high |= VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR; | 2218 | VM_ENTRY_IA32E_MODE | |
2219 | #endif | ||
2220 | VM_ENTRY_LOAD_IA32_PAT; | ||
2221 | nested_vmx_entry_ctls_high |= (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | | ||
2222 | VM_ENTRY_LOAD_IA32_EFER); | ||
2210 | 2223 | ||
2211 | /* cpu-based controls */ | 2224 | /* cpu-based controls */ |
2212 | rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, | 2225 | rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, |
@@ -2241,6 +2254,22 @@ static __init void nested_vmx_setup_ctls_msrs(void) | |||
2241 | SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | | 2254 | SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | |
2242 | SECONDARY_EXEC_WBINVD_EXITING; | 2255 | SECONDARY_EXEC_WBINVD_EXITING; |
2243 | 2256 | ||
2257 | if (enable_ept) { | ||
2258 | /* nested EPT: emulate EPT also to L1 */ | ||
2259 | nested_vmx_secondary_ctls_high |= SECONDARY_EXEC_ENABLE_EPT; | ||
2260 | nested_vmx_ept_caps = VMX_EPT_PAGE_WALK_4_BIT | | ||
2261 | VMX_EPTP_WB_BIT | VMX_EPT_INVEPT_BIT; | ||
2262 | nested_vmx_ept_caps &= vmx_capability.ept; | ||
2263 | /* | ||
2264 | * Since invept is completely emulated we support both global | ||
2265 | * and context invalidation independent of what host cpu | ||
2266 | * supports | ||
2267 | */ | ||
2268 | nested_vmx_ept_caps |= VMX_EPT_EXTENT_GLOBAL_BIT | | ||
2269 | VMX_EPT_EXTENT_CONTEXT_BIT; | ||
2270 | } else | ||
2271 | nested_vmx_ept_caps = 0; | ||
2272 | |||
2244 | /* miscellaneous data */ | 2273 | /* miscellaneous data */ |
2245 | rdmsr(MSR_IA32_VMX_MISC, nested_vmx_misc_low, nested_vmx_misc_high); | 2274 | rdmsr(MSR_IA32_VMX_MISC, nested_vmx_misc_low, nested_vmx_misc_high); |
2246 | nested_vmx_misc_low &= VMX_MISC_PREEMPTION_TIMER_RATE_MASK | | 2275 | nested_vmx_misc_low &= VMX_MISC_PREEMPTION_TIMER_RATE_MASK | |
@@ -2282,8 +2311,11 @@ static int vmx_get_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) | |||
2282 | 2311 | ||
2283 | switch (msr_index) { | 2312 | switch (msr_index) { |
2284 | case MSR_IA32_FEATURE_CONTROL: | 2313 | case MSR_IA32_FEATURE_CONTROL: |
2285 | *pdata = 0; | 2314 | if (nested_vmx_allowed(vcpu)) { |
2286 | break; | 2315 | *pdata = to_vmx(vcpu)->nested.msr_ia32_feature_control; |
2316 | break; | ||
2317 | } | ||
2318 | return 0; | ||
2287 | case MSR_IA32_VMX_BASIC: | 2319 | case MSR_IA32_VMX_BASIC: |
2288 | /* | 2320 | /* |
2289 | * This MSR reports some information about VMX support. We | 2321 | * This MSR reports some information about VMX support. We |
@@ -2346,8 +2378,8 @@ static int vmx_get_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) | |||
2346 | nested_vmx_secondary_ctls_high); | 2378 | nested_vmx_secondary_ctls_high); |
2347 | break; | 2379 | break; |
2348 | case MSR_IA32_VMX_EPT_VPID_CAP: | 2380 | case MSR_IA32_VMX_EPT_VPID_CAP: |
2349 | /* Currently, no nested ept or nested vpid */ | 2381 | /* Currently, no nested vpid support */ |
2350 | *pdata = 0; | 2382 | *pdata = nested_vmx_ept_caps; |
2351 | break; | 2383 | break; |
2352 | default: | 2384 | default: |
2353 | return 0; | 2385 | return 0; |
@@ -2356,14 +2388,24 @@ static int vmx_get_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) | |||
2356 | return 1; | 2388 | return 1; |
2357 | } | 2389 | } |
2358 | 2390 | ||
2359 | static int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) | 2391 | static int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) |
2360 | { | 2392 | { |
2393 | u32 msr_index = msr_info->index; | ||
2394 | u64 data = msr_info->data; | ||
2395 | bool host_initialized = msr_info->host_initiated; | ||
2396 | |||
2361 | if (!nested_vmx_allowed(vcpu)) | 2397 | if (!nested_vmx_allowed(vcpu)) |
2362 | return 0; | 2398 | return 0; |
2363 | 2399 | ||
2364 | if (msr_index == MSR_IA32_FEATURE_CONTROL) | 2400 | if (msr_index == MSR_IA32_FEATURE_CONTROL) { |
2365 | /* TODO: the right thing. */ | 2401 | if (!host_initialized && |
2402 | to_vmx(vcpu)->nested.msr_ia32_feature_control | ||
2403 | & FEATURE_CONTROL_LOCKED) | ||
2404 | return 0; | ||
2405 | to_vmx(vcpu)->nested.msr_ia32_feature_control = data; | ||
2366 | return 1; | 2406 | return 1; |
2407 | } | ||
2408 | |||
2367 | /* | 2409 | /* |
2368 | * No need to treat VMX capability MSRs specially: If we don't handle | 2410 | * No need to treat VMX capability MSRs specially: If we don't handle |
2369 | * them, handle_wrmsr will #GP(0), which is correct (they are readonly) | 2411 | * them, handle_wrmsr will #GP(0), which is correct (they are readonly) |
@@ -2494,7 +2536,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
2494 | return 1; | 2536 | return 1; |
2495 | /* Otherwise falls through */ | 2537 | /* Otherwise falls through */ |
2496 | default: | 2538 | default: |
2497 | if (vmx_set_vmx_msr(vcpu, msr_index, data)) | 2539 | if (vmx_set_vmx_msr(vcpu, msr_info)) |
2498 | break; | 2540 | break; |
2499 | msr = find_msr_entry(vmx, msr_index); | 2541 | msr = find_msr_entry(vmx, msr_index); |
2500 | if (msr) { | 2542 | if (msr) { |
@@ -5302,9 +5344,13 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu) | |||
5302 | 5344 | ||
5303 | /* It is a write fault? */ | 5345 | /* It is a write fault? */ |
5304 | error_code = exit_qualification & (1U << 1); | 5346 | error_code = exit_qualification & (1U << 1); |
5347 | /* It is a fetch fault? */ | ||
5348 | error_code |= (exit_qualification & (1U << 2)) << 2; | ||
5305 | /* ept page table is present? */ | 5349 | /* ept page table is present? */ |
5306 | error_code |= (exit_qualification >> 3) & 0x1; | 5350 | error_code |= (exit_qualification >> 3) & 0x1; |
5307 | 5351 | ||
5352 | vcpu->arch.exit_qualification = exit_qualification; | ||
5353 | |||
5308 | return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0); | 5354 | return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0); |
5309 | } | 5355 | } |
5310 | 5356 | ||
@@ -5438,7 +5484,8 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu) | |||
5438 | 5484 | ||
5439 | err = emulate_instruction(vcpu, EMULTYPE_NO_REEXECUTE); | 5485 | err = emulate_instruction(vcpu, EMULTYPE_NO_REEXECUTE); |
5440 | 5486 | ||
5441 | if (err == EMULATE_DO_MMIO) { | 5487 | if (err == EMULATE_USER_EXIT) { |
5488 | ++vcpu->stat.mmio_exits; | ||
5442 | ret = 0; | 5489 | ret = 0; |
5443 | goto out; | 5490 | goto out; |
5444 | } | 5491 | } |
@@ -5567,8 +5614,47 @@ static void nested_free_all_saved_vmcss(struct vcpu_vmx *vmx) | |||
5567 | free_loaded_vmcs(&vmx->vmcs01); | 5614 | free_loaded_vmcs(&vmx->vmcs01); |
5568 | } | 5615 | } |
5569 | 5616 | ||
5617 | /* | ||
5618 | * The following 3 functions, nested_vmx_succeed()/failValid()/failInvalid(), | ||
5619 | * set the success or error code of an emulated VMX instruction, as specified | ||
5620 | * by Vol 2B, VMX Instruction Reference, "Conventions". | ||
5621 | */ | ||
5622 | static void nested_vmx_succeed(struct kvm_vcpu *vcpu) | ||
5623 | { | ||
5624 | vmx_set_rflags(vcpu, vmx_get_rflags(vcpu) | ||
5625 | & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | | ||
5626 | X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF)); | ||
5627 | } | ||
5628 | |||
5629 | static void nested_vmx_failInvalid(struct kvm_vcpu *vcpu) | ||
5630 | { | ||
5631 | vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu) | ||
5632 | & ~(X86_EFLAGS_PF | X86_EFLAGS_AF | X86_EFLAGS_ZF | | ||
5633 | X86_EFLAGS_SF | X86_EFLAGS_OF)) | ||
5634 | | X86_EFLAGS_CF); | ||
5635 | } | ||
5636 | |||
5570 | static void nested_vmx_failValid(struct kvm_vcpu *vcpu, | 5637 | static void nested_vmx_failValid(struct kvm_vcpu *vcpu, |
5571 | u32 vm_instruction_error); | 5638 | u32 vm_instruction_error) |
5639 | { | ||
5640 | if (to_vmx(vcpu)->nested.current_vmptr == -1ull) { | ||
5641 | /* | ||
5642 | * failValid writes the error number to the current VMCS, which | ||
5643 | * can't be done there isn't a current VMCS. | ||
5644 | */ | ||
5645 | nested_vmx_failInvalid(vcpu); | ||
5646 | return; | ||
5647 | } | ||
5648 | vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu) | ||
5649 | & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | | ||
5650 | X86_EFLAGS_SF | X86_EFLAGS_OF)) | ||
5651 | | X86_EFLAGS_ZF); | ||
5652 | get_vmcs12(vcpu)->vm_instruction_error = vm_instruction_error; | ||
5653 | /* | ||
5654 | * We don't need to force a shadow sync because | ||
5655 | * VM_INSTRUCTION_ERROR is not shadowed | ||
5656 | */ | ||
5657 | } | ||
5572 | 5658 | ||
5573 | /* | 5659 | /* |
5574 | * Emulate the VMXON instruction. | 5660 | * Emulate the VMXON instruction. |
@@ -5583,6 +5669,8 @@ static int handle_vmon(struct kvm_vcpu *vcpu) | |||
5583 | struct kvm_segment cs; | 5669 | struct kvm_segment cs; |
5584 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 5670 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
5585 | struct vmcs *shadow_vmcs; | 5671 | struct vmcs *shadow_vmcs; |
5672 | const u64 VMXON_NEEDED_FEATURES = FEATURE_CONTROL_LOCKED | ||
5673 | | FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX; | ||
5586 | 5674 | ||
5587 | /* The Intel VMX Instruction Reference lists a bunch of bits that | 5675 | /* The Intel VMX Instruction Reference lists a bunch of bits that |
5588 | * are prerequisite to running VMXON, most notably cr4.VMXE must be | 5676 | * are prerequisite to running VMXON, most notably cr4.VMXE must be |
@@ -5611,6 +5699,13 @@ static int handle_vmon(struct kvm_vcpu *vcpu) | |||
5611 | skip_emulated_instruction(vcpu); | 5699 | skip_emulated_instruction(vcpu); |
5612 | return 1; | 5700 | return 1; |
5613 | } | 5701 | } |
5702 | |||
5703 | if ((vmx->nested.msr_ia32_feature_control & VMXON_NEEDED_FEATURES) | ||
5704 | != VMXON_NEEDED_FEATURES) { | ||
5705 | kvm_inject_gp(vcpu, 0); | ||
5706 | return 1; | ||
5707 | } | ||
5708 | |||
5614 | if (enable_shadow_vmcs) { | 5709 | if (enable_shadow_vmcs) { |
5615 | shadow_vmcs = alloc_vmcs(); | 5710 | shadow_vmcs = alloc_vmcs(); |
5616 | if (!shadow_vmcs) | 5711 | if (!shadow_vmcs) |
@@ -5628,6 +5723,7 @@ static int handle_vmon(struct kvm_vcpu *vcpu) | |||
5628 | vmx->nested.vmxon = true; | 5723 | vmx->nested.vmxon = true; |
5629 | 5724 | ||
5630 | skip_emulated_instruction(vcpu); | 5725 | skip_emulated_instruction(vcpu); |
5726 | nested_vmx_succeed(vcpu); | ||
5631 | return 1; | 5727 | return 1; |
5632 | } | 5728 | } |
5633 | 5729 | ||
@@ -5712,6 +5808,7 @@ static int handle_vmoff(struct kvm_vcpu *vcpu) | |||
5712 | return 1; | 5808 | return 1; |
5713 | free_nested(to_vmx(vcpu)); | 5809 | free_nested(to_vmx(vcpu)); |
5714 | skip_emulated_instruction(vcpu); | 5810 | skip_emulated_instruction(vcpu); |
5811 | nested_vmx_succeed(vcpu); | ||
5715 | return 1; | 5812 | return 1; |
5716 | } | 5813 | } |
5717 | 5814 | ||
@@ -5768,48 +5865,6 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu, | |||
5768 | return 0; | 5865 | return 0; |
5769 | } | 5866 | } |
5770 | 5867 | ||
5771 | /* | ||
5772 | * The following 3 functions, nested_vmx_succeed()/failValid()/failInvalid(), | ||
5773 | * set the success or error code of an emulated VMX instruction, as specified | ||
5774 | * by Vol 2B, VMX Instruction Reference, "Conventions". | ||
5775 | */ | ||
5776 | static void nested_vmx_succeed(struct kvm_vcpu *vcpu) | ||
5777 | { | ||
5778 | vmx_set_rflags(vcpu, vmx_get_rflags(vcpu) | ||
5779 | & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | | ||
5780 | X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF)); | ||
5781 | } | ||
5782 | |||
5783 | static void nested_vmx_failInvalid(struct kvm_vcpu *vcpu) | ||
5784 | { | ||
5785 | vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu) | ||
5786 | & ~(X86_EFLAGS_PF | X86_EFLAGS_AF | X86_EFLAGS_ZF | | ||
5787 | X86_EFLAGS_SF | X86_EFLAGS_OF)) | ||
5788 | | X86_EFLAGS_CF); | ||
5789 | } | ||
5790 | |||
5791 | static void nested_vmx_failValid(struct kvm_vcpu *vcpu, | ||
5792 | u32 vm_instruction_error) | ||
5793 | { | ||
5794 | if (to_vmx(vcpu)->nested.current_vmptr == -1ull) { | ||
5795 | /* | ||
5796 | * failValid writes the error number to the current VMCS, which | ||
5797 | * can't be done there isn't a current VMCS. | ||
5798 | */ | ||
5799 | nested_vmx_failInvalid(vcpu); | ||
5800 | return; | ||
5801 | } | ||
5802 | vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu) | ||
5803 | & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | | ||
5804 | X86_EFLAGS_SF | X86_EFLAGS_OF)) | ||
5805 | | X86_EFLAGS_ZF); | ||
5806 | get_vmcs12(vcpu)->vm_instruction_error = vm_instruction_error; | ||
5807 | /* | ||
5808 | * We don't need to force a shadow sync because | ||
5809 | * VM_INSTRUCTION_ERROR is not shadowed | ||
5810 | */ | ||
5811 | } | ||
5812 | |||
5813 | /* Emulate the VMCLEAR instruction */ | 5868 | /* Emulate the VMCLEAR instruction */ |
5814 | static int handle_vmclear(struct kvm_vcpu *vcpu) | 5869 | static int handle_vmclear(struct kvm_vcpu *vcpu) |
5815 | { | 5870 | { |
@@ -5972,8 +6027,8 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx) | |||
5972 | unsigned long field; | 6027 | unsigned long field; |
5973 | u64 field_value; | 6028 | u64 field_value; |
5974 | struct vmcs *shadow_vmcs = vmx->nested.current_shadow_vmcs; | 6029 | struct vmcs *shadow_vmcs = vmx->nested.current_shadow_vmcs; |
5975 | unsigned long *fields = (unsigned long *)shadow_read_write_fields; | 6030 | const unsigned long *fields = shadow_read_write_fields; |
5976 | int num_fields = max_shadow_read_write_fields; | 6031 | const int num_fields = max_shadow_read_write_fields; |
5977 | 6032 | ||
5978 | vmcs_load(shadow_vmcs); | 6033 | vmcs_load(shadow_vmcs); |
5979 | 6034 | ||
@@ -6002,12 +6057,11 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx) | |||
6002 | 6057 | ||
6003 | static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx) | 6058 | static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx) |
6004 | { | 6059 | { |
6005 | unsigned long *fields[] = { | 6060 | const unsigned long *fields[] = { |
6006 | (unsigned long *)shadow_read_write_fields, | 6061 | shadow_read_write_fields, |
6007 | (unsigned long *)shadow_read_only_fields | 6062 | shadow_read_only_fields |
6008 | }; | 6063 | }; |
6009 | int num_lists = ARRAY_SIZE(fields); | 6064 | const int max_fields[] = { |
6010 | int max_fields[] = { | ||
6011 | max_shadow_read_write_fields, | 6065 | max_shadow_read_write_fields, |
6012 | max_shadow_read_only_fields | 6066 | max_shadow_read_only_fields |
6013 | }; | 6067 | }; |
@@ -6018,7 +6072,7 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx) | |||
6018 | 6072 | ||
6019 | vmcs_load(shadow_vmcs); | 6073 | vmcs_load(shadow_vmcs); |
6020 | 6074 | ||
6021 | for (q = 0; q < num_lists; q++) { | 6075 | for (q = 0; q < ARRAY_SIZE(fields); q++) { |
6022 | for (i = 0; i < max_fields[q]; i++) { | 6076 | for (i = 0; i < max_fields[q]; i++) { |
6023 | field = fields[q][i]; | 6077 | field = fields[q][i]; |
6024 | vmcs12_read_any(&vmx->vcpu, field, &field_value); | 6078 | vmcs12_read_any(&vmx->vcpu, field, &field_value); |
@@ -6248,6 +6302,74 @@ static int handle_vmptrst(struct kvm_vcpu *vcpu) | |||
6248 | return 1; | 6302 | return 1; |
6249 | } | 6303 | } |
6250 | 6304 | ||
6305 | /* Emulate the INVEPT instruction */ | ||
6306 | static int handle_invept(struct kvm_vcpu *vcpu) | ||
6307 | { | ||
6308 | u32 vmx_instruction_info, types; | ||
6309 | unsigned long type; | ||
6310 | gva_t gva; | ||
6311 | struct x86_exception e; | ||
6312 | struct { | ||
6313 | u64 eptp, gpa; | ||
6314 | } operand; | ||
6315 | u64 eptp_mask = ((1ull << 51) - 1) & PAGE_MASK; | ||
6316 | |||
6317 | if (!(nested_vmx_secondary_ctls_high & SECONDARY_EXEC_ENABLE_EPT) || | ||
6318 | !(nested_vmx_ept_caps & VMX_EPT_INVEPT_BIT)) { | ||
6319 | kvm_queue_exception(vcpu, UD_VECTOR); | ||
6320 | return 1; | ||
6321 | } | ||
6322 | |||
6323 | if (!nested_vmx_check_permission(vcpu)) | ||
6324 | return 1; | ||
6325 | |||
6326 | if (!kvm_read_cr0_bits(vcpu, X86_CR0_PE)) { | ||
6327 | kvm_queue_exception(vcpu, UD_VECTOR); | ||
6328 | return 1; | ||
6329 | } | ||
6330 | |||
6331 | vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); | ||
6332 | type = kvm_register_read(vcpu, (vmx_instruction_info >> 28) & 0xf); | ||
6333 | |||
6334 | types = (nested_vmx_ept_caps >> VMX_EPT_EXTENT_SHIFT) & 6; | ||
6335 | |||
6336 | if (!(types & (1UL << type))) { | ||
6337 | nested_vmx_failValid(vcpu, | ||
6338 | VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID); | ||
6339 | return 1; | ||
6340 | } | ||
6341 | |||
6342 | /* According to the Intel VMX instruction reference, the memory | ||
6343 | * operand is read even if it isn't needed (e.g., for type==global) | ||
6344 | */ | ||
6345 | if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), | ||
6346 | vmx_instruction_info, &gva)) | ||
6347 | return 1; | ||
6348 | if (kvm_read_guest_virt(&vcpu->arch.emulate_ctxt, gva, &operand, | ||
6349 | sizeof(operand), &e)) { | ||
6350 | kvm_inject_page_fault(vcpu, &e); | ||
6351 | return 1; | ||
6352 | } | ||
6353 | |||
6354 | switch (type) { | ||
6355 | case VMX_EPT_EXTENT_CONTEXT: | ||
6356 | if ((operand.eptp & eptp_mask) != | ||
6357 | (nested_ept_get_cr3(vcpu) & eptp_mask)) | ||
6358 | break; | ||
6359 | case VMX_EPT_EXTENT_GLOBAL: | ||
6360 | kvm_mmu_sync_roots(vcpu); | ||
6361 | kvm_mmu_flush_tlb(vcpu); | ||
6362 | nested_vmx_succeed(vcpu); | ||
6363 | break; | ||
6364 | default: | ||
6365 | BUG_ON(1); | ||
6366 | break; | ||
6367 | } | ||
6368 | |||
6369 | skip_emulated_instruction(vcpu); | ||
6370 | return 1; | ||
6371 | } | ||
6372 | |||
6251 | /* | 6373 | /* |
6252 | * The exit handlers return 1 if the exit was handled fully and guest execution | 6374 | * The exit handlers return 1 if the exit was handled fully and guest execution |
6253 | * may resume. Otherwise they set the kvm_run parameter to indicate what needs | 6375 | * may resume. Otherwise they set the kvm_run parameter to indicate what needs |
@@ -6292,6 +6414,7 @@ static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { | |||
6292 | [EXIT_REASON_PAUSE_INSTRUCTION] = handle_pause, | 6414 | [EXIT_REASON_PAUSE_INSTRUCTION] = handle_pause, |
6293 | [EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op, | 6415 | [EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op, |
6294 | [EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op, | 6416 | [EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op, |
6417 | [EXIT_REASON_INVEPT] = handle_invept, | ||
6295 | }; | 6418 | }; |
6296 | 6419 | ||
6297 | static const int kvm_vmx_max_exit_handlers = | 6420 | static const int kvm_vmx_max_exit_handlers = |
@@ -6518,6 +6641,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu) | |||
6518 | case EXIT_REASON_VMPTRST: case EXIT_REASON_VMREAD: | 6641 | case EXIT_REASON_VMPTRST: case EXIT_REASON_VMREAD: |
6519 | case EXIT_REASON_VMRESUME: case EXIT_REASON_VMWRITE: | 6642 | case EXIT_REASON_VMRESUME: case EXIT_REASON_VMWRITE: |
6520 | case EXIT_REASON_VMOFF: case EXIT_REASON_VMON: | 6643 | case EXIT_REASON_VMOFF: case EXIT_REASON_VMON: |
6644 | case EXIT_REASON_INVEPT: | ||
6521 | /* | 6645 | /* |
6522 | * VMX instructions trap unconditionally. This allows L1 to | 6646 | * VMX instructions trap unconditionally. This allows L1 to |
6523 | * emulate them for its L2 guest, i.e., allows 3-level nesting! | 6647 | * emulate them for its L2 guest, i.e., allows 3-level nesting! |
@@ -6550,7 +6674,20 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu) | |||
6550 | return nested_cpu_has2(vmcs12, | 6674 | return nested_cpu_has2(vmcs12, |
6551 | SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES); | 6675 | SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES); |
6552 | case EXIT_REASON_EPT_VIOLATION: | 6676 | case EXIT_REASON_EPT_VIOLATION: |
6677 | /* | ||
6678 | * L0 always deals with the EPT violation. If nested EPT is | ||
6679 | * used, and the nested mmu code discovers that the address is | ||
6680 | * missing in the guest EPT table (EPT12), the EPT violation | ||
6681 | * will be injected with nested_ept_inject_page_fault() | ||
6682 | */ | ||
6683 | return 0; | ||
6553 | case EXIT_REASON_EPT_MISCONFIG: | 6684 | case EXIT_REASON_EPT_MISCONFIG: |
6685 | /* | ||
6686 | * L2 never uses directly L1's EPT, but rather L0's own EPT | ||
6687 | * table (shadow on EPT) or a merged EPT table that L0 built | ||
6688 | * (EPT on EPT). So any problems with the structure of the | ||
6689 | * table is L0's fault. | ||
6690 | */ | ||
6554 | return 0; | 6691 | return 0; |
6555 | case EXIT_REASON_PREEMPTION_TIMER: | 6692 | case EXIT_REASON_PREEMPTION_TIMER: |
6556 | return vmcs12->pin_based_vm_exec_control & | 6693 | return vmcs12->pin_based_vm_exec_control & |
@@ -6638,7 +6775,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu) | |||
6638 | 6775 | ||
6639 | if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked && | 6776 | if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked && |
6640 | !(is_guest_mode(vcpu) && nested_cpu_has_virtual_nmis( | 6777 | !(is_guest_mode(vcpu) && nested_cpu_has_virtual_nmis( |
6641 | get_vmcs12(vcpu), vcpu)))) { | 6778 | get_vmcs12(vcpu))))) { |
6642 | if (vmx_interrupt_allowed(vcpu)) { | 6779 | if (vmx_interrupt_allowed(vcpu)) { |
6643 | vmx->soft_vnmi_blocked = 0; | 6780 | vmx->soft_vnmi_blocked = 0; |
6644 | } else if (vmx->vnmi_blocked_time > 1000000000LL && | 6781 | } else if (vmx->vnmi_blocked_time > 1000000000LL && |
@@ -7326,6 +7463,48 @@ static void vmx_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry) | |||
7326 | entry->ecx |= bit(X86_FEATURE_VMX); | 7463 | entry->ecx |= bit(X86_FEATURE_VMX); |
7327 | } | 7464 | } |
7328 | 7465 | ||
7466 | static void nested_ept_inject_page_fault(struct kvm_vcpu *vcpu, | ||
7467 | struct x86_exception *fault) | ||
7468 | { | ||
7469 | struct vmcs12 *vmcs12; | ||
7470 | nested_vmx_vmexit(vcpu); | ||
7471 | vmcs12 = get_vmcs12(vcpu); | ||
7472 | |||
7473 | if (fault->error_code & PFERR_RSVD_MASK) | ||
7474 | vmcs12->vm_exit_reason = EXIT_REASON_EPT_MISCONFIG; | ||
7475 | else | ||
7476 | vmcs12->vm_exit_reason = EXIT_REASON_EPT_VIOLATION; | ||
7477 | vmcs12->exit_qualification = vcpu->arch.exit_qualification; | ||
7478 | vmcs12->guest_physical_address = fault->address; | ||
7479 | } | ||
7480 | |||
7481 | /* Callbacks for nested_ept_init_mmu_context: */ | ||
7482 | |||
7483 | static unsigned long nested_ept_get_cr3(struct kvm_vcpu *vcpu) | ||
7484 | { | ||
7485 | /* return the page table to be shadowed - in our case, EPT12 */ | ||
7486 | return get_vmcs12(vcpu)->ept_pointer; | ||
7487 | } | ||
7488 | |||
7489 | static int nested_ept_init_mmu_context(struct kvm_vcpu *vcpu) | ||
7490 | { | ||
7491 | int r = kvm_init_shadow_ept_mmu(vcpu, &vcpu->arch.mmu, | ||
7492 | nested_vmx_ept_caps & VMX_EPT_EXECUTE_ONLY_BIT); | ||
7493 | |||
7494 | vcpu->arch.mmu.set_cr3 = vmx_set_cr3; | ||
7495 | vcpu->arch.mmu.get_cr3 = nested_ept_get_cr3; | ||
7496 | vcpu->arch.mmu.inject_page_fault = nested_ept_inject_page_fault; | ||
7497 | |||
7498 | vcpu->arch.walk_mmu = &vcpu->arch.nested_mmu; | ||
7499 | |||
7500 | return r; | ||
7501 | } | ||
7502 | |||
7503 | static void nested_ept_uninit_mmu_context(struct kvm_vcpu *vcpu) | ||
7504 | { | ||
7505 | vcpu->arch.walk_mmu = &vcpu->arch.mmu; | ||
7506 | } | ||
7507 | |||
7329 | /* | 7508 | /* |
7330 | * prepare_vmcs02 is called when the L1 guest hypervisor runs its nested | 7509 | * prepare_vmcs02 is called when the L1 guest hypervisor runs its nested |
7331 | * L2 guest. L1 has a vmcs for L2 (vmcs12), and this function "merges" it | 7510 | * L2 guest. L1 has a vmcs for L2 (vmcs12), and this function "merges" it |
@@ -7388,7 +7567,7 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
7388 | vmcs12->guest_interruptibility_info); | 7567 | vmcs12->guest_interruptibility_info); |
7389 | vmcs_write32(GUEST_SYSENTER_CS, vmcs12->guest_sysenter_cs); | 7568 | vmcs_write32(GUEST_SYSENTER_CS, vmcs12->guest_sysenter_cs); |
7390 | kvm_set_dr(vcpu, 7, vmcs12->guest_dr7); | 7569 | kvm_set_dr(vcpu, 7, vmcs12->guest_dr7); |
7391 | vmcs_writel(GUEST_RFLAGS, vmcs12->guest_rflags); | 7570 | vmx_set_rflags(vcpu, vmcs12->guest_rflags); |
7392 | vmcs_writel(GUEST_PENDING_DBG_EXCEPTIONS, | 7571 | vmcs_writel(GUEST_PENDING_DBG_EXCEPTIONS, |
7393 | vmcs12->guest_pending_dbg_exceptions); | 7572 | vmcs12->guest_pending_dbg_exceptions); |
7394 | vmcs_writel(GUEST_SYSENTER_ESP, vmcs12->guest_sysenter_esp); | 7573 | vmcs_writel(GUEST_SYSENTER_ESP, vmcs12->guest_sysenter_esp); |
@@ -7508,15 +7687,24 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
7508 | vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask; | 7687 | vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask; |
7509 | vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits); | 7688 | vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits); |
7510 | 7689 | ||
7511 | /* Note: IA32_MODE, LOAD_IA32_EFER are modified by vmx_set_efer below */ | 7690 | /* L2->L1 exit controls are emulated - the hardware exit is to L0 so |
7512 | vmcs_write32(VM_EXIT_CONTROLS, | 7691 | * we should use its exit controls. Note that VM_EXIT_LOAD_IA32_EFER |
7513 | vmcs12->vm_exit_controls | vmcs_config.vmexit_ctrl); | 7692 | * bits are further modified by vmx_set_efer() below. |
7514 | vmcs_write32(VM_ENTRY_CONTROLS, vmcs12->vm_entry_controls | | 7693 | */ |
7694 | vmcs_write32(VM_EXIT_CONTROLS, vmcs_config.vmexit_ctrl); | ||
7695 | |||
7696 | /* vmcs12's VM_ENTRY_LOAD_IA32_EFER and VM_ENTRY_IA32E_MODE are | ||
7697 | * emulated by vmx_set_efer(), below. | ||
7698 | */ | ||
7699 | vmcs_write32(VM_ENTRY_CONTROLS, | ||
7700 | (vmcs12->vm_entry_controls & ~VM_ENTRY_LOAD_IA32_EFER & | ||
7701 | ~VM_ENTRY_IA32E_MODE) | | ||
7515 | (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE)); | 7702 | (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE)); |
7516 | 7703 | ||
7517 | if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT) | 7704 | if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT) { |
7518 | vmcs_write64(GUEST_IA32_PAT, vmcs12->guest_ia32_pat); | 7705 | vmcs_write64(GUEST_IA32_PAT, vmcs12->guest_ia32_pat); |
7519 | else if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) | 7706 | vcpu->arch.pat = vmcs12->guest_ia32_pat; |
7707 | } else if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) | ||
7520 | vmcs_write64(GUEST_IA32_PAT, vmx->vcpu.arch.pat); | 7708 | vmcs_write64(GUEST_IA32_PAT, vmx->vcpu.arch.pat); |
7521 | 7709 | ||
7522 | 7710 | ||
@@ -7538,6 +7726,11 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
7538 | vmx_flush_tlb(vcpu); | 7726 | vmx_flush_tlb(vcpu); |
7539 | } | 7727 | } |
7540 | 7728 | ||
7729 | if (nested_cpu_has_ept(vmcs12)) { | ||
7730 | kvm_mmu_unload(vcpu); | ||
7731 | nested_ept_init_mmu_context(vcpu); | ||
7732 | } | ||
7733 | |||
7541 | if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER) | 7734 | if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER) |
7542 | vcpu->arch.efer = vmcs12->guest_ia32_efer; | 7735 | vcpu->arch.efer = vmcs12->guest_ia32_efer; |
7543 | else if (vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) | 7736 | else if (vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) |
@@ -7565,6 +7758,16 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
7565 | kvm_set_cr3(vcpu, vmcs12->guest_cr3); | 7758 | kvm_set_cr3(vcpu, vmcs12->guest_cr3); |
7566 | kvm_mmu_reset_context(vcpu); | 7759 | kvm_mmu_reset_context(vcpu); |
7567 | 7760 | ||
7761 | /* | ||
7762 | * L1 may access the L2's PDPTR, so save them to construct vmcs12 | ||
7763 | */ | ||
7764 | if (enable_ept) { | ||
7765 | vmcs_write64(GUEST_PDPTR0, vmcs12->guest_pdptr0); | ||
7766 | vmcs_write64(GUEST_PDPTR1, vmcs12->guest_pdptr1); | ||
7767 | vmcs_write64(GUEST_PDPTR2, vmcs12->guest_pdptr2); | ||
7768 | vmcs_write64(GUEST_PDPTR3, vmcs12->guest_pdptr3); | ||
7769 | } | ||
7770 | |||
7568 | kvm_register_write(vcpu, VCPU_REGS_RSP, vmcs12->guest_rsp); | 7771 | kvm_register_write(vcpu, VCPU_REGS_RSP, vmcs12->guest_rsp); |
7569 | kvm_register_write(vcpu, VCPU_REGS_RIP, vmcs12->guest_rip); | 7772 | kvm_register_write(vcpu, VCPU_REGS_RIP, vmcs12->guest_rip); |
7570 | } | 7773 | } |
@@ -7887,6 +8090,22 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
7887 | vmcs12->guest_pending_dbg_exceptions = | 8090 | vmcs12->guest_pending_dbg_exceptions = |
7888 | vmcs_readl(GUEST_PENDING_DBG_EXCEPTIONS); | 8091 | vmcs_readl(GUEST_PENDING_DBG_EXCEPTIONS); |
7889 | 8092 | ||
8093 | /* | ||
8094 | * In some cases (usually, nested EPT), L2 is allowed to change its | ||
8095 | * own CR3 without exiting. If it has changed it, we must keep it. | ||
8096 | * Of course, if L0 is using shadow page tables, GUEST_CR3 was defined | ||
8097 | * by L0, not L1 or L2, so we mustn't unconditionally copy it to vmcs12. | ||
8098 | * | ||
8099 | * Additionally, restore L2's PDPTR to vmcs12. | ||
8100 | */ | ||
8101 | if (enable_ept) { | ||
8102 | vmcs12->guest_cr3 = vmcs_read64(GUEST_CR3); | ||
8103 | vmcs12->guest_pdptr0 = vmcs_read64(GUEST_PDPTR0); | ||
8104 | vmcs12->guest_pdptr1 = vmcs_read64(GUEST_PDPTR1); | ||
8105 | vmcs12->guest_pdptr2 = vmcs_read64(GUEST_PDPTR2); | ||
8106 | vmcs12->guest_pdptr3 = vmcs_read64(GUEST_PDPTR3); | ||
8107 | } | ||
8108 | |||
7890 | vmcs12->vm_entry_controls = | 8109 | vmcs12->vm_entry_controls = |
7891 | (vmcs12->vm_entry_controls & ~VM_ENTRY_IA32E_MODE) | | 8110 | (vmcs12->vm_entry_controls & ~VM_ENTRY_IA32E_MODE) | |
7892 | (vmcs_read32(VM_ENTRY_CONTROLS) & VM_ENTRY_IA32E_MODE); | 8111 | (vmcs_read32(VM_ENTRY_CONTROLS) & VM_ENTRY_IA32E_MODE); |
@@ -7948,6 +8167,8 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) | |||
7948 | static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, | 8167 | static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, |
7949 | struct vmcs12 *vmcs12) | 8168 | struct vmcs12 *vmcs12) |
7950 | { | 8169 | { |
8170 | struct kvm_segment seg; | ||
8171 | |||
7951 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_EFER) | 8172 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_EFER) |
7952 | vcpu->arch.efer = vmcs12->host_ia32_efer; | 8173 | vcpu->arch.efer = vmcs12->host_ia32_efer; |
7953 | else if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) | 8174 | else if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) |
@@ -7982,7 +8203,9 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, | |||
7982 | vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK); | 8203 | vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK); |
7983 | kvm_set_cr4(vcpu, vmcs12->host_cr4); | 8204 | kvm_set_cr4(vcpu, vmcs12->host_cr4); |
7984 | 8205 | ||
7985 | /* shadow page tables on either EPT or shadow page tables */ | 8206 | if (nested_cpu_has_ept(vmcs12)) |
8207 | nested_ept_uninit_mmu_context(vcpu); | ||
8208 | |||
7986 | kvm_set_cr3(vcpu, vmcs12->host_cr3); | 8209 | kvm_set_cr3(vcpu, vmcs12->host_cr3); |
7987 | kvm_mmu_reset_context(vcpu); | 8210 | kvm_mmu_reset_context(vcpu); |
7988 | 8211 | ||
@@ -8001,23 +8224,61 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, | |||
8001 | vmcs_writel(GUEST_SYSENTER_EIP, vmcs12->host_ia32_sysenter_eip); | 8224 | vmcs_writel(GUEST_SYSENTER_EIP, vmcs12->host_ia32_sysenter_eip); |
8002 | vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base); | 8225 | vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base); |
8003 | vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base); | 8226 | vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base); |
8004 | vmcs_writel(GUEST_TR_BASE, vmcs12->host_tr_base); | 8227 | |
8005 | vmcs_writel(GUEST_GS_BASE, vmcs12->host_gs_base); | 8228 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PAT) { |
8006 | vmcs_writel(GUEST_FS_BASE, vmcs12->host_fs_base); | ||
8007 | vmcs_write16(GUEST_ES_SELECTOR, vmcs12->host_es_selector); | ||
8008 | vmcs_write16(GUEST_CS_SELECTOR, vmcs12->host_cs_selector); | ||
8009 | vmcs_write16(GUEST_SS_SELECTOR, vmcs12->host_ss_selector); | ||
8010 | vmcs_write16(GUEST_DS_SELECTOR, vmcs12->host_ds_selector); | ||
8011 | vmcs_write16(GUEST_FS_SELECTOR, vmcs12->host_fs_selector); | ||
8012 | vmcs_write16(GUEST_GS_SELECTOR, vmcs12->host_gs_selector); | ||
8013 | vmcs_write16(GUEST_TR_SELECTOR, vmcs12->host_tr_selector); | ||
8014 | |||
8015 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PAT) | ||
8016 | vmcs_write64(GUEST_IA32_PAT, vmcs12->host_ia32_pat); | 8229 | vmcs_write64(GUEST_IA32_PAT, vmcs12->host_ia32_pat); |
8230 | vcpu->arch.pat = vmcs12->host_ia32_pat; | ||
8231 | } | ||
8017 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL) | 8232 | if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL) |
8018 | vmcs_write64(GUEST_IA32_PERF_GLOBAL_CTRL, | 8233 | vmcs_write64(GUEST_IA32_PERF_GLOBAL_CTRL, |
8019 | vmcs12->host_ia32_perf_global_ctrl); | 8234 | vmcs12->host_ia32_perf_global_ctrl); |
8020 | 8235 | ||
8236 | /* Set L1 segment info according to Intel SDM | ||
8237 | 27.5.2 Loading Host Segment and Descriptor-Table Registers */ | ||
8238 | seg = (struct kvm_segment) { | ||
8239 | .base = 0, | ||
8240 | .limit = 0xFFFFFFFF, | ||
8241 | .selector = vmcs12->host_cs_selector, | ||
8242 | .type = 11, | ||
8243 | .present = 1, | ||
8244 | .s = 1, | ||
8245 | .g = 1 | ||
8246 | }; | ||
8247 | if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) | ||
8248 | seg.l = 1; | ||
8249 | else | ||
8250 | seg.db = 1; | ||
8251 | vmx_set_segment(vcpu, &seg, VCPU_SREG_CS); | ||
8252 | seg = (struct kvm_segment) { | ||
8253 | .base = 0, | ||
8254 | .limit = 0xFFFFFFFF, | ||
8255 | .type = 3, | ||
8256 | .present = 1, | ||
8257 | .s = 1, | ||
8258 | .db = 1, | ||
8259 | .g = 1 | ||
8260 | }; | ||
8261 | seg.selector = vmcs12->host_ds_selector; | ||
8262 | vmx_set_segment(vcpu, &seg, VCPU_SREG_DS); | ||
8263 | seg.selector = vmcs12->host_es_selector; | ||
8264 | vmx_set_segment(vcpu, &seg, VCPU_SREG_ES); | ||
8265 | seg.selector = vmcs12->host_ss_selector; | ||
8266 | vmx_set_segment(vcpu, &seg, VCPU_SREG_SS); | ||
8267 | seg.selector = vmcs12->host_fs_selector; | ||
8268 | seg.base = vmcs12->host_fs_base; | ||
8269 | vmx_set_segment(vcpu, &seg, VCPU_SREG_FS); | ||
8270 | seg.selector = vmcs12->host_gs_selector; | ||
8271 | seg.base = vmcs12->host_gs_base; | ||
8272 | vmx_set_segment(vcpu, &seg, VCPU_SREG_GS); | ||
8273 | seg = (struct kvm_segment) { | ||
8274 | .base = vmcs12->host_tr_base, | ||
8275 | .limit = 0x67, | ||
8276 | .selector = vmcs12->host_tr_selector, | ||
8277 | .type = 11, | ||
8278 | .present = 1 | ||
8279 | }; | ||
8280 | vmx_set_segment(vcpu, &seg, VCPU_SREG_TR); | ||
8281 | |||
8021 | kvm_set_dr(vcpu, 7, 0x400); | 8282 | kvm_set_dr(vcpu, 7, 0x400); |
8022 | vmcs_write64(GUEST_IA32_DEBUGCTL, 0); | 8283 | vmcs_write64(GUEST_IA32_DEBUGCTL, 0); |
8023 | } | 8284 | } |