Re: [PATCH] KVM: nVMX: Sync L2 guest CET states between L1/L2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Yang,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on kvm/linux-next]
[also build test ERROR on v5.11-rc6 next-20210125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Yang-Weijiang/KVM-nVMX-Sync-L2-guest-CET-states-between-L1-L2/20210209-162909
base:   https://git.kernel.org/pub/scm/virt/kvm/kvm.git linux-next
config: x86_64-rhel (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
        # https://github.com/0day-ci/linux/commit/892519e752407d6c2c5fd732108f397291d3eb97
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Yang-Weijiang/KVM-nVMX-Sync-L2-guest-CET-states-between-L1-L2/20210209-162909
        git checkout 892519e752407d6c2c5fd732108f397291d3eb97
        # save the attached .config to linux build tree
        make W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All errors (new ones prefixed by >>):

   arch/x86/kvm/vmx/nested.c: In function 'prepare_vmcs02':
>> arch/x86/kvm/vmx/nested.c:2575:34: error: 'VM_ENTRY_LOAD_CET_STATE' undeclared (first use in this function); did you mean 'VM_ENTRY_LOAD_IA32_PAT'?
    2575 |  if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_CET_STATE) {
         |                                  ^~~~~~~~~~~~~~~~~~~~~~~
         |                                  VM_ENTRY_LOAD_IA32_PAT
   arch/x86/kvm/vmx/nested.c:2575:34: note: each undeclared identifier is reported only once for each function it appears in
>> arch/x86/kvm/vmx/nested.c:2576:15: error: 'GUEST_SSP' undeclared (first use in this function); did you mean 'GUEST_RSP'?
    2576 |   vmcs_writel(GUEST_SSP, vmcs12->guest_ssp);
         |               ^~~~~~~~~
         |               GUEST_RSP
>> arch/x86/kvm/vmx/nested.c:2576:34: error: 'struct vmcs12' has no member named 'guest_ssp'; did you mean 'guest_rsp'?
    2576 |   vmcs_writel(GUEST_SSP, vmcs12->guest_ssp);
         |                                  ^~~~~~~~~
         |                                  guest_rsp
>> arch/x86/kvm/vmx/nested.c:2577:15: error: 'GUEST_INTR_SSP_TABLE' undeclared (first use in this function); did you mean 'GUEST_INTR_STATUS'?
    2577 |   vmcs_writel(GUEST_INTR_SSP_TABLE, vmcs12->guest_ssp_tbl);
         |               ^~~~~~~~~~~~~~~~~~~~
         |               GUEST_INTR_STATUS
>> arch/x86/kvm/vmx/nested.c:2577:43: error: 'struct vmcs12' has no member named 'guest_ssp_tbl'
    2577 |   vmcs_writel(GUEST_INTR_SSP_TABLE, vmcs12->guest_ssp_tbl);
         |                                           ^~
>> arch/x86/kvm/vmx/nested.c:2578:15: error: 'GUEST_S_CET' undeclared (first use in this function); did you mean 'GUEST_CR4'?
    2578 |   vmcs_writel(GUEST_S_CET, vmcs12->guest_s_cet);
         |               ^~~~~~~~~~~
         |               GUEST_CR4
>> arch/x86/kvm/vmx/nested.c:2578:36: error: 'struct vmcs12' has no member named 'guest_s_cet'; did you mean 'guest_cr0'?
    2578 |   vmcs_writel(GUEST_S_CET, vmcs12->guest_s_cet);
         |                                    ^~~~~~~~~~~
         |                                    guest_cr0
   arch/x86/kvm/vmx/nested.c: In function 'sync_vmcs02_to_vmcs12':
   arch/x86/kvm/vmx/nested.c:4113:34: error: 'VM_ENTRY_LOAD_CET_STATE' undeclared (first use in this function); did you mean 'VM_ENTRY_LOAD_IA32_PAT'?
    4113 |  if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_CET_STATE) {
         |                                  ^~~~~~~~~~~~~~~~~~~~~~~
         |                                  VM_ENTRY_LOAD_IA32_PAT
   arch/x86/kvm/vmx/nested.c:4114:11: error: 'struct vmcs12' has no member named 'guest_ssp'; did you mean 'guest_rsp'?
    4114 |   vmcs12->guest_ssp = vmcs_readl(GUEST_SSP);
         |           ^~~~~~~~~
         |           guest_rsp
   arch/x86/kvm/vmx/nested.c:4114:34: error: 'GUEST_SSP' undeclared (first use in this function); did you mean 'GUEST_RSP'?
    4114 |   vmcs12->guest_ssp = vmcs_readl(GUEST_SSP);
         |                                  ^~~~~~~~~
         |                                  GUEST_RSP
   arch/x86/kvm/vmx/nested.c:4115:9: error: 'struct vmcs12' has no member named 'guest_ssp_tbl'
    4115 |   vmcs12->guest_ssp_tbl = vmcs_readl(GUEST_INTR_SSP_TABLE);
         |         ^~
   arch/x86/kvm/vmx/nested.c:4115:38: error: 'GUEST_INTR_SSP_TABLE' undeclared (first use in this function); did you mean 'GUEST_INTR_STATUS'?
    4115 |   vmcs12->guest_ssp_tbl = vmcs_readl(GUEST_INTR_SSP_TABLE);
         |                                      ^~~~~~~~~~~~~~~~~~~~
         |                                      GUEST_INTR_STATUS
   arch/x86/kvm/vmx/nested.c:4116:11: error: 'struct vmcs12' has no member named 'guest_s_cet'; did you mean 'guest_cr0'?
    4116 |   vmcs12->guest_s_cet = vmcs_readl(GUEST_S_CET);
         |           ^~~~~~~~~~~
         |           guest_cr0
   arch/x86/kvm/vmx/nested.c:4116:36: error: 'GUEST_S_CET' undeclared (first use in this function); did you mean 'GUEST_CR4'?
    4116 |   vmcs12->guest_s_cet = vmcs_readl(GUEST_S_CET);
         |                                    ^~~~~~~~~~~
         |                                    GUEST_CR4


vim +2575 arch/x86/kvm/vmx/nested.c

  2490	
  2491	/*
  2492	 * prepare_vmcs02 is called when the L1 guest hypervisor runs its nested
  2493	 * L2 guest. L1 has a vmcs for L2 (vmcs12), and this function "merges" it
  2494	 * with L0's requirements for its guest (a.k.a. vmcs01), so we can run the L2
  2495	 * guest in a way that will both be appropriate to L1's requests, and our
  2496	 * needs. In addition to modifying the active vmcs (which is vmcs02), this
  2497	 * function also has additional necessary side-effects, like setting various
  2498	 * vcpu->arch fields.
  2499	 * Returns 0 on success, 1 on failure. Invalid state exit qualification code
  2500	 * is assigned to entry_failure_code on failure.
  2501	 */
  2502	static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
  2503				  enum vm_entry_failure_code *entry_failure_code)
  2504	{
  2505		struct vcpu_vmx *vmx = to_vmx(vcpu);
  2506		struct hv_enlightened_vmcs *hv_evmcs = vmx->nested.hv_evmcs;
  2507		bool load_guest_pdptrs_vmcs12 = false;
  2508	
  2509		if (vmx->nested.dirty_vmcs12 || hv_evmcs) {
  2510			prepare_vmcs02_rare(vmx, vmcs12);
  2511			vmx->nested.dirty_vmcs12 = false;
  2512	
  2513			load_guest_pdptrs_vmcs12 = !hv_evmcs ||
  2514				!(hv_evmcs->hv_clean_fields &
  2515				  HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1);
  2516		}
  2517	
  2518		if (vmx->nested.nested_run_pending &&
  2519		    (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS)) {
  2520			kvm_set_dr(vcpu, 7, vmcs12->guest_dr7);
  2521			vmcs_write64(GUEST_IA32_DEBUGCTL, vmcs12->guest_ia32_debugctl);
  2522		} else {
  2523			kvm_set_dr(vcpu, 7, vcpu->arch.dr7);
  2524			vmcs_write64(GUEST_IA32_DEBUGCTL, vmx->nested.vmcs01_debugctl);
  2525		}
  2526		if (kvm_mpx_supported() && (!vmx->nested.nested_run_pending ||
  2527		    !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)))
  2528			vmcs_write64(GUEST_BNDCFGS, vmx->nested.vmcs01_guest_bndcfgs);
  2529		vmx_set_rflags(vcpu, vmcs12->guest_rflags);
  2530	
  2531		/* EXCEPTION_BITMAP and CR0_GUEST_HOST_MASK should basically be the
  2532		 * bitwise-or of what L1 wants to trap for L2, and what we want to
  2533		 * trap. Note that CR0.TS also needs updating - we do this later.
  2534		 */
  2535		update_exception_bitmap(vcpu);
  2536		vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask;
  2537		vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits);
  2538	
  2539		if (vmx->nested.nested_run_pending &&
  2540		    (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT)) {
  2541			vmcs_write64(GUEST_IA32_PAT, vmcs12->guest_ia32_pat);
  2542			vcpu->arch.pat = vmcs12->guest_ia32_pat;
  2543		} else if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
  2544			vmcs_write64(GUEST_IA32_PAT, vmx->vcpu.arch.pat);
  2545		}
  2546	
  2547		vmcs_write64(TSC_OFFSET, vcpu->arch.tsc_offset);
  2548	
  2549		if (kvm_has_tsc_control)
  2550			decache_tsc_multiplier(vmx);
  2551	
  2552		nested_vmx_transition_tlb_flush(vcpu, vmcs12, true);
  2553	
  2554		if (nested_cpu_has_ept(vmcs12))
  2555			nested_ept_init_mmu_context(vcpu);
  2556	
  2557		/*
  2558		 * This sets GUEST_CR0 to vmcs12->guest_cr0, possibly modifying those
  2559		 * bits which we consider mandatory enabled.
  2560		 * The CR0_READ_SHADOW is what L2 should have expected to read given
  2561		 * the specifications by L1; It's not enough to take
  2562		 * vmcs12->cr0_read_shadow because on our cr0_guest_host_mask we we
  2563		 * have more bits than L1 expected.
  2564		 */
  2565		vmx_set_cr0(vcpu, vmcs12->guest_cr0);
  2566		vmcs_writel(CR0_READ_SHADOW, nested_read_cr0(vmcs12));
  2567	
  2568		vmx_set_cr4(vcpu, vmcs12->guest_cr4);
  2569		vmcs_writel(CR4_READ_SHADOW, nested_read_cr4(vmcs12));
  2570	
  2571		vcpu->arch.efer = nested_vmx_calc_efer(vmx, vmcs12);
  2572		/* Note: may modify VM_ENTRY/EXIT_CONTROLS and GUEST/HOST_IA32_EFER */
  2573		vmx_set_efer(vcpu, vcpu->arch.efer);
  2574	
> 2575		if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_CET_STATE) {
> 2576			vmcs_writel(GUEST_SSP, vmcs12->guest_ssp);
> 2577			vmcs_writel(GUEST_INTR_SSP_TABLE, vmcs12->guest_ssp_tbl);
> 2578			vmcs_writel(GUEST_S_CET, vmcs12->guest_s_cet);
  2579		}
  2580	
  2581		/*
  2582		 * Guest state is invalid and unrestricted guest is disabled,
  2583		 * which means L1 attempted VMEntry to L2 with invalid state.
  2584		 * Fail the VMEntry.
  2585		 */
  2586		if (CC(!vmx_guest_state_valid(vcpu))) {
  2587			*entry_failure_code = ENTRY_FAIL_DEFAULT;
  2588			return -EINVAL;
  2589		}
  2590	
  2591		/* Shadow page tables on either EPT or shadow page tables. */
  2592		if (nested_vmx_load_cr3(vcpu, vmcs12->guest_cr3, nested_cpu_has_ept(vmcs12),
  2593					entry_failure_code))
  2594			return -EINVAL;
  2595	
  2596		/*
  2597		 * Immediately write vmcs02.GUEST_CR3.  It will be propagated to vmcs12
  2598		 * on nested VM-Exit, which can occur without actually running L2 and
  2599		 * thus without hitting vmx_load_mmu_pgd(), e.g. if L1 is entering L2 with
  2600		 * vmcs12.GUEST_ACTIVITYSTATE=HLT, in which case KVM will intercept the
  2601		 * transition to HLT instead of running L2.
  2602		 */
  2603		if (enable_ept)
  2604			vmcs_writel(GUEST_CR3, vmcs12->guest_cr3);
  2605	
  2606		/* Late preparation of GUEST_PDPTRs now that EFER and CRs are set. */
  2607		if (load_guest_pdptrs_vmcs12 && nested_cpu_has_ept(vmcs12) &&
  2608		    is_pae_paging(vcpu)) {
  2609			vmcs_write64(GUEST_PDPTR0, vmcs12->guest_pdptr0);
  2610			vmcs_write64(GUEST_PDPTR1, vmcs12->guest_pdptr1);
  2611			vmcs_write64(GUEST_PDPTR2, vmcs12->guest_pdptr2);
  2612			vmcs_write64(GUEST_PDPTR3, vmcs12->guest_pdptr3);
  2613		}
  2614	
  2615		if (!enable_ept)
  2616			vcpu->arch.walk_mmu->inject_page_fault = vmx_inject_page_fault_nested;
  2617	
  2618		if ((vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL) &&
  2619		    WARN_ON_ONCE(kvm_set_msr(vcpu, MSR_CORE_PERF_GLOBAL_CTRL,
  2620					     vmcs12->guest_ia32_perf_global_ctrl)))
  2621			return -EINVAL;
  2622	
  2623		kvm_rsp_write(vcpu, vmcs12->guest_rsp);
  2624		kvm_rip_write(vcpu, vmcs12->guest_rip);
  2625		return 0;
  2626	}
  2627	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux