* arch/x86/kvm/vmx/nested.c:3362:30: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]
@ 2021-08-08 22:59 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2021-08-08 22:59 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 28894 bytes --]
CC: clang-built-linux(a)googlegroups.com
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Vitaly Kuznetsov <vkuznets@redhat.com>
CC: Paolo Bonzini <pbonzini@redhat.com>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: cceb634774efca60f8cc57041234f00faf97f22d
commit: f5c7e8425f18fdb9bdb7d13340651d7876890329 KVM: nVMX: Always make an attempt to map eVMCS after migration
date: 3 months ago
:::::: branch date: 4 hours ago
:::::: commit date: 3 months ago
config: x86_64-randconfig-c001-20210806 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 42b9c2a17a0b63cccf3ac197a82f91b28e53e643)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f5c7e8425f18fdb9bdb7d13340651d7876890329
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch --no-tags linus master
git checkout f5c7e8425f18fdb9bdb7d13340651d7876890329
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
ipc/shm.c:1446:9: note: Assuming 'addr' is 0, which participates in a condition later
if (!addr && (shmflg & SHM_REMAP))
^~~~~
ipc/shm.c:1446:9: note: Left side of '&&' is true
ipc/shm.c:1446:19: note: Assuming the condition is false
if (!addr && (shmflg & SHM_REMAP))
^~~~~~~~~~~~~~~~~~
ipc/shm.c:1446:5: note: Taking false branch
if (!addr && (shmflg & SHM_REMAP))
^
ipc/shm.c:1459:6: note: Assuming the condition is false
if (shmflg & SHM_RDONLY) {
^~~~~~~~~~~~~~~~~~~
ipc/shm.c:1459:2: note: Taking false branch
if (shmflg & SHM_RDONLY) {
^
ipc/shm.c:1468:6: note: Assuming the condition is false
if (shmflg & SHM_EXEC) {
^~~~~~~~~~~~~~~~~
ipc/shm.c:1468:2: note: Taking false branch
if (shmflg & SHM_EXEC) {
^
ipc/shm.c:1479:8: note: Calling 'shm_obtain_object_check'
shp = shm_obtain_object_check(ns, shmid);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ipc/shm.c:170:6: note: Calling 'IS_ERR'
if (IS_ERR(ipcp))
^~~~~~~~~~~~
include/linux/err.h:36:9: note: Assuming the condition is true
return IS_ERR_VALUE((unsigned long)ptr);
^
include/linux/err.h:22:34: note: expanded from macro 'IS_ERR_VALUE'
#define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO)
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
include/linux/err.h:36:2: note: Returning the value 1, which participates in a condition later
return IS_ERR_VALUE((unsigned long)ptr);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ipc/shm.c:170:6: note: Returning from 'IS_ERR'
if (IS_ERR(ipcp))
^~~~~~~~~~~~
ipc/shm.c:170:2: note: Taking true branch
if (IS_ERR(ipcp))
^
ipc/shm.c:171:3: note: Returning pointer, which participates in a condition later
return ERR_CAST(ipcp);
^~~~~~~~~~~~~~~~~~~~~
ipc/shm.c:1479:8: note: Returning from 'shm_obtain_object_check'
shp = shm_obtain_object_check(ns, shmid);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ipc/shm.c:1480:6: note: Calling 'IS_ERR'
if (IS_ERR(shp)) {
^~~~~~~~~~~
include/linux/err.h:36:2: note: Returning the value 1, which participates in a condition later
return IS_ERR_VALUE((unsigned long)ptr);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ipc/shm.c:1480:6: note: Returning from 'IS_ERR'
if (IS_ERR(shp)) {
^~~~~~~~~~~
ipc/shm.c:1480:2: note: Taking true branch
if (IS_ERR(shp)) {
^
ipc/shm.c:1482:3: note: Control jumps to line 1584
goto out_unlock;
^
ipc/shm.c:1586:2: note: Returning without writing to '*raddr'
return err;
^
ipc/shm.c:1586:2: note: Returning value (loaded from 'err'), which participates in a condition later
return err;
^~~~~~~~~~
ipc/shm.c:1612:8: note: Returning from 'do_shmat'
err = do_shmat(shmid, compat_ptr(shmaddr), shmflg, &ret, COMPAT_SHMLBA);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ipc/shm.c:1613:6: note: Assuming 'err' is 0
if (err)
^~~
ipc/shm.c:1613:2: note: Taking false branch
if (err)
^
ipc/shm.c:1615:2: note: Loop condition is false. Exiting loop
force_successful_syscall_return();
^
include/linux/ptrace.h:254:43: note: expanded from macro 'force_successful_syscall_return'
#define force_successful_syscall_return() do { } while (0)
^
ipc/shm.c:1616:2: note: Undefined or garbage value returned to caller
return (long)ret;
^ ~~~~~~~~~
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (9 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
12 warnings generated.
>> arch/x86/kvm/vmx/nested.c:3362:30: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]
vmcs12->exit_qualification = entry_failure_code;
^
arch/x86/kvm/vmx/nested.c:6165:6: note: Assuming field 'format' is equal to KVM_STATE_NESTED_FORMAT_VMX
if (kvm_state->format != KVM_STATE_NESTED_FORMAT_VMX)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6165:2: note: Taking false branch
if (kvm_state->format != KVM_STATE_NESTED_FORMAT_VMX)
^
arch/x86/kvm/vmx/nested.c:6168:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.vmxon_pa == -1ull) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6168:2: note: Taking false branch
if (kvm_state->hdr.vmx.vmxon_pa == -1ull) {
^
arch/x86/kvm/vmx/nested.c:6187:7: note: Assuming the condition is false
if (!nested_vmx_allowed(vcpu))
^~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6187:3: note: Taking false branch
if (!nested_vmx_allowed(vcpu))
^
arch/x86/kvm/vmx/nested.c:6190:3: note: Taking false branch
if (!page_address_valid(vcpu, kvm_state->hdr.vmx.vmxon_pa))
^
arch/x86/kvm/vmx/nested.c:6194:7: note: Assuming the condition is false
if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6194:71: note: Left side of '&&' is false
if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
^
arch/x86/kvm/vmx/nested.c:6198:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.smm.flags &
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6198:2: note: Taking false branch
if (kvm_state->hdr.vmx.smm.flags &
^
arch/x86/kvm/vmx/nested.c:6202:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.flags & ~KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6202:2: note: Taking false branch
if (kvm_state->hdr.vmx.flags & ~KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE)
^
arch/x86/kvm/vmx/nested.c:6210:6: note: Assuming the condition is true
if (is_smm(vcpu) ?
^~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6210:6: note: '?' condition is true
arch/x86/kvm/vmx/nested.c:6210:6: note: Assuming the condition is false
if (is_smm(vcpu) ?
^~~~~~
arch/x86/kvm/vmx/nested.c:6210:2: note: Taking false branch
if (is_smm(vcpu) ?
^
arch/x86/kvm/vmx/nested.c:6216:71: note: Left side of '&&' is false
if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
^
arch/x86/kvm/vmx/nested.c:6220:7: note: Assuming the condition is false
if ((kvm_state->flags & KVM_STATE_NESTED_EVMCS) &&
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6220:50: note: Left side of '&&' is false
if ((kvm_state->flags & KVM_STATE_NESTED_EVMCS) &&
^
arch/x86/kvm/vmx/nested.c:6226:2: note: Taking false branch
if (kvm_state->hdr.vmx.vmxon_pa == -1ull)
^
arch/x86/kvm/vmx/nested.c:6231:6: note: 'ret' is 0
if (ret)
^~~
arch/x86/kvm/vmx/nested.c:6231:2: note: Taking false branch
if (ret)
^
arch/x86/kvm/vmx/nested.c:6235:6: note: Assuming the condition is false
if (kvm_state->size < sizeof(*kvm_state) + sizeof(*vmcs12)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6235:2: note: Taking false branch
if (kvm_state->size < sizeof(*kvm_state) + sizeof(*vmcs12)) {
^
arch/x86/kvm/vmx/nested.c:6245:6: note: Assuming the condition is true
if (kvm_state->hdr.vmx.vmcs12_pa != -1ull) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6245:2: note: Taking true branch
if (kvm_state->hdr.vmx.vmcs12_pa != -1ull) {
^
arch/x86/kvm/vmx/nested.c:6246:7: note: Assuming field 'vmcs12_pa' is not equal to field 'vmxon_pa'
if (kvm_state->hdr.vmx.vmcs12_pa == kvm_state->hdr.vmx.vmxon_pa ||
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6246:7: note: Left side of '||' is false
arch/x86/kvm/vmx/nested.c:6246:3: note: Taking false branch
if (kvm_state->hdr.vmx.vmcs12_pa == kvm_state->hdr.vmx.vmxon_pa ||
^
arch/x86/kvm/vmx/nested.c:6263:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_VMXON) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6263:2: note: Taking false branch
if (kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_VMXON) {
^
arch/x86/kvm/vmx/nested.c:6272:6: note: Assuming the condition is false
if (copy_from_user(vmcs12, user_vmx_nested_state->vmcs12, sizeof(*vmcs12)))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6272:2: note: Taking false branch
if (copy_from_user(vmcs12, user_vmx_nested_state->vmcs12, sizeof(*vmcs12)))
^
vim +3362 arch/x86/kvm/vmx/nested.c
55d2375e58a61b Sean Christopherson 2018-12-03 3273
55d2375e58a61b Sean Christopherson 2018-12-03 3274 static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,
55d2375e58a61b Sean Christopherson 2018-12-03 3275 struct vmcs12 *vmcs12);
55d2375e58a61b Sean Christopherson 2018-12-03 3276
55d2375e58a61b Sean Christopherson 2018-12-03 3277 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3278 * If from_vmentry is false, this is being called from state restore (either RSM
55d2375e58a61b Sean Christopherson 2018-12-03 3279 * or KVM_SET_NESTED_STATE). Otherwise it's called from vmlaunch/vmresume.
671ddc700fd08b Jim Mattson 2019-10-15 3280 *
671ddc700fd08b Jim Mattson 2019-10-15 3281 * Returns:
463bfeeead9741 Miaohe Lin 2020-02-14 3282 * NVMX_VMENTRY_SUCCESS: Entered VMX non-root mode
463bfeeead9741 Miaohe Lin 2020-02-14 3283 * NVMX_VMENTRY_VMFAIL: Consistency check VMFail
463bfeeead9741 Miaohe Lin 2020-02-14 3284 * NVMX_VMENTRY_VMEXIT: Consistency check VMExit
463bfeeead9741 Miaohe Lin 2020-02-14 3285 * NVMX_VMENTRY_KVM_INTERNAL_ERROR: KVM internal error
55d2375e58a61b Sean Christopherson 2018-12-03 3286 */
671ddc700fd08b Jim Mattson 2019-10-15 3287 enum nvmx_vmentry_status nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu,
671ddc700fd08b Jim Mattson 2019-10-15 3288 bool from_vmentry)
55d2375e58a61b Sean Christopherson 2018-12-03 3289 {
55d2375e58a61b Sean Christopherson 2018-12-03 3290 struct vcpu_vmx *vmx = to_vmx(vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3291 struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
68cda40d9f3c4c Sean Christopherson 2020-05-11 3292 enum vm_entry_failure_code entry_failure_code;
55d2375e58a61b Sean Christopherson 2018-12-03 3293 bool evaluate_pending_interrupts;
8e53324021645f Sean Christopherson 2020-11-06 3294 union vmx_exit_reason exit_reason = {
8e53324021645f Sean Christopherson 2020-11-06 3295 .basic = EXIT_REASON_INVALID_STATE,
8e53324021645f Sean Christopherson 2020-11-06 3296 .failed_vmentry = 1,
8e53324021645f Sean Christopherson 2020-11-06 3297 };
8e53324021645f Sean Christopherson 2020-11-06 3298 u32 failed_index;
55d2375e58a61b Sean Christopherson 2018-12-03 3299
eeeb4f67a6cd43 Sean Christopherson 2020-03-20 3300 if (kvm_check_request(KVM_REQ_TLB_FLUSH_CURRENT, vcpu))
eeeb4f67a6cd43 Sean Christopherson 2020-03-20 3301 kvm_vcpu_flush_tlb_current(vcpu);
eeeb4f67a6cd43 Sean Christopherson 2020-03-20 3302
2183f5645ae7e0 Sean Christopherson 2019-05-07 3303 evaluate_pending_interrupts = exec_controls_get(vmx) &
4e2a0bc56ad197 Xiaoyao Li 2019-12-06 3304 (CPU_BASED_INTR_WINDOW_EXITING | CPU_BASED_NMI_WINDOW_EXITING);
55d2375e58a61b Sean Christopherson 2018-12-03 3305 if (likely(!evaluate_pending_interrupts) && kvm_vcpu_apicv_active(vcpu))
55d2375e58a61b Sean Christopherson 2018-12-03 3306 evaluate_pending_interrupts |= vmx_has_apicv_interrupt(vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3307
55d2375e58a61b Sean Christopherson 2018-12-03 3308 if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
55d2375e58a61b Sean Christopherson 2018-12-03 3309 vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
55d2375e58a61b Sean Christopherson 2018-12-03 3310 if (kvm_mpx_supported() &&
55d2375e58a61b Sean Christopherson 2018-12-03 3311 !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))
55d2375e58a61b Sean Christopherson 2018-12-03 3312 vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS);
55d2375e58a61b Sean Christopherson 2018-12-03 3313
f087a02941feac Sean Christopherson 2019-06-07 3314 /*
f087a02941feac Sean Christopherson 2019-06-07 3315 * Overwrite vmcs01.GUEST_CR3 with L1's CR3 if EPT is disabled *and*
f087a02941feac Sean Christopherson 2019-06-07 3316 * nested early checks are disabled. In the event of a "late" VM-Fail,
f087a02941feac Sean Christopherson 2019-06-07 3317 * i.e. a VM-Fail detected by hardware but not KVM, KVM must unwind its
f087a02941feac Sean Christopherson 2019-06-07 3318 * software model to the pre-VMEntry host state. When EPT is disabled,
f087a02941feac Sean Christopherson 2019-06-07 3319 * GUEST_CR3 holds KVM's shadow CR3, not L1's "real" CR3, which causes
f087a02941feac Sean Christopherson 2019-06-07 3320 * nested_vmx_restore_host_state() to corrupt vcpu->arch.cr3. Stuffing
f087a02941feac Sean Christopherson 2019-06-07 3321 * vmcs01.GUEST_CR3 results in the unwind naturally setting arch.cr3 to
f087a02941feac Sean Christopherson 2019-06-07 3322 * the correct value. Smashing vmcs01.GUEST_CR3 is safe because nested
f087a02941feac Sean Christopherson 2019-06-07 3323 * VM-Exits, and the unwind, reset KVM's MMU, i.e. vmcs01.GUEST_CR3 is
f087a02941feac Sean Christopherson 2019-06-07 3324 * guaranteed to be overwritten with a shadow CR3 prior to re-entering
f087a02941feac Sean Christopherson 2019-06-07 3325 * L1. Don't stuff vmcs01.GUEST_CR3 when using nested early checks as
f087a02941feac Sean Christopherson 2019-06-07 3326 * KVM modifies vcpu->arch.cr3 if and only if the early hardware checks
f087a02941feac Sean Christopherson 2019-06-07 3327 * pass, and early VM-Fails do not reset KVM's MMU, i.e. the VM-Fail
f087a02941feac Sean Christopherson 2019-06-07 3328 * path would need to manually save/restore vmcs01.GUEST_CR3.
f087a02941feac Sean Christopherson 2019-06-07 3329 */
f087a02941feac Sean Christopherson 2019-06-07 3330 if (!enable_ept && !nested_early_check)
f087a02941feac Sean Christopherson 2019-06-07 3331 vmcs_writel(GUEST_CR3, vcpu->arch.cr3);
f087a02941feac Sean Christopherson 2019-06-07 3332
55d2375e58a61b Sean Christopherson 2018-12-03 3333 vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02);
55d2375e58a61b Sean Christopherson 2018-12-03 3334
55d2375e58a61b Sean Christopherson 2018-12-03 3335 prepare_vmcs02_early(vmx, vmcs12);
55d2375e58a61b Sean Christopherson 2018-12-03 3336
55d2375e58a61b Sean Christopherson 2018-12-03 3337 if (from_vmentry) {
b89d5ad00e7899 Sean Christopherson 2020-09-23 3338 if (unlikely(!nested_get_vmcs12_pages(vcpu))) {
b89d5ad00e7899 Sean Christopherson 2020-09-23 3339 vmx_switch_vmcs(vcpu, &vmx->vmcs01);
671ddc700fd08b Jim Mattson 2019-10-15 3340 return NVMX_VMENTRY_KVM_INTERNAL_ERROR;
b89d5ad00e7899 Sean Christopherson 2020-09-23 3341 }
55d2375e58a61b Sean Christopherson 2018-12-03 3342
55d2375e58a61b Sean Christopherson 2018-12-03 3343 if (nested_vmx_check_vmentry_hw(vcpu)) {
55d2375e58a61b Sean Christopherson 2018-12-03 3344 vmx_switch_vmcs(vcpu, &vmx->vmcs01);
671ddc700fd08b Jim Mattson 2019-10-15 3345 return NVMX_VMENTRY_VMFAIL;
55d2375e58a61b Sean Christopherson 2018-12-03 3346 }
55d2375e58a61b Sean Christopherson 2018-12-03 3347
68cda40d9f3c4c Sean Christopherson 2020-05-11 3348 if (nested_vmx_check_guest_state(vcpu, vmcs12,
68cda40d9f3c4c Sean Christopherson 2020-05-11 3349 &entry_failure_code)) {
8e53324021645f Sean Christopherson 2020-11-06 3350 exit_reason.basic = EXIT_REASON_INVALID_STATE;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3351 vmcs12->exit_qualification = entry_failure_code;
55d2375e58a61b Sean Christopherson 2018-12-03 3352 goto vmentry_fail_vmexit;
55d2375e58a61b Sean Christopherson 2018-12-03 3353 }
68cda40d9f3c4c Sean Christopherson 2020-05-11 3354 }
55d2375e58a61b Sean Christopherson 2018-12-03 3355
55d2375e58a61b Sean Christopherson 2018-12-03 3356 enter_guest_mode(vcpu);
5e3d394fdd9e6b Xiaoyao Li 2019-12-06 3357 if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETTING)
55d2375e58a61b Sean Christopherson 2018-12-03 3358 vcpu->arch.tsc_offset += vmcs12->tsc_offset;
55d2375e58a61b Sean Christopherson 2018-12-03 3359
68cda40d9f3c4c Sean Christopherson 2020-05-11 3360 if (prepare_vmcs02(vcpu, vmcs12, &entry_failure_code)) {
8e53324021645f Sean Christopherson 2020-11-06 3361 exit_reason.basic = EXIT_REASON_INVALID_STATE;
68cda40d9f3c4c Sean Christopherson 2020-05-11 @3362 vmcs12->exit_qualification = entry_failure_code;
55d2375e58a61b Sean Christopherson 2018-12-03 3363 goto vmentry_fail_vmexit_guest_mode;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3364 }
55d2375e58a61b Sean Christopherson 2018-12-03 3365
55d2375e58a61b Sean Christopherson 2018-12-03 3366 if (from_vmentry) {
68cda40d9f3c4c Sean Christopherson 2020-05-11 3367 failed_index = nested_vmx_load_msr(vcpu,
55d2375e58a61b Sean Christopherson 2018-12-03 3368 vmcs12->vm_entry_msr_load_addr,
55d2375e58a61b Sean Christopherson 2018-12-03 3369 vmcs12->vm_entry_msr_load_count);
68cda40d9f3c4c Sean Christopherson 2020-05-11 3370 if (failed_index) {
8e53324021645f Sean Christopherson 2020-11-06 3371 exit_reason.basic = EXIT_REASON_MSR_LOAD_FAIL;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3372 vmcs12->exit_qualification = failed_index;
55d2375e58a61b Sean Christopherson 2018-12-03 3373 goto vmentry_fail_vmexit_guest_mode;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3374 }
55d2375e58a61b Sean Christopherson 2018-12-03 3375 } else {
55d2375e58a61b Sean Christopherson 2018-12-03 3376 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3377 * The MMU is not initialized to point at the right entities yet and
55d2375e58a61b Sean Christopherson 2018-12-03 3378 * "get pages" would need to read data from the guest (i.e. we will
55d2375e58a61b Sean Christopherson 2018-12-03 3379 * need to perform gpa to hpa translation). Request a call
55d2375e58a61b Sean Christopherson 2018-12-03 3380 * to nested_get_vmcs12_pages before the next VM-entry. The MSRs
55d2375e58a61b Sean Christopherson 2018-12-03 3381 * have already been set at vmentry time and should not be reset.
55d2375e58a61b Sean Christopherson 2018-12-03 3382 */
729c15c20f1a7c Paolo Bonzini 2020-09-22 3383 kvm_make_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3384 }
55d2375e58a61b Sean Christopherson 2018-12-03 3385
55d2375e58a61b Sean Christopherson 2018-12-03 3386 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3387 * If L1 had a pending IRQ/NMI until it executed
55d2375e58a61b Sean Christopherson 2018-12-03 3388 * VMLAUNCH/VMRESUME which wasn't delivered because it was
55d2375e58a61b Sean Christopherson 2018-12-03 3389 * disallowed (e.g. interrupts disabled), L0 needs to
55d2375e58a61b Sean Christopherson 2018-12-03 3390 * evaluate if this pending event should cause an exit from L2
55d2375e58a61b Sean Christopherson 2018-12-03 3391 * to L1 or delivered directly to L2 (e.g. In case L1 don't
55d2375e58a61b Sean Christopherson 2018-12-03 3392 * intercept EXTERNAL_INTERRUPT).
55d2375e58a61b Sean Christopherson 2018-12-03 3393 *
55d2375e58a61b Sean Christopherson 2018-12-03 3394 * Usually this would be handled by the processor noticing an
55d2375e58a61b Sean Christopherson 2018-12-03 3395 * IRQ/NMI window request, or checking RVI during evaluation of
55d2375e58a61b Sean Christopherson 2018-12-03 3396 * pending virtual interrupts. However, this setting was done
55d2375e58a61b Sean Christopherson 2018-12-03 3397 * on VMCS01 and now VMCS02 is active instead. Thus, we force L0
55d2375e58a61b Sean Christopherson 2018-12-03 3398 * to perform pending event evaluation by requesting a KVM_REQ_EVENT.
55d2375e58a61b Sean Christopherson 2018-12-03 3399 */
55d2375e58a61b Sean Christopherson 2018-12-03 3400 if (unlikely(evaluate_pending_interrupts))
55d2375e58a61b Sean Christopherson 2018-12-03 3401 kvm_make_request(KVM_REQ_EVENT, vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3402
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3403 /*
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3404 * Do not start the preemption timer hrtimer until after we know
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3405 * we are successful, so that only nested_vmx_vmexit needs to cancel
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3406 * the timer.
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3407 */
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3408 vmx->nested.preemption_timer_expired = false;
850448f35aaf45 Peter Shier 2020-05-26 3409 if (nested_cpu_has_preemption_timer(vmcs12)) {
850448f35aaf45 Peter Shier 2020-05-26 3410 u64 timer_value = vmx_calc_preemption_timer_value(vcpu);
850448f35aaf45 Peter Shier 2020-05-26 3411 vmx_start_preemption_timer(vcpu, timer_value);
850448f35aaf45 Peter Shier 2020-05-26 3412 }
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3413
55d2375e58a61b Sean Christopherson 2018-12-03 3414 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3415 * Note no nested_vmx_succeed or nested_vmx_fail here. At this point
55d2375e58a61b Sean Christopherson 2018-12-03 3416 * we are no longer running L1, and VMLAUNCH/VMRESUME has not yet
55d2375e58a61b Sean Christopherson 2018-12-03 3417 * returned as far as L1 is concerned. It will only return (and set
55d2375e58a61b Sean Christopherson 2018-12-03 3418 * the success flag) when L2 exits (see nested_vmx_vmexit()).
55d2375e58a61b Sean Christopherson 2018-12-03 3419 */
671ddc700fd08b Jim Mattson 2019-10-15 3420 return NVMX_VMENTRY_SUCCESS;
55d2375e58a61b Sean Christopherson 2018-12-03 3421
55d2375e58a61b Sean Christopherson 2018-12-03 3422 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3423 * A failed consistency check that leads to a VMExit during L1's
55d2375e58a61b Sean Christopherson 2018-12-03 3424 * VMEnter to L2 is a variation of a normal VMexit, as explained in
55d2375e58a61b Sean Christopherson 2018-12-03 3425 * 26.7 "VM-entry failures during or after loading guest state".
55d2375e58a61b Sean Christopherson 2018-12-03 3426 */
55d2375e58a61b Sean Christopherson 2018-12-03 3427 vmentry_fail_vmexit_guest_mode:
5e3d394fdd9e6b Xiaoyao Li 2019-12-06 3428 if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETTING)
55d2375e58a61b Sean Christopherson 2018-12-03 3429 vcpu->arch.tsc_offset -= vmcs12->tsc_offset;
55d2375e58a61b Sean Christopherson 2018-12-03 3430 leave_guest_mode(vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3431
55d2375e58a61b Sean Christopherson 2018-12-03 3432 vmentry_fail_vmexit:
55d2375e58a61b Sean Christopherson 2018-12-03 3433 vmx_switch_vmcs(vcpu, &vmx->vmcs01);
55d2375e58a61b Sean Christopherson 2018-12-03 3434
55d2375e58a61b Sean Christopherson 2018-12-03 3435 if (!from_vmentry)
671ddc700fd08b Jim Mattson 2019-10-15 3436 return NVMX_VMENTRY_VMEXIT;
55d2375e58a61b Sean Christopherson 2018-12-03 3437
55d2375e58a61b Sean Christopherson 2018-12-03 3438 load_vmcs12_host_state(vcpu, vmcs12);
8e53324021645f Sean Christopherson 2020-11-06 3439 vmcs12->vm_exit_reason = exit_reason.full;
55d2375e58a61b Sean Christopherson 2018-12-03 3440 if (enable_shadow_vmcs || vmx->nested.hv_evmcs)
3731905ef28fc1 Sean Christopherson 2019-05-07 3441 vmx->nested.need_vmcs12_to_shadow_sync = true;
671ddc700fd08b Jim Mattson 2019-10-15 3442 return NVMX_VMENTRY_VMEXIT;
55d2375e58a61b Sean Christopherson 2018-12-03 3443 }
55d2375e58a61b Sean Christopherson 2018-12-03 3444
:::::: The code at line 3362 was first introduced by commit
:::::: 68cda40d9f3c4cb880108eb22f974d9e3d5dc6c5 KVM: nVMX: Tweak handling of failure code for nested VM-Enter failure
:::::: TO: Sean Christopherson <sean.j.christopherson@intel.com>
:::::: CC: Paolo Bonzini <pbonzini@redhat.com>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 28062 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
* arch/x86/kvm/vmx/nested.c:3362:30: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]
@ 2021-08-09 11:03 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2021-08-09 11:03 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 29979 bytes --]
CC: clang-built-linux(a)googlegroups.com
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Vitaly Kuznetsov <vkuznets@redhat.com>
CC: Paolo Bonzini <pbonzini@redhat.com>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 36a21d51725af2ce0700c6ebcb6b9594aac658a6
commit: f5c7e8425f18fdb9bdb7d13340651d7876890329 KVM: nVMX: Always make an attempt to map eVMCS after migration
date: 3 months ago
:::::: branch date: 14 hours ago
:::::: commit date: 3 months ago
config: x86_64-randconfig-c001-20210806 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 42b9c2a17a0b63cccf3ac197a82f91b28e53e643)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f5c7e8425f18fdb9bdb7d13340651d7876890329
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch --no-tags linus master
git checkout f5c7e8425f18fdb9bdb7d13340651d7876890329
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
4 warnings generated.
Suppressed 4 warnings (3 in non-user code, 1 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
3 warnings generated.
Suppressed 3 warnings (3 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
arch/x86/include/asm/xen/hypercall.h:358:9: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]
return _hypercall2(int, event_channel_op, cmd, arg);
^
arch/x86/include/asm/xen/hypercall.h:169:2: note: expanded from macro '_hypercall2'
__HYPERCALL_DECLS; \
^
arch/x86/include/asm/xen/hypercall.h:113:2: note: expanded from macro '__HYPERCALL_DECLS'
register unsigned long __arg1 asm(__HYPERCALL_ARG1REG) = __arg1; \
^
drivers/xen/events/events_2l.c:89:21: note: Loop condition is false. Exiting loop
unsigned int cpu = get_cpu();
^
include/linux/smp.h:260:23: note: expanded from macro 'get_cpu'
#define get_cpu() ({ preempt_disable(); __smp_processor_id(); })
^
include/linux/preempt.h:175:27: note: expanded from macro 'preempt_disable'
#define preempt_disable() \
^
drivers/xen/events/events_2l.c:92:10: note: Loop condition is false. Exiting loop
BUG_ON(!irqs_disabled());
^
include/linux/irqflags.h:254:3: note: expanded from macro 'irqs_disabled'
raw_local_save_flags(_flags); \
^
include/linux/irqflags.h:180:2: note: expanded from macro 'raw_local_save_flags'
do { \
^
drivers/xen/events/events_2l.c:92:2: note: Taking false branch
BUG_ON(!irqs_disabled());
^
include/asm-generic/bug.h:63:32: note: expanded from macro 'BUG_ON'
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
^
drivers/xen/events/events_2l.c:92:2: note: Loop condition is false. Exiting loop
BUG_ON(!irqs_disabled());
^
include/asm-generic/bug.h:63:27: note: expanded from macro 'BUG_ON'
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
^
drivers/xen/events/events_2l.c:96:16: note: Assuming the condition is true
if (unlikely((cpu != cpu_from_evtchn(port))))
^
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
drivers/xen/events/events_2l.c:96:2: note: Taking true branch
if (unlikely((cpu != cpu_from_evtchn(port))))
^
drivers/xen/events/events_2l.c:119:6: note: 'do_hypercall' is 1
if (do_hypercall) {
^~~~~~~~~~~~
drivers/xen/events/events_2l.c:119:2: note: Taking true branch
if (do_hypercall) {
^
drivers/xen/events/events_2l.c:121:9: note: Calling 'HYPERVISOR_event_channel_op'
(void)HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/include/asm/xen/hypercall.h:358:9: note: Assigned value is garbage or undefined
return _hypercall2(int, event_channel_op, cmd, arg);
^
arch/x86/include/asm/xen/hypercall.h:169:2: note: expanded from macro '_hypercall2'
__HYPERCALL_DECLS; \
^~~~~~~~~~~~~~~~~
arch/x86/include/asm/xen/hypercall.h:113:2: note: expanded from macro '__HYPERCALL_DECLS'
register unsigned long __arg1 asm(__HYPERCALL_ARG1REG) = __arg1; \
^ ~~~~~~
drivers/xen/events/events_2l.c:207:4: warning: Value stored to 'bit_idx' is never read [clang-analyzer-deadcode.DeadStores]
bit_idx = 0;
^ ~
drivers/xen/events/events_2l.c:207:4: note: Value stored to 'bit_idx' is never read
bit_idx = 0;
^ ~
Suppressed 3 warnings (2 in non-user code, 1 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (9 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
12 warnings generated.
>> arch/x86/kvm/vmx/nested.c:3362:30: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]
vmcs12->exit_qualification = entry_failure_code;
^
arch/x86/kvm/vmx/nested.c:6165:6: note: Assuming field 'format' is equal to KVM_STATE_NESTED_FORMAT_VMX
if (kvm_state->format != KVM_STATE_NESTED_FORMAT_VMX)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6165:2: note: Taking false branch
if (kvm_state->format != KVM_STATE_NESTED_FORMAT_VMX)
^
arch/x86/kvm/vmx/nested.c:6168:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.vmxon_pa == -1ull) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6168:2: note: Taking false branch
if (kvm_state->hdr.vmx.vmxon_pa == -1ull) {
^
arch/x86/kvm/vmx/nested.c:6187:7: note: Assuming the condition is false
if (!nested_vmx_allowed(vcpu))
^~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6187:3: note: Taking false branch
if (!nested_vmx_allowed(vcpu))
^
arch/x86/kvm/vmx/nested.c:6190:3: note: Taking false branch
if (!page_address_valid(vcpu, kvm_state->hdr.vmx.vmxon_pa))
^
arch/x86/kvm/vmx/nested.c:6194:7: note: Assuming the condition is false
if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6194:71: note: Left side of '&&' is false
if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
^
arch/x86/kvm/vmx/nested.c:6198:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.smm.flags &
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6198:2: note: Taking false branch
if (kvm_state->hdr.vmx.smm.flags &
^
arch/x86/kvm/vmx/nested.c:6202:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.flags & ~KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6202:2: note: Taking false branch
if (kvm_state->hdr.vmx.flags & ~KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE)
^
arch/x86/kvm/vmx/nested.c:6210:6: note: Assuming the condition is true
if (is_smm(vcpu) ?
^~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6210:6: note: '?' condition is true
arch/x86/kvm/vmx/nested.c:6210:6: note: Assuming the condition is false
if (is_smm(vcpu) ?
^~~~~~
arch/x86/kvm/vmx/nested.c:6210:2: note: Taking false branch
if (is_smm(vcpu) ?
^
arch/x86/kvm/vmx/nested.c:6216:71: note: Left side of '&&' is false
if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
^
arch/x86/kvm/vmx/nested.c:6220:7: note: Assuming the condition is false
if ((kvm_state->flags & KVM_STATE_NESTED_EVMCS) &&
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6220:50: note: Left side of '&&' is false
if ((kvm_state->flags & KVM_STATE_NESTED_EVMCS) &&
^
arch/x86/kvm/vmx/nested.c:6226:2: note: Taking false branch
if (kvm_state->hdr.vmx.vmxon_pa == -1ull)
^
arch/x86/kvm/vmx/nested.c:6231:6: note: 'ret' is 0
if (ret)
^~~
arch/x86/kvm/vmx/nested.c:6231:2: note: Taking false branch
if (ret)
^
arch/x86/kvm/vmx/nested.c:6235:6: note: Assuming the condition is false
if (kvm_state->size < sizeof(*kvm_state) + sizeof(*vmcs12)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6235:2: note: Taking false branch
if (kvm_state->size < sizeof(*kvm_state) + sizeof(*vmcs12)) {
^
arch/x86/kvm/vmx/nested.c:6245:6: note: Assuming the condition is true
if (kvm_state->hdr.vmx.vmcs12_pa != -1ull) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6245:2: note: Taking true branch
if (kvm_state->hdr.vmx.vmcs12_pa != -1ull) {
^
arch/x86/kvm/vmx/nested.c:6246:7: note: Assuming field 'vmcs12_pa' is not equal to field 'vmxon_pa'
if (kvm_state->hdr.vmx.vmcs12_pa == kvm_state->hdr.vmx.vmxon_pa ||
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6246:7: note: Left side of '||' is false
arch/x86/kvm/vmx/nested.c:6246:3: note: Taking false branch
if (kvm_state->hdr.vmx.vmcs12_pa == kvm_state->hdr.vmx.vmxon_pa ||
^
arch/x86/kvm/vmx/nested.c:6263:6: note: Assuming the condition is false
if (kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_VMXON) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6263:2: note: Taking false branch
if (kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_VMXON) {
^
arch/x86/kvm/vmx/nested.c:6272:6: note: Assuming the condition is false
if (copy_from_user(vmcs12, user_vmx_nested_state->vmcs12, sizeof(*vmcs12)))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/x86/kvm/vmx/nested.c:6272:2: note: Taking false branch
if (copy_from_user(vmcs12, user_vmx_nested_state->vmcs12, sizeof(*vmcs12)))
^
vim +3362 arch/x86/kvm/vmx/nested.c
55d2375e58a61b Sean Christopherson 2018-12-03 3273
55d2375e58a61b Sean Christopherson 2018-12-03 3274 static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,
55d2375e58a61b Sean Christopherson 2018-12-03 3275 struct vmcs12 *vmcs12);
55d2375e58a61b Sean Christopherson 2018-12-03 3276
55d2375e58a61b Sean Christopherson 2018-12-03 3277 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3278 * If from_vmentry is false, this is being called from state restore (either RSM
55d2375e58a61b Sean Christopherson 2018-12-03 3279 * or KVM_SET_NESTED_STATE). Otherwise it's called from vmlaunch/vmresume.
671ddc700fd08b Jim Mattson 2019-10-15 3280 *
671ddc700fd08b Jim Mattson 2019-10-15 3281 * Returns:
463bfeeead9741 Miaohe Lin 2020-02-14 3282 * NVMX_VMENTRY_SUCCESS: Entered VMX non-root mode
463bfeeead9741 Miaohe Lin 2020-02-14 3283 * NVMX_VMENTRY_VMFAIL: Consistency check VMFail
463bfeeead9741 Miaohe Lin 2020-02-14 3284 * NVMX_VMENTRY_VMEXIT: Consistency check VMExit
463bfeeead9741 Miaohe Lin 2020-02-14 3285 * NVMX_VMENTRY_KVM_INTERNAL_ERROR: KVM internal error
55d2375e58a61b Sean Christopherson 2018-12-03 3286 */
671ddc700fd08b Jim Mattson 2019-10-15 3287 enum nvmx_vmentry_status nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu,
671ddc700fd08b Jim Mattson 2019-10-15 3288 bool from_vmentry)
55d2375e58a61b Sean Christopherson 2018-12-03 3289 {
55d2375e58a61b Sean Christopherson 2018-12-03 3290 struct vcpu_vmx *vmx = to_vmx(vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3291 struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
68cda40d9f3c4c Sean Christopherson 2020-05-11 3292 enum vm_entry_failure_code entry_failure_code;
55d2375e58a61b Sean Christopherson 2018-12-03 3293 bool evaluate_pending_interrupts;
8e53324021645f Sean Christopherson 2020-11-06 3294 union vmx_exit_reason exit_reason = {
8e53324021645f Sean Christopherson 2020-11-06 3295 .basic = EXIT_REASON_INVALID_STATE,
8e53324021645f Sean Christopherson 2020-11-06 3296 .failed_vmentry = 1,
8e53324021645f Sean Christopherson 2020-11-06 3297 };
8e53324021645f Sean Christopherson 2020-11-06 3298 u32 failed_index;
55d2375e58a61b Sean Christopherson 2018-12-03 3299
eeeb4f67a6cd43 Sean Christopherson 2020-03-20 3300 if (kvm_check_request(KVM_REQ_TLB_FLUSH_CURRENT, vcpu))
eeeb4f67a6cd43 Sean Christopherson 2020-03-20 3301 kvm_vcpu_flush_tlb_current(vcpu);
eeeb4f67a6cd43 Sean Christopherson 2020-03-20 3302
2183f5645ae7e0 Sean Christopherson 2019-05-07 3303 evaluate_pending_interrupts = exec_controls_get(vmx) &
4e2a0bc56ad197 Xiaoyao Li 2019-12-06 3304 (CPU_BASED_INTR_WINDOW_EXITING | CPU_BASED_NMI_WINDOW_EXITING);
55d2375e58a61b Sean Christopherson 2018-12-03 3305 if (likely(!evaluate_pending_interrupts) && kvm_vcpu_apicv_active(vcpu))
55d2375e58a61b Sean Christopherson 2018-12-03 3306 evaluate_pending_interrupts |= vmx_has_apicv_interrupt(vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3307
55d2375e58a61b Sean Christopherson 2018-12-03 3308 if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
55d2375e58a61b Sean Christopherson 2018-12-03 3309 vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
55d2375e58a61b Sean Christopherson 2018-12-03 3310 if (kvm_mpx_supported() &&
55d2375e58a61b Sean Christopherson 2018-12-03 3311 !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))
55d2375e58a61b Sean Christopherson 2018-12-03 3312 vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS);
55d2375e58a61b Sean Christopherson 2018-12-03 3313
f087a02941feac Sean Christopherson 2019-06-07 3314 /*
f087a02941feac Sean Christopherson 2019-06-07 3315 * Overwrite vmcs01.GUEST_CR3 with L1's CR3 if EPT is disabled *and*
f087a02941feac Sean Christopherson 2019-06-07 3316 * nested early checks are disabled. In the event of a "late" VM-Fail,
f087a02941feac Sean Christopherson 2019-06-07 3317 * i.e. a VM-Fail detected by hardware but not KVM, KVM must unwind its
f087a02941feac Sean Christopherson 2019-06-07 3318 * software model to the pre-VMEntry host state. When EPT is disabled,
f087a02941feac Sean Christopherson 2019-06-07 3319 * GUEST_CR3 holds KVM's shadow CR3, not L1's "real" CR3, which causes
f087a02941feac Sean Christopherson 2019-06-07 3320 * nested_vmx_restore_host_state() to corrupt vcpu->arch.cr3. Stuffing
f087a02941feac Sean Christopherson 2019-06-07 3321 * vmcs01.GUEST_CR3 results in the unwind naturally setting arch.cr3 to
f087a02941feac Sean Christopherson 2019-06-07 3322 * the correct value. Smashing vmcs01.GUEST_CR3 is safe because nested
f087a02941feac Sean Christopherson 2019-06-07 3323 * VM-Exits, and the unwind, reset KVM's MMU, i.e. vmcs01.GUEST_CR3 is
f087a02941feac Sean Christopherson 2019-06-07 3324 * guaranteed to be overwritten with a shadow CR3 prior to re-entering
f087a02941feac Sean Christopherson 2019-06-07 3325 * L1. Don't stuff vmcs01.GUEST_CR3 when using nested early checks as
f087a02941feac Sean Christopherson 2019-06-07 3326 * KVM modifies vcpu->arch.cr3 if and only if the early hardware checks
f087a02941feac Sean Christopherson 2019-06-07 3327 * pass, and early VM-Fails do not reset KVM's MMU, i.e. the VM-Fail
f087a02941feac Sean Christopherson 2019-06-07 3328 * path would need to manually save/restore vmcs01.GUEST_CR3.
f087a02941feac Sean Christopherson 2019-06-07 3329 */
f087a02941feac Sean Christopherson 2019-06-07 3330 if (!enable_ept && !nested_early_check)
f087a02941feac Sean Christopherson 2019-06-07 3331 vmcs_writel(GUEST_CR3, vcpu->arch.cr3);
f087a02941feac Sean Christopherson 2019-06-07 3332
55d2375e58a61b Sean Christopherson 2018-12-03 3333 vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02);
55d2375e58a61b Sean Christopherson 2018-12-03 3334
55d2375e58a61b Sean Christopherson 2018-12-03 3335 prepare_vmcs02_early(vmx, vmcs12);
55d2375e58a61b Sean Christopherson 2018-12-03 3336
55d2375e58a61b Sean Christopherson 2018-12-03 3337 if (from_vmentry) {
b89d5ad00e7899 Sean Christopherson 2020-09-23 3338 if (unlikely(!nested_get_vmcs12_pages(vcpu))) {
b89d5ad00e7899 Sean Christopherson 2020-09-23 3339 vmx_switch_vmcs(vcpu, &vmx->vmcs01);
671ddc700fd08b Jim Mattson 2019-10-15 3340 return NVMX_VMENTRY_KVM_INTERNAL_ERROR;
b89d5ad00e7899 Sean Christopherson 2020-09-23 3341 }
55d2375e58a61b Sean Christopherson 2018-12-03 3342
55d2375e58a61b Sean Christopherson 2018-12-03 3343 if (nested_vmx_check_vmentry_hw(vcpu)) {
55d2375e58a61b Sean Christopherson 2018-12-03 3344 vmx_switch_vmcs(vcpu, &vmx->vmcs01);
671ddc700fd08b Jim Mattson 2019-10-15 3345 return NVMX_VMENTRY_VMFAIL;
55d2375e58a61b Sean Christopherson 2018-12-03 3346 }
55d2375e58a61b Sean Christopherson 2018-12-03 3347
68cda40d9f3c4c Sean Christopherson 2020-05-11 3348 if (nested_vmx_check_guest_state(vcpu, vmcs12,
68cda40d9f3c4c Sean Christopherson 2020-05-11 3349 &entry_failure_code)) {
8e53324021645f Sean Christopherson 2020-11-06 3350 exit_reason.basic = EXIT_REASON_INVALID_STATE;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3351 vmcs12->exit_qualification = entry_failure_code;
55d2375e58a61b Sean Christopherson 2018-12-03 3352 goto vmentry_fail_vmexit;
55d2375e58a61b Sean Christopherson 2018-12-03 3353 }
68cda40d9f3c4c Sean Christopherson 2020-05-11 3354 }
55d2375e58a61b Sean Christopherson 2018-12-03 3355
55d2375e58a61b Sean Christopherson 2018-12-03 3356 enter_guest_mode(vcpu);
5e3d394fdd9e6b Xiaoyao Li 2019-12-06 3357 if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETTING)
55d2375e58a61b Sean Christopherson 2018-12-03 3358 vcpu->arch.tsc_offset += vmcs12->tsc_offset;
55d2375e58a61b Sean Christopherson 2018-12-03 3359
68cda40d9f3c4c Sean Christopherson 2020-05-11 3360 if (prepare_vmcs02(vcpu, vmcs12, &entry_failure_code)) {
8e53324021645f Sean Christopherson 2020-11-06 3361 exit_reason.basic = EXIT_REASON_INVALID_STATE;
68cda40d9f3c4c Sean Christopherson 2020-05-11 @3362 vmcs12->exit_qualification = entry_failure_code;
55d2375e58a61b Sean Christopherson 2018-12-03 3363 goto vmentry_fail_vmexit_guest_mode;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3364 }
55d2375e58a61b Sean Christopherson 2018-12-03 3365
55d2375e58a61b Sean Christopherson 2018-12-03 3366 if (from_vmentry) {
68cda40d9f3c4c Sean Christopherson 2020-05-11 3367 failed_index = nested_vmx_load_msr(vcpu,
55d2375e58a61b Sean Christopherson 2018-12-03 3368 vmcs12->vm_entry_msr_load_addr,
55d2375e58a61b Sean Christopherson 2018-12-03 3369 vmcs12->vm_entry_msr_load_count);
68cda40d9f3c4c Sean Christopherson 2020-05-11 3370 if (failed_index) {
8e53324021645f Sean Christopherson 2020-11-06 3371 exit_reason.basic = EXIT_REASON_MSR_LOAD_FAIL;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3372 vmcs12->exit_qualification = failed_index;
55d2375e58a61b Sean Christopherson 2018-12-03 3373 goto vmentry_fail_vmexit_guest_mode;
68cda40d9f3c4c Sean Christopherson 2020-05-11 3374 }
55d2375e58a61b Sean Christopherson 2018-12-03 3375 } else {
55d2375e58a61b Sean Christopherson 2018-12-03 3376 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3377 * The MMU is not initialized to point at the right entities yet and
55d2375e58a61b Sean Christopherson 2018-12-03 3378 * "get pages" would need to read data from the guest (i.e. we will
55d2375e58a61b Sean Christopherson 2018-12-03 3379 * need to perform gpa to hpa translation). Request a call
55d2375e58a61b Sean Christopherson 2018-12-03 3380 * to nested_get_vmcs12_pages before the next VM-entry. The MSRs
55d2375e58a61b Sean Christopherson 2018-12-03 3381 * have already been set at vmentry time and should not be reset.
55d2375e58a61b Sean Christopherson 2018-12-03 3382 */
729c15c20f1a7c Paolo Bonzini 2020-09-22 3383 kvm_make_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3384 }
55d2375e58a61b Sean Christopherson 2018-12-03 3385
55d2375e58a61b Sean Christopherson 2018-12-03 3386 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3387 * If L1 had a pending IRQ/NMI until it executed
55d2375e58a61b Sean Christopherson 2018-12-03 3388 * VMLAUNCH/VMRESUME which wasn't delivered because it was
55d2375e58a61b Sean Christopherson 2018-12-03 3389 * disallowed (e.g. interrupts disabled), L0 needs to
55d2375e58a61b Sean Christopherson 2018-12-03 3390 * evaluate if this pending event should cause an exit from L2
55d2375e58a61b Sean Christopherson 2018-12-03 3391 * to L1 or delivered directly to L2 (e.g. In case L1 don't
55d2375e58a61b Sean Christopherson 2018-12-03 3392 * intercept EXTERNAL_INTERRUPT).
55d2375e58a61b Sean Christopherson 2018-12-03 3393 *
55d2375e58a61b Sean Christopherson 2018-12-03 3394 * Usually this would be handled by the processor noticing an
55d2375e58a61b Sean Christopherson 2018-12-03 3395 * IRQ/NMI window request, or checking RVI during evaluation of
55d2375e58a61b Sean Christopherson 2018-12-03 3396 * pending virtual interrupts. However, this setting was done
55d2375e58a61b Sean Christopherson 2018-12-03 3397 * on VMCS01 and now VMCS02 is active instead. Thus, we force L0
55d2375e58a61b Sean Christopherson 2018-12-03 3398 * to perform pending event evaluation by requesting a KVM_REQ_EVENT.
55d2375e58a61b Sean Christopherson 2018-12-03 3399 */
55d2375e58a61b Sean Christopherson 2018-12-03 3400 if (unlikely(evaluate_pending_interrupts))
55d2375e58a61b Sean Christopherson 2018-12-03 3401 kvm_make_request(KVM_REQ_EVENT, vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3402
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3403 /*
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3404 * Do not start the preemption timer hrtimer until after we know
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3405 * we are successful, so that only nested_vmx_vmexit needs to cancel
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3406 * the timer.
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3407 */
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3408 vmx->nested.preemption_timer_expired = false;
850448f35aaf45 Peter Shier 2020-05-26 3409 if (nested_cpu_has_preemption_timer(vmcs12)) {
850448f35aaf45 Peter Shier 2020-05-26 3410 u64 timer_value = vmx_calc_preemption_timer_value(vcpu);
850448f35aaf45 Peter Shier 2020-05-26 3411 vmx_start_preemption_timer(vcpu, timer_value);
850448f35aaf45 Peter Shier 2020-05-26 3412 }
359a6c3ddc5184 Paolo Bonzini 2019-01-29 3413
55d2375e58a61b Sean Christopherson 2018-12-03 3414 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3415 * Note no nested_vmx_succeed or nested_vmx_fail here. At this point
55d2375e58a61b Sean Christopherson 2018-12-03 3416 * we are no longer running L1, and VMLAUNCH/VMRESUME has not yet
55d2375e58a61b Sean Christopherson 2018-12-03 3417 * returned as far as L1 is concerned. It will only return (and set
55d2375e58a61b Sean Christopherson 2018-12-03 3418 * the success flag) when L2 exits (see nested_vmx_vmexit()).
55d2375e58a61b Sean Christopherson 2018-12-03 3419 */
671ddc700fd08b Jim Mattson 2019-10-15 3420 return NVMX_VMENTRY_SUCCESS;
55d2375e58a61b Sean Christopherson 2018-12-03 3421
55d2375e58a61b Sean Christopherson 2018-12-03 3422 /*
55d2375e58a61b Sean Christopherson 2018-12-03 3423 * A failed consistency check that leads to a VMExit during L1's
55d2375e58a61b Sean Christopherson 2018-12-03 3424 * VMEnter to L2 is a variation of a normal VMexit, as explained in
55d2375e58a61b Sean Christopherson 2018-12-03 3425 * 26.7 "VM-entry failures during or after loading guest state".
55d2375e58a61b Sean Christopherson 2018-12-03 3426 */
55d2375e58a61b Sean Christopherson 2018-12-03 3427 vmentry_fail_vmexit_guest_mode:
5e3d394fdd9e6b Xiaoyao Li 2019-12-06 3428 if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETTING)
55d2375e58a61b Sean Christopherson 2018-12-03 3429 vcpu->arch.tsc_offset -= vmcs12->tsc_offset;
55d2375e58a61b Sean Christopherson 2018-12-03 3430 leave_guest_mode(vcpu);
55d2375e58a61b Sean Christopherson 2018-12-03 3431
55d2375e58a61b Sean Christopherson 2018-12-03 3432 vmentry_fail_vmexit:
55d2375e58a61b Sean Christopherson 2018-12-03 3433 vmx_switch_vmcs(vcpu, &vmx->vmcs01);
55d2375e58a61b Sean Christopherson 2018-12-03 3434
55d2375e58a61b Sean Christopherson 2018-12-03 3435 if (!from_vmentry)
671ddc700fd08b Jim Mattson 2019-10-15 3436 return NVMX_VMENTRY_VMEXIT;
55d2375e58a61b Sean Christopherson 2018-12-03 3437
55d2375e58a61b Sean Christopherson 2018-12-03 3438 load_vmcs12_host_state(vcpu, vmcs12);
8e53324021645f Sean Christopherson 2020-11-06 3439 vmcs12->vm_exit_reason = exit_reason.full;
55d2375e58a61b Sean Christopherson 2018-12-03 3440 if (enable_shadow_vmcs || vmx->nested.hv_evmcs)
3731905ef28fc1 Sean Christopherson 2019-05-07 3441 vmx->nested.need_vmcs12_to_shadow_sync = true;
671ddc700fd08b Jim Mattson 2019-10-15 3442 return NVMX_VMENTRY_VMEXIT;
55d2375e58a61b Sean Christopherson 2018-12-03 3443 }
55d2375e58a61b Sean Christopherson 2018-12-03 3444
:::::: The code at line 3362 was first introduced by commit
:::::: 68cda40d9f3c4cb880108eb22f974d9e3d5dc6c5 KVM: nVMX: Tweak handling of failure code for nested VM-Enter failure
:::::: TO: Sean Christopherson <sean.j.christopherson@intel.com>
:::::: CC: Paolo Bonzini <pbonzini@redhat.com>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 28061 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-08-09 11:03 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-08 22:59 arch/x86/kvm/vmx/nested.c:3362:30: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign] kernel test robot
2021-08-09 11:03 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.