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