Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp1894296ybn; Thu, 26 Sep 2019 03:56:58 -0700 (PDT) X-Google-Smtp-Source: APXvYqy76R94HhrzU8y+K4fxajdFuC0QK/+OrmCy89kVu3zZObjAZ+HW8IE/0OQBG8Xw78OaPjaI X-Received: by 2002:a17:907:214e:: with SMTP id rk14mr2516819ejb.60.1569495418421; Thu, 26 Sep 2019 03:56:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569495418; cv=none; d=google.com; s=arc-20160816; b=LbEr1cGBM1ErC3LggmdHWaHf+udxXLCWMAPuuoxCr40Hit66AnZ4k8nIDcoMt3Sssy TO6Oh8z+2lTZB9d8wttJ7VTKCeSEjRxCZBpZBYzNRfbHwe193YXywmQp8cqD/NKd15zN MXzT9xxSkgaUxK0KkUys6ZhCzSOwuOpW7UzGQvulXkP1qzw/dE1voedtb7VK0alazLJh ulHxjNDhBCpZoFG8dEIptGtobRLbmNL0Zy/eKU6ZZXBRM9o2daXezjXiZ5TIfXTceIfz K9Wn7larKjWYx2FPGnYHU0UM2IcWSLdSs0tEDg/Kg1BunezhfyYyyB0O+vaG9mz/4/RX W68w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=98pgIm93kXtpiVnPdQGl6qYx3mDeiyiIIkaZo8B0nYw=; b=ZvvcWW1SVUgaS6OR5aimffrT92cS7mQdppYQoZQHz+06z64G3RI8sJp/3U92gnOOtY JcsCuOsUwIsqJ7fGy2bq66AbVZysPw3w3m6I8xyLVMgHFHYUxM0sgNwyh84+zt6vjDsq ZoAavARCl9CuYLHDmhV5B4EbKeMRrVSTRcktDLv3xIjLxQzNVQDFwdP7S7XZrszqnAhY Xck5jlwv2Hx6GaSPCR9bby4s+B8NiDbhAaWYrCsb148I4bDRpjcVQyu5/kH416Na109k MyfDjOtpOjI5cBzugL/NevrooN+60I1aLLylc+UNmoRZBrrr3MgQrnAAHNVOvzHHBlL9 9zdA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="WvgZ/tV+"; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h19si800605ejd.142.2019.09.26.03.56.27; Thu, 26 Sep 2019 03:56:58 -0700 (PDT) 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=@google.com header.s=20161025 header.b="WvgZ/tV+"; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2392068AbfIYQrS (ORCPT + 99 others); Wed, 25 Sep 2019 12:47:18 -0400 Received: from mail-io1-f67.google.com ([209.85.166.67]:43828 "EHLO mail-io1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2392039AbfIYQrR (ORCPT ); Wed, 25 Sep 2019 12:47:17 -0400 Received: by mail-io1-f67.google.com with SMTP id v2so430427iob.10 for ; Wed, 25 Sep 2019 09:47:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=98pgIm93kXtpiVnPdQGl6qYx3mDeiyiIIkaZo8B0nYw=; b=WvgZ/tV+qz4PYThIjrZ62TklAy0Nk05OkM+Vs8mBky+mCDHKn5Q/ZucHDd4zO+3dIZ eBUQoXg37LJOhxhC4UjoxsVO6yQffKbKEyk3BnEILbf13f/ogVpcNTTw7f6pNGRSMlEy 1wEaLrRPMEjkGgblfRCKEzlpYD0Y/yCcrb8au+B1hdjjcX6Ze7Bi0kbkXI7nbwEYyqYc K63QGHh+/ko2XSFNZl8hmUxgaHkPdh0zAkGs5u2xO+r6JoceDJFy4zLPu5yStHVZcByj ISD23aAxzowf3CpOvB2pXbDJ4ZrJD6zsVkrI7V4yjuwpzgTv5LeveW2S9XGiX85/iw8u OutQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=98pgIm93kXtpiVnPdQGl6qYx3mDeiyiIIkaZo8B0nYw=; b=Ef6dY2qvTtAA4FUrLlSHPMhh7z4Ier0Di9hszJN7u/VBudg327s+rPuXMVE2kiCh7i yIHYgznCI5iVFV1T7Pd3Fyl08S43JiIRFvs8GwJw2aVMUE9giNzVGYQsrmkdvSloREup ieeot+xZGCtEb+Z43tnYQJtFC/XcDGEICLNRa9hTUyBdd7bCDyyP9lY1WYU96tTW1F9A lkFJCXNeBRwVbSG0kkjHpm/wga9PE94GkKaQnjbgB/wSzvyMbAQYNRLIpLJi3aqCklr9 T/vc1R2UVj+pOnxJfVrktRuJR6XURmy2IaboVkQMIhIN1IUppx1uL1e8W3LWSItXH2aA O8eg== X-Gm-Message-State: APjAAAXKuYQbjPscUwfZskqrUoooql1dKcOhv4pXG+h4TYOoULTytPYa WSMjoFVi9XRFZ9NCQSosqW6W4KgMg7yga5vQ/MBqdHZhcf957w== X-Received: by 2002:a6b:6a01:: with SMTP id x1mr273843iog.119.1569430036059; Wed, 25 Sep 2019 09:47:16 -0700 (PDT) MIME-Version: 1.0 References: <1569429286-35157-1-git-send-email-pbonzini@redhat.com> In-Reply-To: <1569429286-35157-1-git-send-email-pbonzini@redhat.com> From: Jim Mattson Date: Wed, 25 Sep 2019 09:47:05 -0700 Message-ID: Subject: Re: [PATCH] KVM: nVMX: cleanup and fix host 64-bit mode checks To: Paolo Bonzini Cc: LKML , kvm list , Sean Christopherson , Krish Sadhukhan Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Sep 25, 2019 at 9:34 AM Paolo Bonzini wrote: > > KVM was incorrectly checking vmcs12->host_ia32_efer even if the "load > IA32_EFER" exit control was reset. Also, some checks were not using > the new CC macro for tracing. > > Cleanup everything so that the vCPU's 64-bit mode is determined > directly from EFER_LMA and the VMCS checks are based on that, which > matches section 26.2.4 of the SDM. > > Cc: Sean Christopherson > Cc: Jim Mattson > Cc: Krish Sadhukhan > Fixes: 5845038c111db27902bc220a4f70070fe945871c > Signed-off-by: Paolo Bonzini > --- > arch/x86/kvm/vmx/nested.c | 53 ++++++++++++++++++++--------------------------- > 1 file changed, 22 insertions(+), 31 deletions(-) > > diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c > index 70d59d9304f2..e108847f6cf8 100644 > --- a/arch/x86/kvm/vmx/nested.c > +++ b/arch/x86/kvm/vmx/nested.c > @@ -2664,8 +2664,26 @@ static int nested_vmx_check_host_state(struct kvm_vcpu *vcpu, > CC(!kvm_pat_valid(vmcs12->host_ia32_pat))) > return -EINVAL; > > - ia32e = (vmcs12->vm_exit_controls & > - VM_EXIT_HOST_ADDR_SPACE_SIZE) != 0; > +#ifdef CONFIG_X86_64 > + ia32e = !!(vcpu->arch.efer & EFER_LMA); > +#else > + if (CC(vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE)) > + return -EINVAL; This check is redundant, since it is checked in the else block below. > + > + ia32e = false; > +#endif > + > + if (ia32e) { > + if (CC(!(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE)) || > + CC(!(vmcs12->host_cr4 & X86_CR4_PAE))) > + return -EINVAL; > + } else { > + if (CC(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) || > + CC(vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) || > + CC(vmcs12->host_cr4 & X86_CR4_PCIDE) || > + CC(((vmcs12->host_rip) >> 32) & 0xffffffff)) The mask shouldn't be necessary. > + return -EINVAL; > + } > > if (CC(vmcs12->host_cs_selector & (SEGMENT_RPL_MASK | SEGMENT_TI_MASK)) || > CC(vmcs12->host_ss_selector & (SEGMENT_RPL_MASK | SEGMENT_TI_MASK)) || > @@ -2684,35 +2702,8 @@ static int nested_vmx_check_host_state(struct kvm_vcpu *vcpu, > CC(is_noncanonical_address(vmcs12->host_gs_base, vcpu)) || > CC(is_noncanonical_address(vmcs12->host_gdtr_base, vcpu)) || > CC(is_noncanonical_address(vmcs12->host_idtr_base, vcpu)) || > - CC(is_noncanonical_address(vmcs12->host_tr_base, vcpu))) > - return -EINVAL; > - > - if (!(vmcs12->host_ia32_efer & EFER_LMA) && > - ((vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) || > - (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE))) { > - return -EINVAL; > - } > - > - if ((vmcs12->host_ia32_efer & EFER_LMA) && > - !(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE)) { > - return -EINVAL; > - } > - > - if (!(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) && > - ((vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) || > - (vmcs12->host_cr4 & X86_CR4_PCIDE) || > - (((vmcs12->host_rip) >> 32) & 0xffffffff))) { > - return -EINVAL; > - } > - > - if ((vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) && > - ((!(vmcs12->host_cr4 & X86_CR4_PAE)) || > - (is_noncanonical_address(vmcs12->host_rip, vcpu)))) { > - return -EINVAL; > - } > -#else > - if (vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE || > - vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) > + CC(is_noncanonical_address(vmcs12->host_tr_base, vcpu)) || > + CC(is_noncanonical_address(vmcs12->host_rip, vcpu))) > return -EINVAL; > #endif > > -- > 1.8.3.1 > Reviewed-by: Jim Mattson