From patchwork Thu Jun 1 22:13:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 9761301 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3134760360 for ; Thu, 1 Jun 2017 22:13:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2847D28418 for ; Thu, 1 Jun 2017 22:13:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1C88D284DC; Thu, 1 Jun 2017 22:13:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AA63C28418 for ; Thu, 1 Jun 2017 22:13:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751128AbdFAWNw (ORCPT ); Thu, 1 Jun 2017 18:13:52 -0400 Received: from mail-pf0-f181.google.com ([209.85.192.181]:36230 "EHLO mail-pf0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751078AbdFAWNv (ORCPT ); Thu, 1 Jun 2017 18:13:51 -0400 Received: by mail-pf0-f181.google.com with SMTP id m17so38779891pfg.3 for ; Thu, 01 Jun 2017 15:13:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=N2k9D49CeyTo/VBUa9HA2/QXne9hmg+025DibhagQRY=; b=GYgKi4iNhHv3NwxnPY69vOrQlzmDg08pfcMfqWj7LIHHePNHHq2n0adEnaD9WbRwVO 6D3ueXwqravMXmgWD99j9KoIuKiNz8lpWq6annr8PQFaenqnaGpTd4/epMf1r9YQEPRN 2j+j8l4Q3ETjS7PtW/6o8zAAbNEIXZ2I+x/Bh3oxkfBMPf8T8oGGBXjjE4gU52utXxCc DvgRZ7w85wAlOqpw2pm5yW3ty/6Ke9J8d0CWFn43LTUwxNHIBAkUZCnV2SGpNgjEoPx9 k6gkYsiAdDuw+dt718iFCJxP08GEaEmpc0UtbqECoZRHZ95mlyziv7EQP2pREeYPIrwQ YwQg== 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; bh=N2k9D49CeyTo/VBUa9HA2/QXne9hmg+025DibhagQRY=; b=gY/hQx4zAiD8jDpnOBVADRnm1r5sVMcewE6D4a94JhaXkhbuJX+BV0rIl6DSK4nfBn wVkrpyDwnHXi7PYgtENdyVvrUZSzpFFS3zvoyZnFfvwKIh5TRpC8ofzGEc8dJOh7jJNq hER2ZY52DQ5cai6LQ+Z1qtf8TUoucQrcHkp7+LEvWavFeEcklINbLbveUBtifKJK2ch8 8EE84MsDJ1lM/GYa9hF+nfN6wByH0GSdyZULYf4UvX7rpIvkOprz6nc5ixh/FNuC1s6j AB6JBzjbXvDP6dvJbNnFjLakoa+ve37C52GdvbNS9V9ssZjE/CZ5jRKfLX14GRsTZm9j RcvA== X-Gm-Message-State: AODbwcCMoIyI7BwbEo7B65VP+Ae/KayNK9B50ySj5+ru/NgW8RZ7Onho mg+O/R/suYOllzJHnlnAPw== X-Received: by 10.98.72.129 with SMTP id q1mr3254194pfi.161.1496355229985; Thu, 01 Jun 2017 15:13:49 -0700 (PDT) Received: from turtle.sea.corp.google.com ([172.31.88.24]) by smtp.gmail.com with ESMTPSA id p13sm41005420pfl.52.2017.06.01.15.13.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Jun 2017 15:13:49 -0700 (PDT) From: Jim Mattson To: kvm@vger.kernel.org, nyh@il.ibm.com Cc: Jim Mattson Subject: [PATCH 1/4] KVM: nVMX: Sequester all vmcs12 guest-state updates Date: Thu, 1 Jun 2017 15:13:03 -0700 Message-Id: <20170601221306.86372-2-jmattson@google.com> X-Mailer: git-send-email 2.13.0.219.gdb65acc882-goog In-Reply-To: <20170601221306.86372-1-jmattson@google.com> References: <20170601221306.86372-1-jmattson@google.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Rename sync_vmcs12 to save_vmcs12_guest_state and hoist out any code that doesn't just update guest-state fields in vmcs12. Guest-state fields are not updated on failed VM-entry, so move the call site into the appropriate conditional block. Fixes: 4704d0befb072 ("KVM: nVMX: Exiting from L2 to L1") Signed-off-by: Jim Mattson --- arch/x86/kvm/vmx.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index ae66ebc7fb82..a01dd8bd712c 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -10627,11 +10627,10 @@ static u32 vmx_get_preemption_timer_value(struct kvm_vcpu *vcpu) /* * Update the guest state fields of vmcs12 to reflect changes that - * occurred while L2 was running. (The "IA-32e mode guest" bit of the - * VM-entry controls is also updated, since this is really a guest - * state bit.) + * occurred while L2 was running. */ -static void sync_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) +static void save_vmcs12_guest_state(struct kvm_vcpu *vcpu, + struct vmcs12 *vmcs12) { vmcs12->guest_cr0 = vmcs12_guest_cr0(vcpu, vmcs12); vmcs12->guest_cr4 = vmcs12_guest_cr4(vcpu, vmcs12); @@ -10686,13 +10685,9 @@ static void sync_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) else vmcs12->guest_activity_state = GUEST_ACTIVITY_ACTIVE; - if (nested_cpu_has_preemption_timer(vmcs12)) { - if (vmcs12->vm_exit_controls & - VM_EXIT_SAVE_VMX_PREEMPTION_TIMER) - vmcs12->vmx_preemption_timer_value = - vmx_get_preemption_timer_value(vcpu); - hrtimer_cancel(&to_vmx(vcpu)->nested.preemption_timer); - } + if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_VMX_PREEMPTION_TIMER) + vmcs12->vmx_preemption_timer_value = + vmx_get_preemption_timer_value(vcpu); /* * In some cases (usually, nested EPT), L2 is allowed to change its @@ -10710,15 +10705,9 @@ static void sync_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) vmcs12->guest_pdptr3 = vmcs_read64(GUEST_PDPTR3); } - vmcs12->guest_linear_address = vmcs_readl(GUEST_LINEAR_ADDRESS); - if (nested_cpu_has_vid(vmcs12)) vmcs12->guest_intr_status = vmcs_read16(GUEST_INTR_STATUS); - vmcs12->vm_entry_controls = - (vmcs12->vm_entry_controls & ~VM_ENTRY_IA32E_MODE) | - (vm_entry_controls_get(to_vmx(vcpu)) & VM_ENTRY_IA32E_MODE); - if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_DEBUG_CONTROLS) { kvm_get_dr(vcpu, 7, (unsigned long *)&vmcs12->guest_dr7); vmcs12->guest_ia32_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL); @@ -10752,9 +10741,6 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, u32 exit_reason, u32 exit_intr_info, unsigned long exit_qualification) { - /* update guest state fields: */ - sync_vmcs12(vcpu, vmcs12); - /* update exit information fields: */ vmcs12->vm_exit_reason = exit_reason; @@ -10770,7 +10756,14 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, vmcs12->vm_exit_instruction_len = vmcs_read32(VM_EXIT_INSTRUCTION_LEN); vmcs12->vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); + vmcs12->guest_linear_address = vmcs_readl(GUEST_LINEAR_ADDRESS); + + vmcs12->vm_entry_controls = + (vmcs12->vm_entry_controls & ~VM_ENTRY_IA32E_MODE) | + (vm_entry_controls_get(to_vmx(vcpu)) & VM_ENTRY_IA32E_MODE); + if (!(vmcs12->vm_exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) { + save_vmcs12_guest_state(vcpu, vmcs12); /* vm_entry_intr_info_field is cleared on exit. Emulate this * instead of reading the real value. */ vmcs12->vm_entry_intr_info_field &= ~INTR_INFO_VALID_MASK; @@ -10944,6 +10937,9 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, /* trying to cancel vmlaunch/vmresume is a bug */ WARN_ON_ONCE(vmx->nested.nested_run_pending); + if (nested_cpu_has_preemption_timer(vmcs12)) + hrtimer_cancel(&to_vmx(vcpu)->nested.preemption_timer); + leave_guest_mode(vcpu); prepare_vmcs12(vcpu, vmcs12, exit_reason, exit_intr_info, exit_qualification);