Lines Matching refs:vmcs12

433 struct __packed vmcs12 {  struct
601 BUILD_BUG_ON_MSG(offsetof(struct vmcs12, field) != (loc), \
822 struct vmcs12 *cached_vmcs12;
828 struct vmcs12 *cached_shadow_vmcs12;
1073 #define VMCS12_OFFSET(x) offsetof(struct vmcs12, x)
1260 static inline struct vmcs12 *get_vmcs12(struct kvm_vcpu *vcpu) in get_vmcs12()
1265 static inline struct vmcs12 *get_shadow_vmcs12(struct kvm_vcpu *vcpu) in get_shadow_vmcs12()
1283 static bool nested_vmx_is_page_fault_vmexit(struct vmcs12 *vmcs12,
1972 static inline bool nested_cpu_has(struct vmcs12 *vmcs12, u32 bit) in nested_cpu_has() argument
1974 return vmcs12->cpu_based_vm_exec_control & bit; in nested_cpu_has()
1977 static inline bool nested_cpu_has2(struct vmcs12 *vmcs12, u32 bit) in nested_cpu_has2() argument
1979 return (vmcs12->cpu_based_vm_exec_control & in nested_cpu_has2()
1981 (vmcs12->secondary_vm_exec_control & bit); in nested_cpu_has2()
1984 static inline bool nested_cpu_has_preemption_timer(struct vmcs12 *vmcs12) in nested_cpu_has_preemption_timer() argument
1986 return vmcs12->pin_based_vm_exec_control & in nested_cpu_has_preemption_timer()
1990 static inline bool nested_cpu_has_nmi_exiting(struct vmcs12 *vmcs12) in nested_cpu_has_nmi_exiting() argument
1992 return vmcs12->pin_based_vm_exec_control & PIN_BASED_NMI_EXITING; in nested_cpu_has_nmi_exiting()
1995 static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12) in nested_cpu_has_virtual_nmis() argument
1997 return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS; in nested_cpu_has_virtual_nmis()
2000 static inline int nested_cpu_has_ept(struct vmcs12 *vmcs12) in nested_cpu_has_ept() argument
2002 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_EPT); in nested_cpu_has_ept()
2005 static inline bool nested_cpu_has_xsaves(struct vmcs12 *vmcs12) in nested_cpu_has_xsaves() argument
2007 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_XSAVES); in nested_cpu_has_xsaves()
2010 static inline bool nested_cpu_has_pml(struct vmcs12 *vmcs12) in nested_cpu_has_pml() argument
2012 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_PML); in nested_cpu_has_pml()
2015 static inline bool nested_cpu_has_virt_x2apic_mode(struct vmcs12 *vmcs12) in nested_cpu_has_virt_x2apic_mode() argument
2017 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE); in nested_cpu_has_virt_x2apic_mode()
2020 static inline bool nested_cpu_has_vpid(struct vmcs12 *vmcs12) in nested_cpu_has_vpid() argument
2022 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_VPID); in nested_cpu_has_vpid()
2025 static inline bool nested_cpu_has_apic_reg_virt(struct vmcs12 *vmcs12) in nested_cpu_has_apic_reg_virt() argument
2027 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_APIC_REGISTER_VIRT); in nested_cpu_has_apic_reg_virt()
2030 static inline bool nested_cpu_has_vid(struct vmcs12 *vmcs12) in nested_cpu_has_vid() argument
2032 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY); in nested_cpu_has_vid()
2035 static inline bool nested_cpu_has_posted_intr(struct vmcs12 *vmcs12) in nested_cpu_has_posted_intr() argument
2037 return vmcs12->pin_based_vm_exec_control & PIN_BASED_POSTED_INTR; in nested_cpu_has_posted_intr()
2040 static inline bool nested_cpu_has_vmfunc(struct vmcs12 *vmcs12) in nested_cpu_has_vmfunc() argument
2042 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_VMFUNC); in nested_cpu_has_vmfunc()
2045 static inline bool nested_cpu_has_eptp_switching(struct vmcs12 *vmcs12) in nested_cpu_has_eptp_switching() argument
2047 return nested_cpu_has_vmfunc(vmcs12) && in nested_cpu_has_eptp_switching()
2048 (vmcs12->vm_function_control & in nested_cpu_has_eptp_switching()
2052 static inline bool nested_cpu_has_shadow_vmcs(struct vmcs12 *vmcs12) in nested_cpu_has_shadow_vmcs() argument
2054 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_SHADOW_VMCS); in nested_cpu_has_shadow_vmcs()
2067 struct vmcs12 *vmcs12,
3158 static inline unsigned long nested_read_cr0(struct vmcs12 *fields) in nested_read_cr0()
3163 static inline unsigned long nested_read_cr4(struct vmcs12 *fields) in nested_read_cr4()
3246 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_vmx_inject_exception_vmexit() local
3251 vmcs12->vm_exit_intr_error_code = vcpu->arch.exception.error_code; in nested_vmx_inject_exception_vmexit()
3260 if (!(vmcs12->idt_vectoring_info_field & VECTORING_INFO_VALID_MASK) && in nested_vmx_inject_exception_vmexit()
3273 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_vmx_check_exception() local
3290 if (nested_vmx_is_page_fault_vmexit(vmcs12, in nested_vmx_check_exception()
3296 if (vmcs12->exception_bitmap & (1u << nr)) { in nested_vmx_check_exception()
3424 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in vmx_read_l1_tsc_offset() local
3427 (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING)) in vmx_read_l1_tsc_offset()
3428 return vcpu->arch.tsc_offset - vmcs12->tsc_offset; in vmx_read_l1_tsc_offset()
3445 struct vmcs12 *vmcs12; in vmx_write_tsc_offset() local
3447 vmcs12 = get_vmcs12(vcpu); in vmx_write_tsc_offset()
3449 (nested_cpu_has(vmcs12, CPU_BASED_USE_TSC_OFFSETING) ? in vmx_write_tsc_offset()
3450 vmcs12->tsc_offset : 0)); in vmx_write_tsc_offset()
5202 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_guest_cr0_valid() local
5206 nested_cpu_has2(vmcs12, SECONDARY_EXEC_UNRESTRICTED_GUEST)) in nested_guest_cr0_valid()
6117 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_mark_vmcs12_pages_dirty() local
6125 if (nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) { in nested_mark_vmcs12_pages_dirty()
6126 gfn = vmcs12->virtual_apic_page_addr >> PAGE_SHIFT; in nested_mark_vmcs12_pages_dirty()
6130 if (nested_cpu_has_posted_intr(vmcs12)) { in nested_mark_vmcs12_pages_dirty()
6131 gfn = vmcs12->posted_intr_desc_addr >> PAGE_SHIFT; in nested_mark_vmcs12_pages_dirty()
7193 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in handle_set_cr0() local
7204 val = (val & ~vmcs12->cr0_guest_host_mask) | in handle_set_cr0()
7205 (vmcs12->guest_cr0 & vmcs12->cr0_guest_host_mask); in handle_set_cr0()
7226 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in handle_set_cr4() local
7230 val = (val & ~vmcs12->cr4_guest_host_mask) | in handle_set_cr4()
7231 (vmcs12->guest_cr4 & vmcs12->cr4_guest_host_mask); in handle_set_cr4()
8526 vmptr + offsetof(struct vmcs12, launch_state), in handle_vmclear()
8555 static inline int vmcs12_read_any(struct vmcs12 *vmcs12, in vmcs12_read_any() argument
8564 p = (char *)vmcs12 + offset; in vmcs12_read_any()
8586 static inline int vmcs12_write_any(struct vmcs12 *vmcs12, in vmcs12_write_any() argument
8589 char *p = (char *)vmcs12 + offset; in vmcs12_write_any()
8707 struct vmcs12 *vmcs12; in handle_vmread() local
8716 vmcs12 = get_vmcs12(vcpu); in handle_vmread()
8726 vmcs12 = get_shadow_vmcs12(vcpu); in handle_vmread()
8732 if (vmcs12_read_any(vmcs12, field, &field_value) < 0) { in handle_vmread()
8774 struct vmcs12 *vmcs12; in handle_vmwrite() local
8810 vmcs12 = get_vmcs12(vcpu); in handle_vmwrite()
8820 vmcs12 = get_shadow_vmcs12(vcpu); in handle_vmwrite()
8824 if (vmcs12_write_any(vmcs12, field, field_value) < 0) { in handle_vmwrite()
8889 struct vmcs12 *new_vmcs12; in handle_vmptrld()
9265 struct vmcs12 *vmcs12) in nested_vmx_eptp_switching() argument
9272 if (!nested_cpu_has_eptp_switching(vmcs12) || in nested_vmx_eptp_switching()
9273 !nested_cpu_has_ept(vmcs12)) in nested_vmx_eptp_switching()
9280 if (kvm_vcpu_read_guest_page(vcpu, vmcs12->eptp_list_address >> PAGE_SHIFT, in nested_vmx_eptp_switching()
9290 if (vmcs12->ept_pointer != address) { in nested_vmx_eptp_switching()
9297 vmcs12->ept_pointer = address; in nested_vmx_eptp_switching()
9312 struct vmcs12 *vmcs12; in handle_vmfunc() local
9325 vmcs12 = get_vmcs12(vcpu); in handle_vmfunc()
9326 if ((vmcs12->vm_function_control & (1 << function)) == 0) in handle_vmfunc()
9331 if (nested_vmx_eptp_switching(vcpu, vmcs12)) in handle_vmfunc()
9421 struct vmcs12 *vmcs12) in nested_vmx_exit_handled_io() argument
9429 if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) in nested_vmx_exit_handled_io()
9430 return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING); in nested_vmx_exit_handled_io()
9442 bitmap = vmcs12->io_bitmap_a; in nested_vmx_exit_handled_io()
9444 bitmap = vmcs12->io_bitmap_b; in nested_vmx_exit_handled_io()
9470 struct vmcs12 *vmcs12, u32 exit_reason) in nested_vmx_exit_handled_msr() argument
9475 if (!nested_cpu_has(vmcs12, CPU_BASED_USE_MSR_BITMAPS)) in nested_vmx_exit_handled_msr()
9483 bitmap = vmcs12->msr_bitmap; in nested_vmx_exit_handled_msr()
9507 struct vmcs12 *vmcs12) in nested_vmx_exit_handled_cr() argument
9520 if (vmcs12->cr0_guest_host_mask & in nested_vmx_exit_handled_cr()
9521 (val ^ vmcs12->cr0_read_shadow)) in nested_vmx_exit_handled_cr()
9525 if ((vmcs12->cr3_target_count >= 1 && in nested_vmx_exit_handled_cr()
9526 vmcs12->cr3_target_value0 == val) || in nested_vmx_exit_handled_cr()
9527 (vmcs12->cr3_target_count >= 2 && in nested_vmx_exit_handled_cr()
9528 vmcs12->cr3_target_value1 == val) || in nested_vmx_exit_handled_cr()
9529 (vmcs12->cr3_target_count >= 3 && in nested_vmx_exit_handled_cr()
9530 vmcs12->cr3_target_value2 == val) || in nested_vmx_exit_handled_cr()
9531 (vmcs12->cr3_target_count >= 4 && in nested_vmx_exit_handled_cr()
9532 vmcs12->cr3_target_value3 == val)) in nested_vmx_exit_handled_cr()
9534 if (nested_cpu_has(vmcs12, CPU_BASED_CR3_LOAD_EXITING)) in nested_vmx_exit_handled_cr()
9538 if (vmcs12->cr4_guest_host_mask & in nested_vmx_exit_handled_cr()
9539 (vmcs12->cr4_read_shadow ^ val)) in nested_vmx_exit_handled_cr()
9543 if (nested_cpu_has(vmcs12, CPU_BASED_CR8_LOAD_EXITING)) in nested_vmx_exit_handled_cr()
9549 if ((vmcs12->cr0_guest_host_mask & X86_CR0_TS) && in nested_vmx_exit_handled_cr()
9550 (vmcs12->cr0_read_shadow & X86_CR0_TS)) in nested_vmx_exit_handled_cr()
9556 if (vmcs12->cpu_based_vm_exec_control & in nested_vmx_exit_handled_cr()
9561 if (vmcs12->cpu_based_vm_exec_control & in nested_vmx_exit_handled_cr()
9573 if (vmcs12->cr0_guest_host_mask & 0xe & in nested_vmx_exit_handled_cr()
9574 (val ^ vmcs12->cr0_read_shadow)) in nested_vmx_exit_handled_cr()
9576 if ((vmcs12->cr0_guest_host_mask & 0x1) && in nested_vmx_exit_handled_cr()
9577 !(vmcs12->cr0_read_shadow & 0x1) && in nested_vmx_exit_handled_cr()
9586 struct vmcs12 *vmcs12, gpa_t bitmap) in nested_vmx_exit_handled_vmcs_access() argument
9592 if (!nested_cpu_has_shadow_vmcs(vmcs12)) in nested_vmx_exit_handled_vmcs_access()
9618 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_vmx_exit_reflected() local
9656 !(vmcs12->guest_cr0 & X86_CR0_TS)) in nested_vmx_exit_reflected()
9665 return vmcs12->exception_bitmap & in nested_vmx_exit_reflected()
9672 return nested_cpu_has(vmcs12, CPU_BASED_VIRTUAL_INTR_PENDING); in nested_vmx_exit_reflected()
9674 return nested_cpu_has(vmcs12, CPU_BASED_VIRTUAL_NMI_PENDING); in nested_vmx_exit_reflected()
9680 return nested_cpu_has(vmcs12, CPU_BASED_HLT_EXITING); in nested_vmx_exit_reflected()
9684 return nested_cpu_has(vmcs12, CPU_BASED_INVLPG_EXITING); in nested_vmx_exit_reflected()
9686 return nested_cpu_has(vmcs12, CPU_BASED_RDPMC_EXITING); in nested_vmx_exit_reflected()
9688 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_RDRAND_EXITING); in nested_vmx_exit_reflected()
9690 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_RDSEED_EXITING); in nested_vmx_exit_reflected()
9692 return nested_cpu_has(vmcs12, CPU_BASED_RDTSC_EXITING); in nested_vmx_exit_reflected()
9694 return nested_vmx_exit_handled_vmcs_access(vcpu, vmcs12, in nested_vmx_exit_reflected()
9695 vmcs12->vmread_bitmap); in nested_vmx_exit_reflected()
9697 return nested_vmx_exit_handled_vmcs_access(vcpu, vmcs12, in nested_vmx_exit_reflected()
9698 vmcs12->vmwrite_bitmap); in nested_vmx_exit_reflected()
9710 return nested_vmx_exit_handled_cr(vcpu, vmcs12); in nested_vmx_exit_reflected()
9712 return nested_cpu_has(vmcs12, CPU_BASED_MOV_DR_EXITING); in nested_vmx_exit_reflected()
9714 return nested_vmx_exit_handled_io(vcpu, vmcs12); in nested_vmx_exit_reflected()
9716 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_DESC); in nested_vmx_exit_reflected()
9719 return nested_vmx_exit_handled_msr(vcpu, vmcs12, exit_reason); in nested_vmx_exit_reflected()
9723 return nested_cpu_has(vmcs12, CPU_BASED_MWAIT_EXITING); in nested_vmx_exit_reflected()
9725 return nested_cpu_has(vmcs12, CPU_BASED_MONITOR_TRAP_FLAG); in nested_vmx_exit_reflected()
9727 return nested_cpu_has(vmcs12, CPU_BASED_MONITOR_EXITING); in nested_vmx_exit_reflected()
9729 return nested_cpu_has(vmcs12, CPU_BASED_PAUSE_EXITING) || in nested_vmx_exit_reflected()
9730 nested_cpu_has2(vmcs12, in nested_vmx_exit_reflected()
9735 return nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW); in nested_vmx_exit_reflected()
9763 nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_INVPCID) && in nested_vmx_exit_reflected()
9764 nested_cpu_has(vmcs12, CPU_BASED_INVLPG_EXITING); in nested_vmx_exit_reflected()
9766 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_WBINVD_EXITING); in nested_vmx_exit_reflected()
9776 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_XSAVES); in nested_vmx_exit_reflected()
9806 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_vmx_reflect_vmexit() local
9807 vmcs12->vm_exit_intr_error_code = in nested_vmx_reflect_vmexit()
10209 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in update_cr8_intercept() local
10212 nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) in update_cr8_intercept()
11306 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_ept_inject_page_fault() local
11321 vmcs12->guest_physical_address = fault->address; in nested_ept_inject_page_fault()
11361 static bool nested_vmx_is_page_fault_vmexit(struct vmcs12 *vmcs12, in nested_vmx_is_page_fault_vmexit() argument
11366 bit = (vmcs12->exception_bitmap & (1u << PF_VECTOR)) != 0; in nested_vmx_is_page_fault_vmexit()
11368 (error_code & vmcs12->page_fault_error_code_mask) != in nested_vmx_is_page_fault_vmexit()
11369 vmcs12->page_fault_error_code_match; in nested_vmx_is_page_fault_vmexit()
11376 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in vmx_inject_page_fault_nested() local
11380 if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) && in vmx_inject_page_fault_nested()
11382 vmcs12->vm_exit_intr_error_code = fault->error_code; in vmx_inject_page_fault_nested()
11393 struct vmcs12 *vmcs12);
11397 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_get_vmcs12_pages() local
11402 if (nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) { in nested_get_vmcs12_pages()
11413 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->apic_access_addr); in nested_get_vmcs12_pages()
11430 if (nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) { in nested_get_vmcs12_pages()
11435 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->virtual_apic_page_addr); in nested_get_vmcs12_pages()
11457 if (nested_cpu_has_posted_intr(vmcs12)) { in nested_get_vmcs12_pages()
11463 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->posted_intr_desc_addr); in nested_get_vmcs12_pages()
11470 (unsigned long)(vmcs12->posted_intr_desc_addr & in nested_get_vmcs12_pages()
11474 (unsigned long)(vmcs12->posted_intr_desc_addr & in nested_get_vmcs12_pages()
11477 if (nested_vmx_prepare_msr_bitmap(vcpu, vmcs12)) in nested_get_vmcs12_pages()
11510 struct vmcs12 *vmcs12) in nested_vmx_check_io_bitmap_controls() argument
11512 if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) in nested_vmx_check_io_bitmap_controls()
11515 if (!page_address_valid(vcpu, vmcs12->io_bitmap_a) || in nested_vmx_check_io_bitmap_controls()
11516 !page_address_valid(vcpu, vmcs12->io_bitmap_b)) in nested_vmx_check_io_bitmap_controls()
11523 struct vmcs12 *vmcs12) in nested_vmx_check_msr_bitmap_controls() argument
11525 if (!nested_cpu_has(vmcs12, CPU_BASED_USE_MSR_BITMAPS)) in nested_vmx_check_msr_bitmap_controls()
11528 if (!page_address_valid(vcpu, vmcs12->msr_bitmap)) in nested_vmx_check_msr_bitmap_controls()
11535 struct vmcs12 *vmcs12) in nested_vmx_check_tpr_shadow_controls() argument
11537 if (!nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) in nested_vmx_check_tpr_shadow_controls()
11540 if (!page_address_valid(vcpu, vmcs12->virtual_apic_page_addr)) in nested_vmx_check_tpr_shadow_controls()
11551 struct vmcs12 *vmcs12) in nested_vmx_prepare_msr_bitmap() argument
11575 !nested_cpu_has(vmcs12, CPU_BASED_USE_MSR_BITMAPS)) in nested_vmx_prepare_msr_bitmap()
11578 if (!nested_cpu_has_virt_x2apic_mode(vmcs12) && in nested_vmx_prepare_msr_bitmap()
11582 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->msr_bitmap); in nested_vmx_prepare_msr_bitmap()
11587 if (nested_cpu_has_apic_reg_virt(vmcs12)) { in nested_vmx_prepare_msr_bitmap()
11611 if (nested_cpu_has_vid(vmcs12)) { in nested_vmx_prepare_msr_bitmap()
11641 struct vmcs12 *vmcs12) in nested_cache_shadow_vmcs12() argument
11643 struct vmcs12 *shadow; in nested_cache_shadow_vmcs12()
11646 if (!nested_cpu_has_shadow_vmcs(vmcs12) || in nested_cache_shadow_vmcs12()
11647 vmcs12->vmcs_link_pointer == -1ull) in nested_cache_shadow_vmcs12()
11651 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->vmcs_link_pointer); in nested_cache_shadow_vmcs12()
11660 struct vmcs12 *vmcs12) in nested_flush_cached_shadow_vmcs12() argument
11664 if (!nested_cpu_has_shadow_vmcs(vmcs12) || in nested_flush_cached_shadow_vmcs12()
11665 vmcs12->vmcs_link_pointer == -1ull) in nested_flush_cached_shadow_vmcs12()
11668 kvm_write_guest(vmx->vcpu.kvm, vmcs12->vmcs_link_pointer, in nested_flush_cached_shadow_vmcs12()
11673 struct vmcs12 *vmcs12) in nested_vmx_check_apic_access_controls() argument
11675 if (nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES) && in nested_vmx_check_apic_access_controls()
11676 !page_address_valid(vcpu, vmcs12->apic_access_addr)) in nested_vmx_check_apic_access_controls()
11683 struct vmcs12 *vmcs12) in nested_vmx_check_apicv_controls() argument
11685 if (!nested_cpu_has_virt_x2apic_mode(vmcs12) && in nested_vmx_check_apicv_controls()
11686 !nested_cpu_has_apic_reg_virt(vmcs12) && in nested_vmx_check_apicv_controls()
11687 !nested_cpu_has_vid(vmcs12) && in nested_vmx_check_apicv_controls()
11688 !nested_cpu_has_posted_intr(vmcs12)) in nested_vmx_check_apicv_controls()
11695 if (nested_cpu_has_virt_x2apic_mode(vmcs12) && in nested_vmx_check_apicv_controls()
11696 nested_cpu_has2(vmcs12, SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) in nested_vmx_check_apicv_controls()
11703 if (nested_cpu_has_vid(vmcs12) && in nested_vmx_check_apicv_controls()
11714 if (nested_cpu_has_posted_intr(vmcs12) && in nested_vmx_check_apicv_controls()
11715 (!nested_cpu_has_vid(vmcs12) || in nested_vmx_check_apicv_controls()
11717 (vmcs12->posted_intr_nv & 0xff00) || in nested_vmx_check_apicv_controls()
11718 (vmcs12->posted_intr_desc_addr & 0x3f) || in nested_vmx_check_apicv_controls()
11719 (!page_address_valid(vcpu, vmcs12->posted_intr_desc_addr)))) in nested_vmx_check_apicv_controls()
11723 if (!nested_cpu_has(vmcs12, CPU_BASED_TPR_SHADOW)) in nested_vmx_check_apicv_controls()
11733 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_vmx_check_msr_switch() local
11737 if (vmcs12_read_any(vmcs12, count_field, &count) || in nested_vmx_check_msr_switch()
11738 vmcs12_read_any(vmcs12, addr_field, &addr)) { in nested_vmx_check_msr_switch()
11756 struct vmcs12 *vmcs12) in nested_vmx_check_msr_switch_controls() argument
11758 if (vmcs12->vm_exit_msr_load_count == 0 && in nested_vmx_check_msr_switch_controls()
11759 vmcs12->vm_exit_msr_store_count == 0 && in nested_vmx_check_msr_switch_controls()
11760 vmcs12->vm_entry_msr_load_count == 0) in nested_vmx_check_msr_switch_controls()
11773 struct vmcs12 *vmcs12) in nested_vmx_check_pml_controls() argument
11775 u64 address = vmcs12->pml_address; in nested_vmx_check_pml_controls()
11778 if (nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_PML)) { in nested_vmx_check_pml_controls()
11779 if (!nested_cpu_has_ept(vmcs12) || in nested_vmx_check_pml_controls()
11789 struct vmcs12 *vmcs12) in nested_vmx_check_shadow_vmcs_controls() argument
11791 if (!nested_cpu_has_shadow_vmcs(vmcs12)) in nested_vmx_check_shadow_vmcs_controls()
11794 if (!page_address_valid(vcpu, vmcs12->vmread_bitmap) || in nested_vmx_check_shadow_vmcs_controls()
11795 !page_address_valid(vcpu, vmcs12->vmwrite_bitmap)) in nested_vmx_check_shadow_vmcs_controls()
11963 static void prepare_vmcs02_full(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) in prepare_vmcs02_full() argument
11967 vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector); in prepare_vmcs02_full()
11968 vmcs_write16(GUEST_SS_SELECTOR, vmcs12->guest_ss_selector); in prepare_vmcs02_full()
11969 vmcs_write16(GUEST_DS_SELECTOR, vmcs12->guest_ds_selector); in prepare_vmcs02_full()
11970 vmcs_write16(GUEST_FS_SELECTOR, vmcs12->guest_fs_selector); in prepare_vmcs02_full()
11971 vmcs_write16(GUEST_GS_SELECTOR, vmcs12->guest_gs_selector); in prepare_vmcs02_full()
11972 vmcs_write16(GUEST_LDTR_SELECTOR, vmcs12->guest_ldtr_selector); in prepare_vmcs02_full()
11973 vmcs_write16(GUEST_TR_SELECTOR, vmcs12->guest_tr_selector); in prepare_vmcs02_full()
11974 vmcs_write32(GUEST_ES_LIMIT, vmcs12->guest_es_limit); in prepare_vmcs02_full()
11975 vmcs_write32(GUEST_SS_LIMIT, vmcs12->guest_ss_limit); in prepare_vmcs02_full()
11976 vmcs_write32(GUEST_DS_LIMIT, vmcs12->guest_ds_limit); in prepare_vmcs02_full()
11977 vmcs_write32(GUEST_FS_LIMIT, vmcs12->guest_fs_limit); in prepare_vmcs02_full()
11978 vmcs_write32(GUEST_GS_LIMIT, vmcs12->guest_gs_limit); in prepare_vmcs02_full()
11979 vmcs_write32(GUEST_LDTR_LIMIT, vmcs12->guest_ldtr_limit); in prepare_vmcs02_full()
11980 vmcs_write32(GUEST_TR_LIMIT, vmcs12->guest_tr_limit); in prepare_vmcs02_full()
11981 vmcs_write32(GUEST_GDTR_LIMIT, vmcs12->guest_gdtr_limit); in prepare_vmcs02_full()
11982 vmcs_write32(GUEST_IDTR_LIMIT, vmcs12->guest_idtr_limit); in prepare_vmcs02_full()
11983 vmcs_write32(GUEST_ES_AR_BYTES, vmcs12->guest_es_ar_bytes); in prepare_vmcs02_full()
11984 vmcs_write32(GUEST_SS_AR_BYTES, vmcs12->guest_ss_ar_bytes); in prepare_vmcs02_full()
11985 vmcs_write32(GUEST_DS_AR_BYTES, vmcs12->guest_ds_ar_bytes); in prepare_vmcs02_full()
11986 vmcs_write32(GUEST_FS_AR_BYTES, vmcs12->guest_fs_ar_bytes); in prepare_vmcs02_full()
11987 vmcs_write32(GUEST_GS_AR_BYTES, vmcs12->guest_gs_ar_bytes); in prepare_vmcs02_full()
11988 vmcs_write32(GUEST_LDTR_AR_BYTES, vmcs12->guest_ldtr_ar_bytes); in prepare_vmcs02_full()
11989 vmcs_write32(GUEST_TR_AR_BYTES, vmcs12->guest_tr_ar_bytes); in prepare_vmcs02_full()
11990 vmcs_writel(GUEST_SS_BASE, vmcs12->guest_ss_base); in prepare_vmcs02_full()
11991 vmcs_writel(GUEST_DS_BASE, vmcs12->guest_ds_base); in prepare_vmcs02_full()
11992 vmcs_writel(GUEST_FS_BASE, vmcs12->guest_fs_base); in prepare_vmcs02_full()
11993 vmcs_writel(GUEST_GS_BASE, vmcs12->guest_gs_base); in prepare_vmcs02_full()
11994 vmcs_writel(GUEST_LDTR_BASE, vmcs12->guest_ldtr_base); in prepare_vmcs02_full()
11995 vmcs_writel(GUEST_TR_BASE, vmcs12->guest_tr_base); in prepare_vmcs02_full()
11996 vmcs_writel(GUEST_GDTR_BASE, vmcs12->guest_gdtr_base); in prepare_vmcs02_full()
11997 vmcs_writel(GUEST_IDTR_BASE, vmcs12->guest_idtr_base); in prepare_vmcs02_full()
11999 vmcs_write32(GUEST_SYSENTER_CS, vmcs12->guest_sysenter_cs); in prepare_vmcs02_full()
12001 vmcs12->guest_pending_dbg_exceptions); in prepare_vmcs02_full()
12002 vmcs_writel(GUEST_SYSENTER_ESP, vmcs12->guest_sysenter_esp); in prepare_vmcs02_full()
12003 vmcs_writel(GUEST_SYSENTER_EIP, vmcs12->guest_sysenter_eip); in prepare_vmcs02_full()
12005 if (nested_cpu_has_xsaves(vmcs12)) in prepare_vmcs02_full()
12006 vmcs_write64(XSS_EXIT_BITMAP, vmcs12->xss_exit_bitmap); in prepare_vmcs02_full()
12027 enable_ept ? vmcs12->page_fault_error_code_mask : 0); in prepare_vmcs02_full()
12029 enable_ept ? vmcs12->page_fault_error_code_match : 0); in prepare_vmcs02_full()
12036 vmcs_write64(EOI_EXIT_BITMAP0, vmcs12->eoi_exit_bitmap0); in prepare_vmcs02_full()
12037 vmcs_write64(EOI_EXIT_BITMAP1, vmcs12->eoi_exit_bitmap1); in prepare_vmcs02_full()
12038 vmcs_write64(EOI_EXIT_BITMAP2, vmcs12->eoi_exit_bitmap2); in prepare_vmcs02_full()
12039 vmcs_write64(EOI_EXIT_BITMAP3, vmcs12->eoi_exit_bitmap3); in prepare_vmcs02_full()
12064 (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) in prepare_vmcs02_full()
12065 vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs); in prepare_vmcs02_full()
12071 if (nested_cpu_has_vpid(vmcs12) && vmx->nested.vpid02) in prepare_vmcs02_full()
12081 vmcs_write64(GUEST_PDPTR0, vmcs12->guest_pdptr0); in prepare_vmcs02_full()
12082 vmcs_write64(GUEST_PDPTR1, vmcs12->guest_pdptr1); in prepare_vmcs02_full()
12083 vmcs_write64(GUEST_PDPTR2, vmcs12->guest_pdptr2); in prepare_vmcs02_full()
12084 vmcs_write64(GUEST_PDPTR3, vmcs12->guest_pdptr3); in prepare_vmcs02_full()
12102 static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, in prepare_vmcs02() argument
12109 prepare_vmcs02_full(vcpu, vmcs12); in prepare_vmcs02()
12118 vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector); in prepare_vmcs02()
12119 vmcs_write32(GUEST_CS_LIMIT, vmcs12->guest_cs_limit); in prepare_vmcs02()
12120 vmcs_write32(GUEST_CS_AR_BYTES, vmcs12->guest_cs_ar_bytes); in prepare_vmcs02()
12121 vmcs_writel(GUEST_ES_BASE, vmcs12->guest_es_base); in prepare_vmcs02()
12122 vmcs_writel(GUEST_CS_BASE, vmcs12->guest_cs_base); in prepare_vmcs02()
12125 (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS)) { in prepare_vmcs02()
12126 kvm_set_dr(vcpu, 7, vmcs12->guest_dr7); in prepare_vmcs02()
12127 vmcs_write64(GUEST_IA32_DEBUGCTL, vmcs12->guest_ia32_debugctl); in prepare_vmcs02()
12134 vmcs12->vm_entry_intr_info_field); in prepare_vmcs02()
12136 vmcs12->vm_entry_exception_error_code); in prepare_vmcs02()
12138 vmcs12->vm_entry_instruction_len); in prepare_vmcs02()
12140 vmcs12->guest_interruptibility_info); in prepare_vmcs02()
12142 !(vmcs12->guest_interruptibility_info & GUEST_INTR_STATE_NMI); in prepare_vmcs02()
12146 vmx_set_rflags(vcpu, vmcs12->guest_rflags); in prepare_vmcs02()
12148 exec_control = vmcs12->pin_based_vm_exec_control; in prepare_vmcs02()
12156 if (nested_cpu_has_posted_intr(vmcs12)) { in prepare_vmcs02()
12157 vmx->nested.posted_intr_nv = vmcs12->posted_intr_nv; in prepare_vmcs02()
12166 if (nested_cpu_has_preemption_timer(vmcs12)) in prepare_vmcs02()
12180 if (nested_cpu_has(vmcs12, in prepare_vmcs02()
12182 vmcs12_exec_ctrl = vmcs12->secondary_vm_exec_control & in prepare_vmcs02()
12192 vmcs12->guest_intr_status); in prepare_vmcs02()
12221 exec_control |= vmcs12->cpu_based_vm_exec_control; in prepare_vmcs02()
12230 vmcs_write32(TPR_THRESHOLD, vmcs12->tpr_threshold); in prepare_vmcs02()
12252 vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask; in prepare_vmcs02()
12265 (vmcs12->vm_entry_controls & ~VM_ENTRY_LOAD_IA32_EFER & in prepare_vmcs02()
12270 (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT)) { in prepare_vmcs02()
12271 vmcs_write64(GUEST_IA32_PAT, vmcs12->guest_ia32_pat); in prepare_vmcs02()
12272 vcpu->arch.pat = vmcs12->guest_ia32_pat; in prepare_vmcs02()
12291 if (nested_cpu_has_vpid(vmcs12) && vmx->nested.vpid02) { in prepare_vmcs02()
12292 if (vmcs12->virtual_processor_id != vmx->nested.last_vpid) { in prepare_vmcs02()
12293 vmx->nested.last_vpid = vmcs12->virtual_processor_id; in prepare_vmcs02()
12313 if (nested_cpu_has_ept(vmcs12)) { in prepare_vmcs02()
12318 } else if (nested_cpu_has2(vmcs12, in prepare_vmcs02()
12331 vmx_set_cr0(vcpu, vmcs12->guest_cr0); in prepare_vmcs02()
12332 vmcs_writel(CR0_READ_SHADOW, nested_read_cr0(vmcs12)); in prepare_vmcs02()
12334 vmx_set_cr4(vcpu, vmcs12->guest_cr4); in prepare_vmcs02()
12335 vmcs_writel(CR4_READ_SHADOW, nested_read_cr4(vmcs12)); in prepare_vmcs02()
12338 (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER)) in prepare_vmcs02()
12339 vcpu->arch.efer = vmcs12->guest_ia32_efer; in prepare_vmcs02()
12340 else if (vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) in prepare_vmcs02()
12358 if (nested_vmx_load_cr3(vcpu, vmcs12->guest_cr3, nested_cpu_has_ept(vmcs12), in prepare_vmcs02()
12365 kvm_register_write(vcpu, VCPU_REGS_RSP, vmcs12->guest_rsp); in prepare_vmcs02()
12366 kvm_register_write(vcpu, VCPU_REGS_RIP, vmcs12->guest_rip); in prepare_vmcs02()
12370 static int nested_vmx_check_nmi_controls(struct vmcs12 *vmcs12) in nested_vmx_check_nmi_controls() argument
12372 if (!nested_cpu_has_nmi_exiting(vmcs12) && in nested_vmx_check_nmi_controls()
12373 nested_cpu_has_virtual_nmis(vmcs12)) in nested_vmx_check_nmi_controls()
12376 if (!nested_cpu_has_virtual_nmis(vmcs12) && in nested_vmx_check_nmi_controls()
12377 nested_cpu_has(vmcs12, CPU_BASED_VIRTUAL_NMI_PENDING)) in nested_vmx_check_nmi_controls()
12383 static int check_vmentry_prereqs(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) in check_vmentry_prereqs() argument
12387 if (vmcs12->guest_activity_state != GUEST_ACTIVITY_ACTIVE && in check_vmentry_prereqs()
12388 vmcs12->guest_activity_state != GUEST_ACTIVITY_HLT) in check_vmentry_prereqs()
12391 if (nested_cpu_has_vpid(vmcs12) && !vmcs12->virtual_processor_id) in check_vmentry_prereqs()
12394 if (nested_vmx_check_io_bitmap_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12397 if (nested_vmx_check_msr_bitmap_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12400 if (nested_vmx_check_apic_access_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12403 if (nested_vmx_check_tpr_shadow_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12406 if (nested_vmx_check_apicv_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12409 if (nested_vmx_check_msr_switch_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12412 if (nested_vmx_check_pml_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12415 if (nested_vmx_check_shadow_vmcs_controls(vcpu, vmcs12)) in check_vmentry_prereqs()
12418 if (!vmx_control_verify(vmcs12->cpu_based_vm_exec_control, in check_vmentry_prereqs()
12421 (nested_cpu_has(vmcs12, CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) && in check_vmentry_prereqs()
12422 !vmx_control_verify(vmcs12->secondary_vm_exec_control, in check_vmentry_prereqs()
12425 !vmx_control_verify(vmcs12->pin_based_vm_exec_control, in check_vmentry_prereqs()
12428 !vmx_control_verify(vmcs12->vm_exit_controls, in check_vmentry_prereqs()
12431 !vmx_control_verify(vmcs12->vm_entry_controls, in check_vmentry_prereqs()
12436 if (nested_vmx_check_nmi_controls(vmcs12)) in check_vmentry_prereqs()
12439 if (nested_cpu_has_vmfunc(vmcs12)) { in check_vmentry_prereqs()
12440 if (vmcs12->vm_function_control & in check_vmentry_prereqs()
12444 if (nested_cpu_has_eptp_switching(vmcs12)) { in check_vmentry_prereqs()
12445 if (!nested_cpu_has_ept(vmcs12) || in check_vmentry_prereqs()
12446 !page_address_valid(vcpu, vmcs12->eptp_list_address)) in check_vmentry_prereqs()
12451 if (vmcs12->cr3_target_count > nested_cpu_vmx_misc_cr3_count(vcpu)) in check_vmentry_prereqs()
12454 if (!nested_host_cr0_valid(vcpu, vmcs12->host_cr0) || in check_vmentry_prereqs()
12455 !nested_host_cr4_valid(vcpu, vmcs12->host_cr4) || in check_vmentry_prereqs()
12456 !nested_cr3_valid(vcpu, vmcs12->host_cr3)) in check_vmentry_prereqs()
12465 if (vmcs12->vm_entry_intr_info_field & INTR_INFO_VALID_MASK) { in check_vmentry_prereqs()
12466 u32 intr_info = vmcs12->vm_entry_intr_info_field; in check_vmentry_prereqs()
12471 bool urg = nested_cpu_has2(vmcs12, in check_vmentry_prereqs()
12473 bool prot_mode = !urg || vmcs12->guest_cr0 & X86_CR0_PE; in check_vmentry_prereqs()
12496 vmcs12->vm_entry_exception_error_code & GENMASK(31, 15)) in check_vmentry_prereqs()
12508 if ((vmcs12->vm_entry_instruction_len > 15) || in check_vmentry_prereqs()
12509 (vmcs12->vm_entry_instruction_len == 0 && in check_vmentry_prereqs()
12519 struct vmcs12 *vmcs12) in nested_vmx_check_vmcs_link_ptr() argument
12523 struct vmcs12 *shadow; in nested_vmx_check_vmcs_link_ptr()
12525 if (vmcs12->vmcs_link_pointer == -1ull) in nested_vmx_check_vmcs_link_ptr()
12528 if (!page_address_valid(vcpu, vmcs12->vmcs_link_pointer)) in nested_vmx_check_vmcs_link_ptr()
12531 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->vmcs_link_pointer); in nested_vmx_check_vmcs_link_ptr()
12538 shadow->hdr.shadow_vmcs != nested_cpu_has_shadow_vmcs(vmcs12)) in nested_vmx_check_vmcs_link_ptr()
12545 static int check_vmentry_postreqs(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, in check_vmentry_postreqs() argument
12552 if (!nested_guest_cr0_valid(vcpu, vmcs12->guest_cr0) || in check_vmentry_postreqs()
12553 !nested_guest_cr4_valid(vcpu, vmcs12->guest_cr4)) in check_vmentry_postreqs()
12556 if (nested_vmx_check_vmcs_link_ptr(vcpu, vmcs12)) { in check_vmentry_postreqs()
12571 (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER)) { in check_vmentry_postreqs()
12572 ia32e = (vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) != 0; in check_vmentry_postreqs()
12573 if (!kvm_valid_efer(vcpu, vmcs12->guest_ia32_efer) || in check_vmentry_postreqs()
12574 ia32e != !!(vmcs12->guest_ia32_efer & EFER_LMA) || in check_vmentry_postreqs()
12575 ((vmcs12->guest_cr0 & X86_CR0_PG) && in check_vmentry_postreqs()
12576 ia32e != !!(vmcs12->guest_ia32_efer & EFER_LME))) in check_vmentry_postreqs()
12586 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_EFER) { in check_vmentry_postreqs()
12587 ia32e = (vmcs12->vm_exit_controls & in check_vmentry_postreqs()
12589 if (!kvm_valid_efer(vcpu, vmcs12->host_ia32_efer) || in check_vmentry_postreqs()
12590 ia32e != !!(vmcs12->host_ia32_efer & EFER_LMA) || in check_vmentry_postreqs()
12591 ia32e != !!(vmcs12->host_ia32_efer & EFER_LME)) in check_vmentry_postreqs()
12595 if ((vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS) && in check_vmentry_postreqs()
12596 (is_noncanonical_address(vmcs12->guest_bndcfgs & PAGE_MASK, vcpu) || in check_vmentry_postreqs()
12597 (vmcs12->guest_bndcfgs & MSR_IA32_BNDCFGS_RSVD))) in check_vmentry_postreqs()
12610 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in enter_vmx_non_root_mode() local
12623 if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS)) in enter_vmx_non_root_mode()
12626 !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) in enter_vmx_non_root_mode()
12632 if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING) in enter_vmx_non_root_mode()
12633 vcpu->arch.tsc_offset += vmcs12->tsc_offset; in enter_vmx_non_root_mode()
12636 if (prepare_vmcs02(vcpu, vmcs12, from_vmentry ? exit_qual : &dummy_exit_qual)) in enter_vmx_non_root_mode()
12644 vmcs12->vm_entry_msr_load_addr, in enter_vmx_non_root_mode()
12645 vmcs12->vm_entry_msr_load_count); in enter_vmx_non_root_mode()
12685 if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING) in enter_vmx_non_root_mode()
12686 vcpu->arch.tsc_offset -= vmcs12->tsc_offset; in enter_vmx_non_root_mode()
12698 struct vmcs12 *vmcs12; in nested_vmx_run() local
12710 vmcs12 = get_vmcs12(vcpu); in nested_vmx_run()
12718 if (vmcs12->hdr.shadow_vmcs) { in nested_vmx_run()
12742 if (vmcs12->launch_state == launch) { in nested_vmx_run()
12749 ret = check_vmentry_prereqs(vcpu, vmcs12); in nested_vmx_run()
12764 ret = check_vmentry_postreqs(vcpu, vmcs12, &exit_qual); in nested_vmx_run()
12766 nested_vmx_entry_failure(vcpu, vmcs12, in nested_vmx_run()
12779 nested_vmx_entry_failure(vcpu, vmcs12, ret, exit_qual); in nested_vmx_run()
12797 nested_cache_shadow_vmcs12(vcpu, vmcs12); in nested_vmx_run()
12803 if ((vmcs12->guest_activity_state == GUEST_ACTIVITY_HLT) && in nested_vmx_run()
12804 !(vmcs12->vm_entry_intr_info_field & INTR_INFO_VALID_MASK)) { in nested_vmx_run()
12832 vmcs12_guest_cr0(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) in vmcs12_guest_cr0() argument
12836 /*2*/ (vmcs12->guest_cr0 & vmcs12->cr0_guest_host_mask) | in vmcs12_guest_cr0()
12837 /*3*/ (vmcs_readl(CR0_READ_SHADOW) & ~(vmcs12->cr0_guest_host_mask | in vmcs12_guest_cr0()
12842 vmcs12_guest_cr4(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) in vmcs12_guest_cr4() argument
12846 /*2*/ (vmcs12->guest_cr4 & vmcs12->cr4_guest_host_mask) | in vmcs12_guest_cr4()
12847 /*3*/ (vmcs_readl(CR4_READ_SHADOW) & ~(vmcs12->cr4_guest_host_mask | in vmcs12_guest_cr4()
12852 struct vmcs12 *vmcs12) in vmcs12_save_pending_event() argument
12862 vmcs12->vm_exit_instruction_len = in vmcs12_save_pending_event()
12870 vmcs12->idt_vectoring_error_code = in vmcs12_save_pending_event()
12874 vmcs12->idt_vectoring_info_field = idt_vectoring; in vmcs12_save_pending_event()
12876 vmcs12->idt_vectoring_info_field = in vmcs12_save_pending_event()
12884 vmcs12->vm_entry_instruction_len = in vmcs12_save_pending_event()
12889 vmcs12->idt_vectoring_info_field = idt_vectoring; in vmcs12_save_pending_event()
12968 static void sync_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) in sync_vmcs12() argument
12970 vmcs12->guest_cr0 = vmcs12_guest_cr0(vcpu, vmcs12); in sync_vmcs12()
12971 vmcs12->guest_cr4 = vmcs12_guest_cr4(vcpu, vmcs12); in sync_vmcs12()
12973 vmcs12->guest_rsp = kvm_register_read(vcpu, VCPU_REGS_RSP); in sync_vmcs12()
12974 vmcs12->guest_rip = kvm_register_read(vcpu, VCPU_REGS_RIP); in sync_vmcs12()
12975 vmcs12->guest_rflags = vmcs_readl(GUEST_RFLAGS); in sync_vmcs12()
12977 vmcs12->guest_es_selector = vmcs_read16(GUEST_ES_SELECTOR); in sync_vmcs12()
12978 vmcs12->guest_cs_selector = vmcs_read16(GUEST_CS_SELECTOR); in sync_vmcs12()
12979 vmcs12->guest_ss_selector = vmcs_read16(GUEST_SS_SELECTOR); in sync_vmcs12()
12980 vmcs12->guest_ds_selector = vmcs_read16(GUEST_DS_SELECTOR); in sync_vmcs12()
12981 vmcs12->guest_fs_selector = vmcs_read16(GUEST_FS_SELECTOR); in sync_vmcs12()
12982 vmcs12->guest_gs_selector = vmcs_read16(GUEST_GS_SELECTOR); in sync_vmcs12()
12983 vmcs12->guest_ldtr_selector = vmcs_read16(GUEST_LDTR_SELECTOR); in sync_vmcs12()
12984 vmcs12->guest_tr_selector = vmcs_read16(GUEST_TR_SELECTOR); in sync_vmcs12()
12985 vmcs12->guest_es_limit = vmcs_read32(GUEST_ES_LIMIT); in sync_vmcs12()
12986 vmcs12->guest_cs_limit = vmcs_read32(GUEST_CS_LIMIT); in sync_vmcs12()
12987 vmcs12->guest_ss_limit = vmcs_read32(GUEST_SS_LIMIT); in sync_vmcs12()
12988 vmcs12->guest_ds_limit = vmcs_read32(GUEST_DS_LIMIT); in sync_vmcs12()
12989 vmcs12->guest_fs_limit = vmcs_read32(GUEST_FS_LIMIT); in sync_vmcs12()
12990 vmcs12->guest_gs_limit = vmcs_read32(GUEST_GS_LIMIT); in sync_vmcs12()
12991 vmcs12->guest_ldtr_limit = vmcs_read32(GUEST_LDTR_LIMIT); in sync_vmcs12()
12992 vmcs12->guest_tr_limit = vmcs_read32(GUEST_TR_LIMIT); in sync_vmcs12()
12993 vmcs12->guest_gdtr_limit = vmcs_read32(GUEST_GDTR_LIMIT); in sync_vmcs12()
12994 vmcs12->guest_idtr_limit = vmcs_read32(GUEST_IDTR_LIMIT); in sync_vmcs12()
12995 vmcs12->guest_es_ar_bytes = vmcs_read32(GUEST_ES_AR_BYTES); in sync_vmcs12()
12996 vmcs12->guest_cs_ar_bytes = vmcs_read32(GUEST_CS_AR_BYTES); in sync_vmcs12()
12997 vmcs12->guest_ss_ar_bytes = vmcs_read32(GUEST_SS_AR_BYTES); in sync_vmcs12()
12998 vmcs12->guest_ds_ar_bytes = vmcs_read32(GUEST_DS_AR_BYTES); in sync_vmcs12()
12999 vmcs12->guest_fs_ar_bytes = vmcs_read32(GUEST_FS_AR_BYTES); in sync_vmcs12()
13000 vmcs12->guest_gs_ar_bytes = vmcs_read32(GUEST_GS_AR_BYTES); in sync_vmcs12()
13001 vmcs12->guest_ldtr_ar_bytes = vmcs_read32(GUEST_LDTR_AR_BYTES); in sync_vmcs12()
13002 vmcs12->guest_tr_ar_bytes = vmcs_read32(GUEST_TR_AR_BYTES); in sync_vmcs12()
13003 vmcs12->guest_es_base = vmcs_readl(GUEST_ES_BASE); in sync_vmcs12()
13004 vmcs12->guest_cs_base = vmcs_readl(GUEST_CS_BASE); in sync_vmcs12()
13005 vmcs12->guest_ss_base = vmcs_readl(GUEST_SS_BASE); in sync_vmcs12()
13006 vmcs12->guest_ds_base = vmcs_readl(GUEST_DS_BASE); in sync_vmcs12()
13007 vmcs12->guest_fs_base = vmcs_readl(GUEST_FS_BASE); in sync_vmcs12()
13008 vmcs12->guest_gs_base = vmcs_readl(GUEST_GS_BASE); in sync_vmcs12()
13009 vmcs12->guest_ldtr_base = vmcs_readl(GUEST_LDTR_BASE); in sync_vmcs12()
13010 vmcs12->guest_tr_base = vmcs_readl(GUEST_TR_BASE); in sync_vmcs12()
13011 vmcs12->guest_gdtr_base = vmcs_readl(GUEST_GDTR_BASE); in sync_vmcs12()
13012 vmcs12->guest_idtr_base = vmcs_readl(GUEST_IDTR_BASE); in sync_vmcs12()
13014 vmcs12->guest_interruptibility_info = in sync_vmcs12()
13016 vmcs12->guest_pending_dbg_exceptions = in sync_vmcs12()
13019 vmcs12->guest_activity_state = GUEST_ACTIVITY_HLT; in sync_vmcs12()
13021 vmcs12->guest_activity_state = GUEST_ACTIVITY_ACTIVE; in sync_vmcs12()
13023 if (nested_cpu_has_preemption_timer(vmcs12)) { in sync_vmcs12()
13024 if (vmcs12->vm_exit_controls & in sync_vmcs12()
13026 vmcs12->vmx_preemption_timer_value = in sync_vmcs12()
13040 vmcs12->guest_cr3 = vmcs_readl(GUEST_CR3); in sync_vmcs12()
13041 vmcs12->guest_pdptr0 = vmcs_read64(GUEST_PDPTR0); in sync_vmcs12()
13042 vmcs12->guest_pdptr1 = vmcs_read64(GUEST_PDPTR1); in sync_vmcs12()
13043 vmcs12->guest_pdptr2 = vmcs_read64(GUEST_PDPTR2); in sync_vmcs12()
13044 vmcs12->guest_pdptr3 = vmcs_read64(GUEST_PDPTR3); in sync_vmcs12()
13047 vmcs12->guest_linear_address = vmcs_readl(GUEST_LINEAR_ADDRESS); in sync_vmcs12()
13049 if (nested_cpu_has_vid(vmcs12)) in sync_vmcs12()
13050 vmcs12->guest_intr_status = vmcs_read16(GUEST_INTR_STATUS); in sync_vmcs12()
13052 vmcs12->vm_entry_controls = in sync_vmcs12()
13053 (vmcs12->vm_entry_controls & ~VM_ENTRY_IA32E_MODE) | in sync_vmcs12()
13056 if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_DEBUG_CONTROLS) { in sync_vmcs12()
13057 kvm_get_dr(vcpu, 7, (unsigned long *)&vmcs12->guest_dr7); in sync_vmcs12()
13058 vmcs12->guest_ia32_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL); in sync_vmcs12()
13063 if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_IA32_PAT) in sync_vmcs12()
13064 vmcs12->guest_ia32_pat = vmcs_read64(GUEST_IA32_PAT); in sync_vmcs12()
13065 if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_IA32_EFER) in sync_vmcs12()
13066 vmcs12->guest_ia32_efer = vcpu->arch.efer; in sync_vmcs12()
13067 vmcs12->guest_sysenter_cs = vmcs_read32(GUEST_SYSENTER_CS); in sync_vmcs12()
13068 vmcs12->guest_sysenter_esp = vmcs_readl(GUEST_SYSENTER_ESP); in sync_vmcs12()
13069 vmcs12->guest_sysenter_eip = vmcs_readl(GUEST_SYSENTER_EIP); in sync_vmcs12()
13071 vmcs12->guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS); in sync_vmcs12()
13085 static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, in prepare_vmcs12() argument
13090 sync_vmcs12(vcpu, vmcs12); in prepare_vmcs12()
13094 vmcs12->vm_exit_reason = exit_reason; in prepare_vmcs12()
13095 vmcs12->exit_qualification = exit_qualification; in prepare_vmcs12()
13096 vmcs12->vm_exit_intr_info = exit_intr_info; in prepare_vmcs12()
13098 vmcs12->idt_vectoring_info_field = 0; in prepare_vmcs12()
13099 vmcs12->vm_exit_instruction_len = vmcs_read32(VM_EXIT_INSTRUCTION_LEN); in prepare_vmcs12()
13100 vmcs12->vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); in prepare_vmcs12()
13102 if (!(vmcs12->vm_exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) { in prepare_vmcs12()
13103 vmcs12->launch_state = 1; in prepare_vmcs12()
13107 vmcs12->vm_entry_intr_info_field &= ~INTR_INFO_VALID_MASK; in prepare_vmcs12()
13113 vmcs12_save_pending_event(vcpu, vmcs12); in prepare_vmcs12()
13126 struct vmcs12 *vmcs12) in load_vmcs12_mmu_host_state() argument
13136 if (nested_vmx_load_cr3(vcpu, vmcs12->host_cr3, false, &entry_failure_code)) in load_vmcs12_mmu_host_state()
13153 struct vmcs12 *vmcs12) in load_vmcs12_host_state() argument
13157 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_EFER) in load_vmcs12_host_state()
13158 vcpu->arch.efer = vmcs12->host_ia32_efer; in load_vmcs12_host_state()
13159 else if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) in load_vmcs12_host_state()
13165 kvm_register_write(vcpu, VCPU_REGS_RSP, vmcs12->host_rsp); in load_vmcs12_host_state()
13166 kvm_register_write(vcpu, VCPU_REGS_RIP, vmcs12->host_rip); in load_vmcs12_host_state()
13176 vmx_set_cr0(vcpu, vmcs12->host_cr0); in load_vmcs12_host_state()
13180 vmx_set_cr4(vcpu, vmcs12->host_cr4); in load_vmcs12_host_state()
13182 load_vmcs12_mmu_host_state(vcpu, vmcs12); in load_vmcs12_host_state()
13197 !(nested_cpu_has_vpid(vmcs12) && to_vmx(vcpu)->nested.vpid02)) { in load_vmcs12_host_state()
13201 vmcs_write32(GUEST_SYSENTER_CS, vmcs12->host_ia32_sysenter_cs); in load_vmcs12_host_state()
13202 vmcs_writel(GUEST_SYSENTER_ESP, vmcs12->host_ia32_sysenter_esp); in load_vmcs12_host_state()
13203 vmcs_writel(GUEST_SYSENTER_EIP, vmcs12->host_ia32_sysenter_eip); in load_vmcs12_host_state()
13204 vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base); in load_vmcs12_host_state()
13205 vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base); in load_vmcs12_host_state()
13210 if (vmcs12->vm_exit_controls & VM_EXIT_CLEAR_BNDCFGS) in load_vmcs12_host_state()
13213 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PAT) { in load_vmcs12_host_state()
13214 vmcs_write64(GUEST_IA32_PAT, vmcs12->host_ia32_pat); in load_vmcs12_host_state()
13215 vcpu->arch.pat = vmcs12->host_ia32_pat; in load_vmcs12_host_state()
13217 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL) in load_vmcs12_host_state()
13219 vmcs12->host_ia32_perf_global_ctrl); in load_vmcs12_host_state()
13226 .selector = vmcs12->host_cs_selector, in load_vmcs12_host_state()
13232 if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) in load_vmcs12_host_state()
13246 seg.selector = vmcs12->host_ds_selector; in load_vmcs12_host_state()
13248 seg.selector = vmcs12->host_es_selector; in load_vmcs12_host_state()
13250 seg.selector = vmcs12->host_ss_selector; in load_vmcs12_host_state()
13252 seg.selector = vmcs12->host_fs_selector; in load_vmcs12_host_state()
13253 seg.base = vmcs12->host_fs_base; in load_vmcs12_host_state()
13255 seg.selector = vmcs12->host_gs_selector; in load_vmcs12_host_state()
13256 seg.base = vmcs12->host_gs_base; in load_vmcs12_host_state()
13259 .base = vmcs12->host_tr_base, in load_vmcs12_host_state()
13261 .selector = vmcs12->host_tr_selector, in load_vmcs12_host_state()
13273 if (nested_vmx_load_msr(vcpu, vmcs12->vm_exit_msr_load_addr, in load_vmcs12_host_state()
13274 vmcs12->vm_exit_msr_load_count)) in load_vmcs12_host_state()
13288 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in nested_vmx_vmexit() local
13303 if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING) in nested_vmx_vmexit()
13304 vcpu->arch.tsc_offset -= vmcs12->tsc_offset; in nested_vmx_vmexit()
13308 sync_vmcs12(vcpu, vmcs12); in nested_vmx_vmexit()
13310 prepare_vmcs12(vcpu, vmcs12, exit_reason, exit_intr_info, in nested_vmx_vmexit()
13322 nested_flush_cached_shadow_vmcs12(vcpu, vmcs12); in nested_vmx_vmexit()
13324 if (nested_vmx_store_msr(vcpu, vmcs12->vm_exit_msr_store_addr, in nested_vmx_vmexit()
13325 vmcs12->vm_exit_msr_store_count)) in nested_vmx_vmexit()
13345 } else if (!nested_cpu_has_ept(vmcs12) && in nested_vmx_vmexit()
13346 nested_cpu_has2(vmcs12, in nested_vmx_vmexit()
13396 vmcs12->vm_exit_intr_info = irq | in nested_vmx_vmexit()
13401 trace_kvm_nested_vmexit_inject(vmcs12->vm_exit_reason, in nested_vmx_vmexit()
13402 vmcs12->exit_qualification, in nested_vmx_vmexit()
13403 vmcs12->idt_vectoring_info_field, in nested_vmx_vmexit()
13404 vmcs12->vm_exit_intr_info, in nested_vmx_vmexit()
13405 vmcs12->vm_exit_intr_error_code, in nested_vmx_vmexit()
13408 load_vmcs12_host_state(vcpu, vmcs12); in nested_vmx_vmexit()
13422 load_vmcs12_mmu_host_state(vcpu, vmcs12); in nested_vmx_vmexit()
13453 struct vmcs12 *vmcs12, in nested_vmx_entry_failure() argument
13456 load_vmcs12_host_state(vcpu, vmcs12); in nested_vmx_entry_failure()
13457 vmcs12->vm_exit_reason = reason | VMX_EXIT_REASONS_FAILED_VMENTRY; in nested_vmx_entry_failure()
13458 vmcs12->exit_qualification = qualification; in nested_vmx_entry_failure()
13468 struct vmcs12 *vmcs12 = get_vmcs12(vcpu); in vmx_check_intercept() local
13476 !nested_cpu_has2(vmcs12, SECONDARY_EXEC_RDTSCP)) { in vmx_check_intercept()
13577 struct vmcs12 *vmcs12; in vmx_write_pml_buffer() local
13591 vmcs12 = get_vmcs12(vcpu); in vmx_write_pml_buffer()
13592 if (!nested_cpu_has_pml(vmcs12)) in vmx_write_pml_buffer()
13595 if (vmcs12->guest_pml_index >= PML_ENTITY_NUM) { in vmx_write_pml_buffer()
13602 page = kvm_vcpu_gpa_to_page(vcpu, vmcs12->pml_address); in vmx_write_pml_buffer()
13607 pml_address[vmcs12->guest_pml_index--] = gpa; in vmx_write_pml_buffer()
13907 struct vmcs12 *vmcs12; in vmx_get_nested_state() local
13920 vmcs12 = get_vmcs12(vcpu); in vmx_get_nested_state()
13930 nested_cpu_has_shadow_vmcs(vmcs12) && in vmx_get_nested_state()
13931 vmcs12->vmcs_link_pointer != -1ull) in vmx_get_nested_state()
13966 sync_vmcs12(vcpu, vmcs12); in vmx_get_nested_state()
13970 if (copy_to_user(user_kvm_nested_state->data, vmcs12, sizeof(*vmcs12))) in vmx_get_nested_state()
13973 if (nested_cpu_has_shadow_vmcs(vmcs12) && in vmx_get_nested_state()
13974 vmcs12->vmcs_link_pointer != -1ull) { in vmx_get_nested_state()
13976 get_shadow_vmcs12(vcpu), sizeof(*vmcs12))) in vmx_get_nested_state()
13989 struct vmcs12 *vmcs12; in vmx_set_nested_state() local
14013 if (kvm_state->size < sizeof(kvm_state) + sizeof(*vmcs12)) in vmx_set_nested_state()
14059 vmcs12 = get_vmcs12(vcpu); in vmx_set_nested_state()
14060 if (copy_from_user(vmcs12, user_kvm_nested_state->data, sizeof(*vmcs12))) in vmx_set_nested_state()
14063 if (vmcs12->hdr.revision_id != VMCS12_REVISION) in vmx_set_nested_state()
14072 if (nested_cpu_has_shadow_vmcs(vmcs12) && in vmx_set_nested_state()
14073 vmcs12->vmcs_link_pointer != -1ull) { in vmx_set_nested_state()
14074 struct vmcs12 *shadow_vmcs12 = get_shadow_vmcs12(vcpu); in vmx_set_nested_state()
14075 if (kvm_state->size < sizeof(kvm_state) + 2 * sizeof(*vmcs12)) in vmx_set_nested_state()
14080 sizeof(*vmcs12))) in vmx_set_nested_state()
14088 if (check_vmentry_prereqs(vcpu, vmcs12) || in vmx_set_nested_state()
14089 check_vmentry_postreqs(vcpu, vmcs12, &exit_qual)) in vmx_set_nested_state()