Received: by 10.223.164.200 with SMTP id h8csp620414wrb; Sun, 5 Nov 2017 16:56:31 -0800 (PST) X-Google-Smtp-Source: ABhQp+Rvfw6y13BxRLyyb+OFgSQUC8nuOtUU4hJQOoTvyUIhBkY1cXRmXhuvA9lI2/nncAHq1ZlW X-Received: by 10.98.249.5 with SMTP id o5mr15086443pfh.54.1509929791797; Sun, 05 Nov 2017 16:56:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1509929791; cv=none; d=google.com; s=arc-20160816; b=TwUzZ7e3W9zEMvF/Q/2dGzEnQNRTIo/bie0aW8t65KW29UrnI0xyH399LASQiI1ngW 6kyr6u1Q4Ruljrp+l26S/DbaBgj+1i5swYj4ecEqPE6LVik5Dnl3jVyKs28FUqNeRCYG gziGDBnIGS8mtiltasux9I6QMP9sB38G9NI9iAkn2kNqJt5RVy8GFeIMl4WM3FDVynEF EuZWy1W5tBCGoKuF55wsCQG+JZEdsUkiOpBwxNicpoJB6MrkBBzdhGSLd4smVA4gzj2B qIpLbN2kRZDo9AE3vzXvMLLBUVM4sG1PfaqKZf9ipPWbSE3p/h9FdNrM/wzfpoXPs9TO Z9sQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=4VxVktQdLqt/8giopodMQUADJKSV9b3fL7GEwEiHPEg=; b=cOeaZKV0WNA0kxrDy5SEVgHCk8aUWOYE9dqZ3Mz05ZXDYXgCE2RxwjnP0mHpT5qwuY dYupOuVt+WoIukkAiRecjNHquuJd4NMOPvE2IcOTi0vkeWznvC8ztqLloB+WFsbw51Sw iPvAqCxa9hypEy0mtV8X0DNSP6b2k1dxJx+YQSy270NPJ4sBDX+hR1llmICLTV8Hg9MO 2cY8kj/Zk/uoe5iQq3FzS3vrtAOwN/kChabeU18/fwiNYKVRj17ZDueijrhWG3sd6zty IxfMWaKcwThpo23gYSOurFaTF5YmfmMXwXsE31w6t50KMIMaLSLHBJqaWT6DkeO3YHvw L8ZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JCWSBYUe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i6si10466484pgt.798.2017.11.05.16.56.18; Sun, 05 Nov 2017 16:56:31 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JCWSBYUe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751527AbdKFAzX (ORCPT + 96 others); Sun, 5 Nov 2017 19:55:23 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:52927 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751058AbdKFAy7 (ORCPT ); Sun, 5 Nov 2017 19:54:59 -0500 Received: by mail-pg0-f66.google.com with SMTP id a192so6901380pge.9; Sun, 05 Nov 2017 16:54:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4VxVktQdLqt/8giopodMQUADJKSV9b3fL7GEwEiHPEg=; b=JCWSBYUeAq2rWObnEEEQHK8CZ2Nx735y6RQBHwTJyjaz94ZhK9MO4dbtRZP+jGPqn/ eusLK4GkyUbOKYF/7qWCkiFC8oHmRbVFLIr8UHhQsMr5JaD6R0GxSBZctt990t3HasEd opfn5lVpmA8CUeeHjbFgWeAsLvuSut8iV5WMEqVesjpxTp9KQD16tDWxgVN5YL/ZzguH 6O5MwUDuOr0CZcf91mpTvuJUu7Powau8+U9PJlsV+RSk9CGY0Uf9au9fM1opCQHC8SAF c9MUDmqHs4VHHHbOV0p45Z8oGiCKVCxvpVs/JHfn7AjLg0ARYE/SeK68Cfp/atJGGan5 Hsrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4VxVktQdLqt/8giopodMQUADJKSV9b3fL7GEwEiHPEg=; b=bYTcvE75yCxd1f/9ZvwhN7sYroBSTVZOPeTQ6QMRMDCDWxQU7a8Or5cjP2p3kJgudQ +BzKIixjKFqE80b5V7V019yC0/XFc6p1t9BgUWVsJJqNxA1RaX+jsXcCFD1Gmwv1yiNr kb7sh8GvVufWJfyHA6xqX1ZOlhJhVzS1VH0BxUHxZiwpN6oou1dRsD2Sq6Ud8fNFRT55 xlGDjG0piG2o36TTWyDd0EwX9ESJ1FjG7ev4BGaSzp9LQndlIGry/KKuBPzQ0VsC8S+v kYhHq31NBS+SQrBjVZ9R5ZnGVTCoZakfRi+SZXP24E/VZPsDVlKWPSoA41lkjYCrrGTP lZUQ== X-Gm-Message-State: AMCzsaU9jM4mq/R2w34XxxfMRHn5kgpy6FYcaAyzQj4o2AohpGB89hJO VdHrHmpVGyY/Fu1UaLu7Jcr7gQ== X-Received: by 10.99.63.199 with SMTP id m190mr13769380pga.275.1509929698544; Sun, 05 Nov 2017 16:54:58 -0800 (PST) Received: from localhost ([203.205.141.123]) by smtp.gmail.com with ESMTPSA id y197sm20010463pfg.103.2017.11.05.16.54.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 05 Nov 2017 16:54:58 -0800 (PST) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Wanpeng Li , Jim Mattson Subject: [PATCH v6 3/3] KVM: nVMX: Fix mmu context after VMLAUNCH/VMRESUME failure Date: Sun, 5 Nov 2017 16:54:49 -0800 Message-Id: <1509929689-2935-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1509929689-2935-1-git-send-email-wanpeng.li@hotmail.com> References: <1509929689-2935-1-git-send-email-wanpeng.li@hotmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wanpeng Li Commit 4f350c6dbcb (kvm: nVMX: Handle deferred early VMLAUNCH/VMRESUME failure properly) can result in L1(run kvm-unit-tests/run_tests.sh vmx_controls in L1) null pointer deference and also L0 calltrace when EPT=0 on both L0 and L1. In L1: BUG: unable to handle kernel paging request at ffffffffc015bf8f IP: vmx_vcpu_run+0x202/0x510 [kvm_intel] PGD 146e13067 P4D 146e13067 PUD 146e15067 PMD 3d2686067 PTE 3d4af9161 Oops: 0003 [#1] PREEMPT SMP CPU: 2 PID: 1798 Comm: qemu-system-x86 Not tainted 4.14.0-rc4+ #6 RIP: 0010:vmx_vcpu_run+0x202/0x510 [kvm_intel] Call Trace: WARNING: kernel stack frame pointer at ffffb86f4988bc18 in qemu-system-x86:1798 has bad value 0000000000000002 In L0: -----------[ cut here ]------------ WARNING: CPU: 6 PID: 4460 at /home/kernel/linux/arch/x86/kvm//vmx.c:9845 vmx_inject_page_fault_nested+0x130/0x140 [kvm_intel] CPU: 6 PID: 4460 Comm: qemu-system-x86 Tainted: G OE 4.14.0-rc7+ #25 RIP: 0010:vmx_inject_page_fault_nested+0x130/0x140 [kvm_intel] Call Trace: paging64_page_fault+0x500/0xde0 [kvm] ? paging32_gva_to_gpa_nested+0x120/0x120 [kvm] ? nonpaging_page_fault+0x3b0/0x3b0 [kvm] ? __asan_storeN+0x12/0x20 ? paging64_gva_to_gpa+0xb0/0x120 [kvm] ? paging64_walk_addr_generic+0x11a0/0x11a0 [kvm] ? lock_acquire+0x2c0/0x2c0 ? vmx_read_guest_seg_ar+0x97/0x100 [kvm_intel] ? vmx_get_segment+0x2a6/0x310 [kvm_intel] ? sched_clock+0x1f/0x30 ? check_chain_key+0x137/0x1e0 ? __lock_acquire+0x83c/0x2420 ? kvm_multiple_exception+0xf2/0x220 [kvm] ? debug_check_no_locks_freed+0x240/0x240 ? debug_smp_processor_id+0x17/0x20 ? __lock_is_held+0x9e/0x100 kvm_mmu_page_fault+0x90/0x180 [kvm] kvm_handle_page_fault+0x15c/0x310 [kvm] ? __lock_is_held+0x9e/0x100 handle_exception+0x3c7/0x4d0 [kvm_intel] vmx_handle_exit+0x103/0x1010 [kvm_intel] ? kvm_arch_vcpu_ioctl_run+0x1628/0x2e20 [kvm] The commit avoids to load host state of vmcs12 as vmcs01's guest state since vmcs12 is not modified (except for the VM-instruction error field) if the checking of vmcs control area fails. However, the mmu context is switched to nested mmu in prepare_vmcs02() and it will not be reloaded since load_vmcs12_host_state() is skipped when nested VMLAUNCH/VMRESUME fails. This patch fixes it by reloading mmu context when nested VMLAUNCH/VMRESUME fails. Reviewed-by: Jim Mattson Reviewed-by: Krish Sadhukhan Cc: Paolo Bonzini Cc: Radim Krčmář Cc: Jim Mattson Signed-off-by: Wanpeng Li --- v3 -> v4: * move it to a new function load_vmcs12_mmu_host_state arch/x86/kvm/vmx.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 6cf3972..8aefb91 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -11259,6 +11259,24 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, kvm_clear_interrupt_queue(vcpu); } +static void load_vmcs12_mmu_host_state(struct kvm_vcpu *vcpu, + struct vmcs12 *vmcs12) +{ + u32 entry_failure_code; + + nested_ept_uninit_mmu_context(vcpu); + + /* + * Only PDPTE load can fail as the value of cr3 was checked on entry and + * couldn't have changed. + */ + if (nested_vmx_load_cr3(vcpu, vmcs12->host_cr3, false, &entry_failure_code)) + nested_vmx_abort(vcpu, VMX_ABORT_LOAD_HOST_PDPTE_FAIL); + + if (!enable_ept) + vcpu->arch.walk_mmu->inject_page_fault = kvm_inject_page_fault; +} + /* * A part of what we need to when the nested L2 guest exits and we want to * run its L1 parent, is to reset L1's guest state to the host state specified @@ -11272,7 +11290,6 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) { struct kvm_segment seg; - u32 entry_failure_code; if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_EFER) vcpu->arch.efer = vmcs12->host_ia32_efer; @@ -11299,17 +11316,7 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK); vmx_set_cr4(vcpu, vmcs12->host_cr4); - nested_ept_uninit_mmu_context(vcpu); - - /* - * Only PDPTE load can fail as the value of cr3 was checked on entry and - * couldn't have changed. - */ - if (nested_vmx_load_cr3(vcpu, vmcs12->host_cr3, false, &entry_failure_code)) - nested_vmx_abort(vcpu, VMX_ABORT_LOAD_HOST_PDPTE_FAIL); - - if (!enable_ept) - vcpu->arch.walk_mmu->inject_page_fault = kvm_inject_page_fault; + load_vmcs12_mmu_host_state(vcpu, vmcs12); if (enable_vpid) { /* @@ -11539,6 +11546,9 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, * accordingly. */ nested_vmx_failValid(vcpu, VMXERR_ENTRY_INVALID_CONTROL_FIELD); + + load_vmcs12_mmu_host_state(vcpu, vmcs12); + /* * The emulated instruction was already skipped in * nested_vmx_run, but the updated RIP was never -- 2.7.4 From 1583316371817919972@xxx Mon Nov 06 11:35:58 +0000 2017 X-GM-THRID: 1583308197545497055 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread