From patchwork Thu Apr 22 02:21:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217361 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3F33C433B4 for ; Thu, 22 Apr 2021 02:21:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AB289613DC for ; Thu, 22 Apr 2021 02:21:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234340AbhDVCWN (ORCPT ); Wed, 21 Apr 2021 22:22:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45238 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234234AbhDVCWL (ORCPT ); Wed, 21 Apr 2021 22:22:11 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AD6D0C06138B for ; Wed, 21 Apr 2021 19:21:33 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id u3-20020a2509430000b02904e7f1a30cffso18210430ybm.8 for ; Wed, 21 Apr 2021 19:21:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=mOGXDXzhpmjx3GQXAE3F8jbPyKEywOEsLX4Y9QabnGA=; b=GU+uTAsFDPr0l/vq7k1GGUfFG0HY63xcX5Yc3k+1WVkUkhlV2oO5V1JwVX8bEE0aBS mQndo+u+3ZaNchbjRiiF39LSRsv0my7vXosl7viM9rYXMSXfOZQBFzSd3S1x2aSDNnRK IUv6ZDjZxwHZNRNH0rGz3IxcW/JQrdgrhrZUz0mfN47Jzwfd6t/AiR9LR+X3E+JPRVl9 h2oNFcwWD3p7tlB12ls6LLJ9kL24gUvlbuml5QTtbdoqKnhK0O1mRRWb8RB33UiQaKSu BLV7RQhh19lOJwYLvKPpQv8TtmI4DDzoXyP8uUx7OnBZu/K22M+Dyk6WMgyaFdgYtyZa XGyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=mOGXDXzhpmjx3GQXAE3F8jbPyKEywOEsLX4Y9QabnGA=; b=hRIe2hyv5SJ0mY4AB3fqVuFjDEUbF14Yq1YRrk/12/kGkt3BQCJA47ByjJc6YT5PMW slt7S5+AcVaGtpMKR+gQg4KSKqFnxzZ6m78Drk43iJzXY/PBtQEdEIdCpw8GyntHKCPz GpZwHZF2H+gVHCS7tzQ8vq/kKs2Oht/UQGaOwfjDJrfEEYYcytk4vMnbeVWRTKC/EjfD w2MjLMWelsIP77qDV14fjFNjvoPhQdkH5OX89fjEyVjoiPxXWnFTNe/Zi+TuS25+WF4X PJCDwsuND0f4SpkvB9yUUT4O4UVHaA92t7YMQxVdmbBpL9J9uBsM0ZsKg8ybIjkvLlWi fGSg== X-Gm-Message-State: AOAM531FkdkA7xGEPq7Z/McL+rA8I0hAgDhLloUB+wNfQ5PwBYYN5fEd ElAn+NUiKI9eQTlgmWPgrcSSr/Uc83U= X-Google-Smtp-Source: ABdhPJzk1VEX5RsnrgizC3w7WKpIWyjE7FzekhwM/pl5AX/kpTpBb+6bgSoManqeL0KyEcHO4He2vZribeE= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a25:e04b:: with SMTP id x72mr1418298ybg.337.1619058092969; Wed, 21 Apr 2021 19:21:32 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:20 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-2-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 1/9] KVM: x86: Remove emulator's broken checks on CR0/CR3/CR4 loads From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Remove the emulator's checks for illegal CR0, CR3, and CR4 values, as the checks are redundant, outdated, and in the case of SEV's C-bit, broken. The emulator manually calculates MAXPHYADDR from CPUID and neglects to mask off the C-bit. For all other checks, kvm_set_cr*() are a superset of the emulator checks, e.g. see CR4.LA57. Fixes: a780a3ea6282 ("KVM: X86: Fix reserved bits check for MOV to CR3") Cc: Babu Moger Signed-off-by: Sean Christopherson --- arch/x86/kvm/emulate.c | 68 +----------------------------------------- 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index f7970ba6219f..f4273b8e31fa 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -4230,75 +4230,9 @@ static int check_cr_read(struct x86_emulate_ctxt *ctxt) static int check_cr_write(struct x86_emulate_ctxt *ctxt) { - u64 new_val = ctxt->src.val64; - int cr = ctxt->modrm_reg; - u64 efer = 0; - - static u64 cr_reserved_bits[] = { - 0xffffffff00000000ULL, - 0, 0, 0, /* CR3 checked later */ - CR4_RESERVED_BITS, - 0, 0, 0, - CR8_RESERVED_BITS, - }; - - if (!valid_cr(cr)) + if (!valid_cr(ctxt->modrm_reg)) return emulate_ud(ctxt); - if (new_val & cr_reserved_bits[cr]) - return emulate_gp(ctxt, 0); - - switch (cr) { - case 0: { - u64 cr4; - if (((new_val & X86_CR0_PG) && !(new_val & X86_CR0_PE)) || - ((new_val & X86_CR0_NW) && !(new_val & X86_CR0_CD))) - return emulate_gp(ctxt, 0); - - cr4 = ctxt->ops->get_cr(ctxt, 4); - ctxt->ops->get_msr(ctxt, MSR_EFER, &efer); - - if ((new_val & X86_CR0_PG) && (efer & EFER_LME) && - !(cr4 & X86_CR4_PAE)) - return emulate_gp(ctxt, 0); - - break; - } - case 3: { - u64 rsvd = 0; - - ctxt->ops->get_msr(ctxt, MSR_EFER, &efer); - if (efer & EFER_LMA) { - u64 maxphyaddr; - u32 eax, ebx, ecx, edx; - - eax = 0x80000008; - ecx = 0; - if (ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, - &edx, true)) - maxphyaddr = eax & 0xff; - else - maxphyaddr = 36; - rsvd = rsvd_bits(maxphyaddr, 63); - if (ctxt->ops->get_cr(ctxt, 4) & X86_CR4_PCIDE) - rsvd &= ~X86_CR3_PCID_NOFLUSH; - } - - if (new_val & rsvd) - return emulate_gp(ctxt, 0); - - break; - } - case 4: { - ctxt->ops->get_msr(ctxt, MSR_EFER, &efer); - - if ((efer & EFER_LMA) && !(new_val & X86_CR4_PAE)) - return emulate_gp(ctxt, 0); - - break; - } - } - return X86EMUL_CONTINUE; } From patchwork Thu Apr 22 02:21:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217363 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 032BAC433B4 for ; Thu, 22 Apr 2021 02:21:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CD81D611C9 for ; Thu, 22 Apr 2021 02:21:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233909AbhDVCWP (ORCPT ); Wed, 21 Apr 2021 22:22:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45246 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234240AbhDVCWL (ORCPT ); Wed, 21 Apr 2021 22:22:11 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 323C6C06174A for ; Wed, 21 Apr 2021 19:21:36 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id k5-20020a2524050000b02904e716d0d7b1so18083293ybk.0 for ; Wed, 21 Apr 2021 19:21:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=Uj1R8VprO2gM5yhQ4t81phLa7RLpkl0ODVfMpjrgkqY=; b=Yy+DVFdlTw9aM63kzi9kxH+PoSHP60EBjg6elE5JzuACffosNEgEqvyAdgz5Ayrcb4 06oFMFgGTR/OsWrWTSS3Ti/McyLexYEpSsd24tHn4F8fXxCiixBc5TbMSXihtwSbSlhY jjj/VMlfS+SHmZ+pxg5GX6iFDTAx0ImDLm8ghIc8XUcCAABgU55TKkwmlesHipKwnztg bM6+kYiwC0/0DZv+3ilWx2xXtO6I0YrIY4IWdsc8YPHgb+ngiFSZBQVNpAUwFLCHs+JF 90Z7gYArMfYoL8ghMlubFK3otqSQS9MgJIh7LXokGYFY7WfQyhu2A1qoVOxRvQ2HSZ68 bVpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=Uj1R8VprO2gM5yhQ4t81phLa7RLpkl0ODVfMpjrgkqY=; b=RCGUFw0MQ5DyP2EUYWtCGWfFg30NNoQZq5+7KeyrFsD05pCy21Jwo3fMSIlKeTEmgC RwHAzVUDwYXz35ta2OulSFk6TPGRV6Txse4W+jIG8IG+Qzf5RFCWojebMisnyug3/WgT vWpPFIY+ucaiXs+6T4Rp/gZNVubZpC+zn230bmO3u/NUod2Gl670KCdNje3eCsa5ia1a pfO54haz3Knw4ZQH7LpbZkXoOwmz8lsFL/1zqDUq6WqeX+Z01iIp6oG1sWlbgsr7LRTh exC4jgUP2jChnkPhBqnviJVL4lFQzzOohdX6dp+RtGYdiE/v6p4Bumo8hIJkIL7ZEwWH sVmA== X-Gm-Message-State: AOAM533H7KFvqCeJkQtTaPcBykdpuSWhM7hVZPUaEeZyYVf+Ha4UzDPM ls9FPntaFu+JsDx68iVEFC4hoxw7QeM= X-Google-Smtp-Source: ABdhPJwyzZUT8XH+KgxDn0ZjmaqtN8tI1gG/eA2OAPLHcjfMH3kmb4Z1e2oRIfOD1RLf9qGNUh0UIYT0h50= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a25:b6c5:: with SMTP id f5mr1365721ybm.407.1619058095408; Wed, 21 Apr 2021 19:21:35 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:21 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-3-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 2/9] KVM: x86: Check CR3 GPA for validity regardless of vCPU mode From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Check CR3 for an invalid GPA even if the vCPU isn't in long mode. For bigger emulation flows, notably RSM, the vCPU mode may not be accurate if CR0/CR4 are loaded after CR3. For MOV CR3 and similar flows, the caller is responsible for truncating the value. Note, SMRAM.CR3 is read-only, so this is mostly a theoretical bug since KVM will not have stored an illegal CR3 into SMRAM during SMI emulation. Fixes: 660a5d517aaa ("KVM: x86: save/load state on SMM switch") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/x86.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index c9ba6f2d9bcd..63af93211871 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1078,10 +1078,15 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) return 0; } - if (is_long_mode(vcpu) && kvm_vcpu_is_illegal_gpa(vcpu, cr3)) + /* + * Do not condition the GPA check on long mode, this helper is used to + * stuff CR3, e.g. for RSM emulation, and there is no guarantee that + * the current vCPU mode is accurate. + */ + if (kvm_vcpu_is_illegal_gpa(vcpu, cr3)) return 1; - else if (is_pae_paging(vcpu) && - !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3)) + + if (is_pae_paging(vcpu) && !load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3)) return 1; kvm_mmu_new_pgd(vcpu, cr3, skip_tlb_flush, skip_tlb_flush); From patchwork Thu Apr 22 02:21:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217365 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0D4C7C43461 for ; Thu, 22 Apr 2021 02:21:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C7A62613DC for ; Thu, 22 Apr 2021 02:21:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234205AbhDVCWQ (ORCPT ); Wed, 21 Apr 2021 22:22:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234301AbhDVCWM (ORCPT ); Wed, 21 Apr 2021 22:22:12 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 56EBBC06138C for ; Wed, 21 Apr 2021 19:21:38 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id e13-20020a25d30d0000b02904ec4109da25so18092514ybf.7 for ; Wed, 21 Apr 2021 19:21:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=dmzwSU4y73/4LEavmF/OYppkzQDl6f2ap4gCGRq/u7Q=; b=B3uHZlKmU3bUpjY9s9zd6Sx6XXeDiQuHUft/ttYvoKDv4H0Cnwd7rFWo/uM9hjbt3V MBjdIRB3khz9u7TdEcltObR7Lo5Uddix+Ii9jiFbzZp3k+RbQrh6ebnx835FjM97uRHG 1BrJzpSswjwDNvcGZD4NB3zGsvqDlsQpCkvTCP9hS0t1p/q0APq2YrkO5N0tHWC9Yj4a dO2YhyKFS751IwMtb8ZaXa/sip0UyazMUZdAgpaZQIzS2bCGsUEjuqVNrM+HM50WUBqS wshEYB7/Eqn2eas6GOseDUqTdF7C7dy6ltuyldoep44gUDAVSnvIuJvRkSbIhEvpUFlZ HQCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=dmzwSU4y73/4LEavmF/OYppkzQDl6f2ap4gCGRq/u7Q=; b=DNISs8lnB977D1nzSfCE1YwAy25u5PYWKfG9UHpcLL65WG0rsMrSzsJiPBsgI7TD7P TFv+3HKnPjCUNEaYtmFU+vKsDo6CxyNecR61/ccTf1XN+qZnBLVnCovTkaOBHeI5OfLR +fS/tMSdffH+olMthuz8yDAJi/K5dbA4vSXRKfpXYVCAL8EYbfMlV4ZOZ4AozZtnX9ag 9+QAy7P2OJO3A0kI72zCC3DLsX5sAh+RXzHj2KsFHRXbuhXbQEmNpPE8pkXNGMso7Dbn pxP3nTXalLal81V+3x4Buqhbwu4dx2riTR/BEnttXNCs8nr5Lu/Gh9rEF+CCP0FmE586 W8cg== X-Gm-Message-State: AOAM530dLvMtmverDfg5XRTTxJQaI27nQXjugPeZms9DzCiFz9YKNvxm yClaPVRfgGBpo8Ggbnprz6NtAcwSRLs= X-Google-Smtp-Source: ABdhPJxCE4gUrvDEB867GR4YRgftu5sFnMM6G98+N8tTlWicY3XWd/UzALl3kkxUTKkrcP0iHY34ArIC5lo= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a25:11c5:: with SMTP id 188mr1415372ybr.322.1619058097612; Wed, 21 Apr 2021 19:21:37 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:22 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-4-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 3/9] KVM: SVM: Truncate GPR value for DR and CR accesses in !64-bit mode From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Drop bits 63:32 on loads/stores to/from DRs and CRs when the vCPU is not in 64-bit mode. The APM states bits 63:32 are dropped for both DRs and CRs: In 64-bit mode, the operand size is fixed at 64 bits without the need for a REX prefix. In non-64-bit mode, the operand size is fixed at 32 bits and the upper 32 bits of the destination are forced to 0. Fixes: 7ff76d58a9dc ("KVM: SVM: enhance MOV CR intercept handler") Fixes: cae3797a4639 ("KVM: SVM: enhance mov DR intercept handler") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/svm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index cd8c333ed2dc..6df12d7967db 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -2462,7 +2462,7 @@ static int cr_interception(struct kvm_vcpu *vcpu) err = 0; if (cr >= 16) { /* mov to cr */ cr -= 16; - val = kvm_register_read(vcpu, reg); + val = kvm_register_readl(vcpu, reg); trace_kvm_cr_write(cr, val); switch (cr) { case 0: @@ -2508,7 +2508,7 @@ static int cr_interception(struct kvm_vcpu *vcpu) kvm_queue_exception(vcpu, UD_VECTOR); return 1; } - kvm_register_write(vcpu, reg, val); + kvm_register_writel(vcpu, reg, val); trace_kvm_cr_read(cr, val); } return kvm_complete_insn_gp(vcpu, err); @@ -2574,11 +2574,11 @@ static int dr_interception(struct kvm_vcpu *vcpu) dr = svm->vmcb->control.exit_code - SVM_EXIT_READ_DR0; if (dr >= 16) { /* mov to DRn */ dr -= 16; - val = kvm_register_read(vcpu, reg); + val = kvm_register_readl(vcpu, reg); err = kvm_set_dr(vcpu, dr, val); } else { kvm_get_dr(vcpu, dr, &val); - kvm_register_write(vcpu, reg, val); + kvm_register_writel(vcpu, reg, val); } return kvm_complete_insn_gp(vcpu, err); From patchwork Thu Apr 22 02:21:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217367 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 895C6C433B4 for ; Thu, 22 Apr 2021 02:21:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 60745613DC for ; Thu, 22 Apr 2021 02:21:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234272AbhDVCWR (ORCPT ); Wed, 21 Apr 2021 22:22:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45278 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233606AbhDVCWP (ORCPT ); Wed, 21 Apr 2021 22:22:15 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3908C06174A for ; Wed, 21 Apr 2021 19:21:40 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id p9-20020a2574090000b02904e2cb6a90e7so18286877ybc.17 for ; Wed, 21 Apr 2021 19:21:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=I0Pc+WtQCqohFg3KL72AUf+SIVAkRNg4ejFXFBQIKY8=; b=H0CqJwhhEVGt3OZ7zmk052Lw3nGLSiNFdL+CgD1B03FsuXEY0C0gFnwhet8PntI872 Q9MoodaRpvytWq9vVyfyRLtUcUKNWit8lYcu4I0fHHgG/XUfpqJ7ErJdwWl7CDJg2PNc MNjB3PaBRxKotaVxXaNIr9eDwYKvlWmxqE/lFwB1GIq20KTtjvL+i/M1qP2Daj0xjxwQ 1+Q2XclcP9g+x42/NjOi177KVLwNstR/MUfmFshal9ChaGbk6lP6ekCiEYcK/ru9Ouiz lqv7BzUOR2Prde6EZFhnAXGKnuP3kMF3p9zmyaNQlzdSKobjtgFHXt6zFfz/yWx/8JF7 Scgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=I0Pc+WtQCqohFg3KL72AUf+SIVAkRNg4ejFXFBQIKY8=; b=V+qKuQLvbxIycXt9wIOnd5JJ2Aegu7y/iVCK42aVIm0L9GybfkOUgUNztO3eE0LlSx wHvS2Y9oIAVzcVCmlTsQ/ryXmFNQaR37BHMZb6x/1lU6ObUCaxGWe3QyUYPvgW8+D6YR I+1KNiDLvVd8bYvCmCySo4I9Av5iNC2O6KG1ZLNfi0Ujtj2hQwnlB0+W55gpmHH3Cxt4 87oDGgvR5BzB0eVvtJbUKPenITfsgs2Z+5reD/5fVNpH+QzRDofc+QzbVnKoAU7/k7s5 bH8wUsGOOHCxe1kSmDH5d5ojRs4CgLWlQncEYRwntT5yc8zCOJtq2x630dS7PBHKZIcm s2Zw== X-Gm-Message-State: AOAM530gPeSUyR801Py6BMKeAugWh0u/9IESr7IwFLtCASWUEpJFLk8r RG7UqwLSKcCgwRFf7rSUogqh7coGzgA= X-Google-Smtp-Source: ABdhPJz/m6k3D3uKftTpKJ5RTzO9n0WC+YUy1Du1c5pKALGSe+ONm/82GevhxcEbVE7jw34a1QP/FTkw4IQ= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a05:6902:68a:: with SMTP id i10mr1456012ybt.0.1619058099879; Wed, 21 Apr 2021 19:21:39 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:23 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-5-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 4/9] KVM: VMX: Truncate GPR value for DR and CR reads in !64-bit mode From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Drop bits 63:32 when storing a DR/CR to a GPR when the vCPU is not in 64-bit mode. Per the SDM: The operand size for these instructions is always 32 bits in non-64-bit modes, regardless of the operand-size attribute. CR8 technically isn't affected as CR8 isn't accessible outside of 64-bit mode, but fix it up for consistency and to allow for future cleanup. Fixes: 6aa8b732ca01 ("[PATCH] kvm: userspace interface") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/vmx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 6501d66167b8..7ef4c11d655b 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -5132,12 +5132,12 @@ static int handle_cr(struct kvm_vcpu *vcpu) case 3: WARN_ON_ONCE(enable_unrestricted_guest); val = kvm_read_cr3(vcpu); - kvm_register_write(vcpu, reg, val); + kvm_register_writel(vcpu, reg, val); trace_kvm_cr_read(cr, val); return kvm_skip_emulated_instruction(vcpu); case 8: val = kvm_get_cr8(vcpu); - kvm_register_write(vcpu, reg, val); + kvm_register_writel(vcpu, reg, val); trace_kvm_cr_read(cr, val); return kvm_skip_emulated_instruction(vcpu); } @@ -5210,7 +5210,7 @@ static int handle_dr(struct kvm_vcpu *vcpu) unsigned long val; kvm_get_dr(vcpu, dr, &val); - kvm_register_write(vcpu, reg, val); + kvm_register_writel(vcpu, reg, val); err = 0; } else { err = kvm_set_dr(vcpu, dr, kvm_register_readl(vcpu, reg)); From patchwork Thu Apr 22 02:21:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217369 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C3E81C433ED for ; Thu, 22 Apr 2021 02:21:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7CD3E613DC for ; Thu, 22 Apr 2021 02:21:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234193AbhDVCWS (ORCPT ); Wed, 21 Apr 2021 22:22:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45288 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234442AbhDVCWQ (ORCPT ); Wed, 21 Apr 2021 22:22:16 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CEDF0C06138C for ; Wed, 21 Apr 2021 19:21:42 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id d89-20020a25a3620000b02904dc8d0450c6so18079482ybi.2 for ; Wed, 21 Apr 2021 19:21:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=S/gdc/KPJQxXmxISBs1in1L8dT4ZjfjiXiG2Z4o7inw=; b=edfyNDAfRzkyrqiUAUJ07/phuYREeNXJb43J5+fNz3oqXwMMMrufgK5rmZprOH5Aji g9JWJ284jHbbeUlp4j9//gscxXo5H3+kVl/4DHB83adoMshbKlGZIUYJEpMFzfKy/Qqh CN9jOX0Aa9nJagqnJBz+i6DNzzSGnZvYUXmkaVPBnVYSzbhITj6YpuL8rowDGBIo8I3l EWq9Sb8eNRVJ5S55G605S8cJRQ/+/qONV6jEBozZC/d4OHwr8NWEIX0nG8ficzR6FPcz q6o1TDgHGjKOB6vgCYglvEr8ar7BLxGF/d/xnkE7MNLYkJwvC5VhWprH1dgwQr3BDEJT 0Fzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=S/gdc/KPJQxXmxISBs1in1L8dT4ZjfjiXiG2Z4o7inw=; b=n+sAOjW74LSZkJuPA8U7oi8bhqqf/rzDs0sY3B6PUmV52edUCFqyo8XCud5TMmikuE jh7KsVwPPoyBMbdGpMUGbXjRCv/gE4gXzO6asGOxGOAlVzOAMoZyVGAKaApB58+VtlDM C5Kk53cF3/htgBpwCQWBVUkFvHPtZ7OFzkPgC3ZRLV6IPX1DF9kKcKWaDMaP3BswZkIa JA/fFSithF2vY68jXLvJfnS6VFj8VBfSL+uPHusp34r/zVBkqYY6VUwHCUN8D+drvzpd kNxlWvb0T3Q1AEMzQUFXTaQYUawD9yIMi+syCs4x2rWCV3IqDLkt7K9269S3ipvf1VID +VTg== X-Gm-Message-State: AOAM531eyl07Nj5gOun1CJiPLcMva7MP+9JvcrAvNe7k1xlZjjiXuRdV Kf83vwumD/DJQGZp5R/CTwLaN9qY+iU= X-Google-Smtp-Source: ABdhPJzhRsVtk2eJrm0tONdcH5S8p/3//CBgI9jMbFawrOKcua/SVngwCpua6QFNe41fYo+ga9uA8WH511Y= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a25:d051:: with SMTP id h78mr1432744ybg.497.1619058102136; Wed, 21 Apr 2021 19:21:42 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:24 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-6-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 5/9] KVM: nVMX: Truncate bits 63:32 of VMCS field on nested check in !64-bit From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Drop bits 63:32 of the VMCS field encoding when checking for a nested VM-Exit on VMREAD/VMWRITE in !64-bit mode. VMREAD and VMWRITE always use 32-bit operands outside of 64-bit mode. The actual emulation of VMREAD/VMWRITE does the right thing, this bug is purely limited to incorrectly causing a nested VM-Exit if a GPR happens to have bits 63:32 set outside of 64-bit mode. Fixes: a7cde481b6e8 ("KVM: nVMX: Do not forward VMREAD/VMWRITE VMExits to L1 if required so by vmcs12 vmread/vmwrite bitmaps") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/nested.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 8b111682fe5c..0e580305a1ee 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -5743,7 +5743,7 @@ static bool nested_vmx_exit_handled_vmcs_access(struct kvm_vcpu *vcpu, /* Decode instruction info and find the field to access */ vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); - field = kvm_register_read(vcpu, (((vmx_instruction_info) >> 28) & 0xf)); + field = kvm_register_readl(vcpu, (((vmx_instruction_info) >> 28) & 0xf)); /* Out-of-range fields always cause a VM exit from L2 to L1 */ if (field >> 15) From patchwork Thu Apr 22 02:21:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217371 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F92CC43461 for ; Thu, 22 Apr 2021 02:21:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4B2EC6144E for ; Thu, 22 Apr 2021 02:21:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234495AbhDVCWV (ORCPT ); Wed, 21 Apr 2021 22:22:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45300 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234504AbhDVCWT (ORCPT ); Wed, 21 Apr 2021 22:22:19 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4513FC06138B for ; Wed, 21 Apr 2021 19:21:45 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id f7-20020a5b0c070000b02904e9a56ee7e7so18175905ybq.9 for ; Wed, 21 Apr 2021 19:21:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=Up7S2qodevYtR008I3N0rggUDJORgGSJOkF2xutYXJ0=; b=iIdJsgJUtTjMzT+78kXuGep6+9QHGKme0vpzT1R8IH880SWMlq/UZlo0s4bPP04QVf IzzhMTDswyo0OclKvrmGOVzZsr2ue1OXAZA13fMO4nhocaYSAuh1AiaonCfqt6OFHlZh eUXunQu8+mQ8MIb41v5rD1DXlaNowrWtD4Fj9zi+eb494QEHW1aWRef1Nx/O1zD24vLR CZhFIFPfwRhtt7iBtoKpQIG1UF4dVRvqWIoPEyFFcuX4qEC8SPCcbnGnteKhMDuz1mED 68aPhgT+WzNNpVNfSfGmaJSQQpuNAtPGzFSerpkS+Wh7P9i96HrlaMhQ/NZoh5w/w9mO LFbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=Up7S2qodevYtR008I3N0rggUDJORgGSJOkF2xutYXJ0=; b=hzUv7FN9N+h7vgQWDXefiFUEMW00Do0xPRBIioaf7fURz1X8h8A+aJq/G5aorJvs9o 9YvZTKvLlWNIDDD26hCu+cR+VXaSd+7/0zy5jdyz3ijBMeWOpVSU12dDLLJfdNjqb1Xs mZryqLiN7G5G/kTwfVQj+xcbH0Cz4csAnKzRyHID3QOnl1twIbvtpAN0mRdjtRlhBGYJ vqjpkg417tJHjsgL4bZSj63YPxnG4ojhI6BWjAOA/ojgI1/dEWN1zgvbMXqK0tcA2k30 YSLslSlFrazuYreTmP3IdgVJp6Kv5XNB/GOg9t1Mq9A0PgAbGV4c2whRLhcKG2g4VXHx oqhg== X-Gm-Message-State: AOAM532VHHVJNGSRxzcV9JwMTCM0by0VSmYaMIfUPl1UZmw/fJQvnm0A h7aINoK2QhyqwlAH33SJCw9NVGz7Uvg= X-Google-Smtp-Source: ABdhPJxUX0Vki1uKyvSo07xv+hVDoZRWGFVlxauhxPzHSyF9jmkSBHAIz9CaOamfc2tIG6F9Sa7NdN8llGY= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a25:69ce:: with SMTP id e197mr1491219ybc.448.1619058104503; Wed, 21 Apr 2021 19:21:44 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:25 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-7-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 6/9] KVM: nVMX: Truncate base/index GPR value on address calc in !64-bit From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Drop bits 63:32 of the base and/or index GPRs when calculating the effective address of a VMX instruction memory operand. Outside of 64-bit mode, memory encodings are strictly limited to E*X and below. Fixes: 064aea774768 ("KVM: nVMX: Decoding memory operands of VMX instructions") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/nested.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 0e580305a1ee..4daf1ff45221 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -4617,9 +4617,9 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, else if (addr_size == 0) off = (gva_t)sign_extend64(off, 15); if (base_is_valid) - off += kvm_register_read(vcpu, base_reg); + off += kvm_register_readl(vcpu, base_reg); if (index_is_valid) - off += kvm_register_read(vcpu, index_reg) << scaling; + off += kvm_register_readl(vcpu, index_reg) << scaling; vmx_get_segment(vcpu, &s, seg_reg); /* From patchwork Thu Apr 22 02:21:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217373 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E8591C43460 for ; Thu, 22 Apr 2021 02:21:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C1F27613DC for ; Thu, 22 Apr 2021 02:21:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234626AbhDVCWX (ORCPT ); Wed, 21 Apr 2021 22:22:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234557AbhDVCWV (ORCPT ); Wed, 21 Apr 2021 22:22:21 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A9724C06174A for ; Wed, 21 Apr 2021 19:21:47 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id s8-20020a5b04480000b029049fb35700b9so18264482ybp.5 for ; Wed, 21 Apr 2021 19:21:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=xV1In29Y6YEryY5tCZ1OMfBVFbGOPZx6sCXlZ5RL1p8=; b=Jb/81HkenqAKVtXbUhkJksYMzFx7vOueqUoQ+FaitFN49C08OYMY8JDKTQkX2baj8O 5KB6XIlX/uQB352pkMYA41vvWaogPc2mIYaXix9Rwqrvr8tBU0rT1Nh4a5BE0wF4vi35 cP3VjrOT9pQfmQVPJB/GX7biQ7JvbwHG0gUD+1HgC5v5ZrYmPhQGUE/koZQY5+V0w+ZV mmP/QaLBmyHI5iTeExyWyAxGXVjQ8xlku0OJPNSK0YDYS8uiy4XdhZ9iYTNkVT+WijpN LNrwG8i8qi67Ezu8SJRUL7WwaJBkZJMxbyqT8uTl5PKe6589b2080hCZlmsrNfCCz+T7 iPCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=xV1In29Y6YEryY5tCZ1OMfBVFbGOPZx6sCXlZ5RL1p8=; b=ckCC0sMD+RZC2Gv6AMrV+mavAy9CZq1OOLRDZSO0QRTFBY9JEMLnuBMMHd/y7OyDXX 3mFK+65cJCTdvVMgvu/19u9ayVkRrg9x+wLNzaVVVco32k8W1QGekU+2hM4mkC1rqFw9 nVdxEkujtvw5bamlqbvnJ9hS4TyDZxlIR0RLrOu5GkuBU8QGHiRnM4kfrD9DfgRkfdMk KZZFwET4BJhitlLACNmLzSXwRWXoWqnlZrrpPKdQx75FHWwyJU3y5/p86oyiCDBoNjhq i78kNKjI/u/VA9Jh29T/CadO5rFzjCq9IeURGSzSA6+8T9XWKv+Gtm3J4szLuEN3F8Tb aAuQ== X-Gm-Message-State: AOAM533LZsiKWIvZmYfhE91ZbemRGuLI/VXWuDE+2BbHAp95/seYcYot XkCQJDjoJE0sstfkmsFpEcqg0z1MT2o= X-Google-Smtp-Source: ABdhPJxcLLryq94UfQMF0/DxZoXVAV8YiSzIf/YibaKUlOLioXkOTIGxBhvQfoacNP701GZIx4UYvSMKk80= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a25:bfd2:: with SMTP id q18mr1434457ybm.127.1619058106949; Wed, 21 Apr 2021 19:21:46 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:26 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-8-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 7/9] KVM: x86/xen: Drop RAX[63:32] when processing hypercall From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Truncate RAX to 32 bits, i.e. consume EAX, when retrieving the hypecall index for a Xen hypercall. Per Xen documentation[*], the index is EAX when the vCPU is not in 64-bit mode. [*] http://xenbits.xenproject.org/docs/sphinx-unstable/guest-guide/x86/hypercall-abi.html Fixes: 23200b7a30de ("KVM: x86/xen: intercept xen hypercalls if enabled") Cc: Joao Martins Cc: David Woodhouse Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson Reviewed-by: Vitaly Kuznetsov --- arch/x86/kvm/xen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index ae17250e1efe..7f27bb65a572 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -673,7 +673,7 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu) bool longmode; u64 input, params[6]; - input = (u64)kvm_register_read(vcpu, VCPU_REGS_RAX); + input = (u64)kvm_register_readl(vcpu, VCPU_REGS_RAX); /* Hyper-V hypercalls get bit 31 set in EAX */ if ((input & 0x80000000) && From patchwork Thu Apr 22 02:21:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217375 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id ED381C433ED for ; Thu, 22 Apr 2021 02:21:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C3B76611C9 for ; Thu, 22 Apr 2021 02:21:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229706AbhDVCW0 (ORCPT ); Wed, 21 Apr 2021 22:22:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234557AbhDVCWY (ORCPT ); Wed, 21 Apr 2021 22:22:24 -0400 Received: from mail-qt1-x84a.google.com (mail-qt1-x84a.google.com [IPv6:2607:f8b0:4864:20::84a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B19EFC06138B for ; Wed, 21 Apr 2021 19:21:49 -0700 (PDT) Received: by mail-qt1-x84a.google.com with SMTP id o15-20020ac872cf0000b02901b358afcd96so14356569qtp.1 for ; Wed, 21 Apr 2021 19:21:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=XcIgsTPGBs6pRE6jBWDLczuu/rTigBWEnSLaTIOPH8A=; b=MA6uLPrTjojcprVshBXIbULDoC733rFWX2OeQoxwFVRl6kD2xQRf6BkZyRD8o4U4m+ O8WPbr2U0/V+VxYsUkl5zCA4UYV1lJniJbwLP4q5iuTJ+PmHc3c7IrTi7VhUeQw/E2rs jQQho5X7/60heZOTBYzDzUemibyJEf/RckgZijK1bWbIwZURYtIz78ydl7RK6IqPYjk2 qI+J2TLBeLtzgHNASBedmrhuZwLU7bh2KgHqrig/NPaQ5xCDlemf1A2dBMC6eAFq1hLF rTT17Rr6WtcqNueReKlkUeZVDFoJ1lkFtFw3XY5RaMAjPJ7NYwdiuhtT14pReyYYGi0+ UHxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=XcIgsTPGBs6pRE6jBWDLczuu/rTigBWEnSLaTIOPH8A=; b=XZNVSYVOl9Btz1q2fmCAor4MRYJzjfJgerpjaa+JLxtbD/Kw5PPJ1OkrokVui0AXPD STpkKaYWpTd6p5aWW6ip1Xf58ymMQ2mfyp8/9WvMFUttwZW0hb7P0WDJQaL75cNRoCSb ubaD5I6i2GD6lwjp3L34i3HcdhsQMgOTGPj3tpJbsQRu3Rl4B053zoyqtoSIr9ir3uog cDndMZ6XLdYCDYnkw4x73uQPSrv2OXdXJG/Ytlqw3m50M3AAaC+t+6jSXVqrAVX7Ok88 VcfH7WMiQBqqUtNVthCf5Fx6WWC6X6G85mmUc6YN0ZnpNmnFulR9XslgQeB+U+ajibB1 HPMA== X-Gm-Message-State: AOAM533aUFTaQHGRtNdJRQ2/daONvXTsxlgscr+MTjQY3ZtJ7YMlFF+X a8EORxfbGOY8nqGn+QpqF8Eyx4DKIbk= X-Google-Smtp-Source: ABdhPJwZRJI4oZlTAaFsOF5n0MbgQM+R5WUPn4TqCzTpYEc2H7u1P4wgJxLLGGZTw6UYPcfg0NekA+phRM0= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:ad4:4944:: with SMTP id o4mr982180qvy.18.1619058108878; Wed, 21 Apr 2021 19:21:48 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:27 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-9-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 8/9] KVM: SVM: Use default rAX size for INVLPGA emulation From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Drop bits 63:32 of RAX when grabbing the address for INVLPGA emulation outside of 64-bit mode to make KVM's emulation slightly less wrong. The address for INVLPGA is determined by the effective address size, i.e. it's not hardcoded to 64/32 bits for a given mode. Add a FIXME to call out that the emulation is wrong. Opportunistically tweak the ASID handling to make it clear that it's defined by ECX, not rCX. Per the APM: The portion of rAX used to form the address is determined by the effective address size (current execution mode and optional address size prefix). The ASID is taken from ECX. Fixes: ff092385e828 ("KVM: SVM: Implement INVLPGA") Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/svm.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 6df12d7967db..ccf9499f2683 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -2301,11 +2301,17 @@ static int clgi_interception(struct kvm_vcpu *vcpu) static int invlpga_interception(struct kvm_vcpu *vcpu) { - trace_kvm_invlpga(to_svm(vcpu)->vmcb->save.rip, kvm_rcx_read(vcpu), - kvm_rax_read(vcpu)); + gva_t gva = kvm_rax_read(vcpu); + u32 asid = kvm_rcx_read(vcpu); + + /* FIXME: Handle an address size prefix. */ + if (!is_long_mode(vcpu)) + gva = (u32)gva; + + trace_kvm_invlpga(to_svm(vcpu)->vmcb->save.rip, asid, gva); /* Let's treat INVLPGA the same as INVLPG (can be optimized!) */ - kvm_mmu_invlpg(vcpu, kvm_rax_read(vcpu)); + kvm_mmu_invlpg(vcpu, gva); return kvm_skip_emulated_instruction(vcpu); } From patchwork Thu Apr 22 02:21:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 12217377 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4DC75C433ED for ; Thu, 22 Apr 2021 02:22:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 341E6611C9 for ; Thu, 22 Apr 2021 02:22:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234799AbhDVCWd (ORCPT ); Wed, 21 Apr 2021 22:22:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234692AbhDVCW1 (ORCPT ); Wed, 21 Apr 2021 22:22:27 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BA989C06174A for ; Wed, 21 Apr 2021 19:21:51 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id n129-20020a2527870000b02904ed02e1aab5so6529964ybn.21 for ; Wed, 21 Apr 2021 19:21:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=reply-to:date:in-reply-to:message-id:mime-version:references :subject:from:to:cc; bh=/eUHzDhZchIlsxYyj/PWrs3bkJEOs2O8LyZxmmuj2Yk=; b=AsABvImWcY7ctQTo22yICeoCsSDf3c1w3jkkkDSobtCbcWEY7AzbUgeM3BXTKqzlbV hlyXkZoYNRoJ8vdeKXMw43p+Iecn5OoEiDmx1hhnz06gPQrS2XZ+38Spm/f/wjIG1ML5 A1saW5Os2o9AWl6t/Am+npsBZEa4J4WfgfHR4aCheyBfU6BKvy6TIKG/XYkdeD/fGsL6 btiAfyWfjDGyN+Qd7IG24dTGNrjM9jdIIH5Ua+Wp6gCby9ryh+CYgcEBUrEccxtTgaCh 5YAK4fwZT0/rq34pzZVtJrrcsfQ2dp0LMiTQ2AMZQysXKVPGfLTIFDQTobMnk6le2IdM c9hA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:date:in-reply-to:message-id :mime-version:references:subject:from:to:cc; bh=/eUHzDhZchIlsxYyj/PWrs3bkJEOs2O8LyZxmmuj2Yk=; b=UeqBVMZvFQ3NJOUtG8podwNUAjThFL2gTl2ndsqTWHsWj4WA3YjY1fPOnqr6/4Stgn IRLv95DefiMnnVkDEGB5BJABoBL87bEyT0B5ce7caAWJJiDmsKVOd3cqWsUAmH8TD5XM deznsuT92jV4uVa/VdEopSnTUjt6eX85H8Hhj5k7Hrzm71WtrvN/oETojDR+BkRBVHIl nxKFQpbs4wXbMWxQ9F1Du7z78g7VPojtwmf2AnKGSdB4bqySB+erIv2SY3ZJ6M6CvObw Xqe5eM8Brk17Pg9koxLnQjeuvQofIs9owN1aCXQb1SdnEcNOHAjt+iw4RDrxwNcV+Ohk Sh1A== X-Gm-Message-State: AOAM531C6OhAGQt+4OXiTS3OpMD5tKFKxeA51qpu+OSbRgF6vmOt9Uyf e+mRpgmaRGeZk1gBKaH9HdQF/RA8H7Q= X-Google-Smtp-Source: ABdhPJzTVxYbg8lXvMvCsLM8GE8t0pVscseDcR/6aqUYIRU1sPv+2AXgnYQq8MFLiSxiBObufdBRQ9UZmKI= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:e012:374c:592:6194]) (user=seanjc job=sendgmr) by 2002:a25:4446:: with SMTP id r67mr1336078yba.54.1619058111005; Wed, 21 Apr 2021 19:21:51 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 21 Apr 2021 19:21:28 -0700 In-Reply-To: <20210422022128.3464144-1-seanjc@google.com> Message-Id: <20210422022128.3464144-10-seanjc@google.com> Mime-Version: 1.0 References: <20210422022128.3464144-1-seanjc@google.com> X-Mailer: git-send-email 2.31.1.498.g6c1eba8ee3d-goog Subject: [PATCH v2 9/9] KVM: x86: Rename GPR accessors to make mode-aware variants the defaults From: Sean Christopherson To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Babu Moger , Joao Martins , David Woodhouse Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Append raw to the direct variants of kvm_register_read/write(), and drop the "l" from the mode-aware variants. I.e. make the mode-aware variants the default, and make the direct variants scary sounding so as to discourage use. Accessing the full 64-bit values irrespective of mode is rarely the desired behavior. Signed-off-by: Sean Christopherson --- arch/x86/kvm/kvm_cache_regs.h | 19 ++++++++++++------- arch/x86/kvm/svm/svm.c | 8 ++++---- arch/x86/kvm/vmx/nested.c | 20 ++++++++++---------- arch/x86/kvm/vmx/vmx.c | 12 ++++++------ arch/x86/kvm/x86.c | 8 ++++---- arch/x86/kvm/x86.h | 8 ++++---- arch/x86/kvm/xen.c | 2 +- 7 files changed, 41 insertions(+), 36 deletions(-) diff --git a/arch/x86/kvm/kvm_cache_regs.h b/arch/x86/kvm/kvm_cache_regs.h index 2e11da2f5621..3db5c42c9ecd 100644 --- a/arch/x86/kvm/kvm_cache_regs.h +++ b/arch/x86/kvm/kvm_cache_regs.h @@ -62,7 +62,12 @@ static inline void kvm_register_mark_dirty(struct kvm_vcpu *vcpu, __set_bit(reg, (unsigned long *)&vcpu->arch.regs_dirty); } -static inline unsigned long kvm_register_read(struct kvm_vcpu *vcpu, int reg) +/* + * The "raw" register helpers are only for cases where the full 64 bits of a + * register are read/written irrespective of current vCPU mode. In other words, + * odds are good you shouldn't be using the raw variants. + */ +static inline unsigned long kvm_register_read_raw(struct kvm_vcpu *vcpu, int reg) { if (WARN_ON_ONCE((unsigned int)reg >= NR_VCPU_REGS)) return 0; @@ -73,8 +78,8 @@ static inline unsigned long kvm_register_read(struct kvm_vcpu *vcpu, int reg) return vcpu->arch.regs[reg]; } -static inline void kvm_register_write(struct kvm_vcpu *vcpu, int reg, - unsigned long val) +static inline void kvm_register_write_raw(struct kvm_vcpu *vcpu, int reg, + unsigned long val) { if (WARN_ON_ONCE((unsigned int)reg >= NR_VCPU_REGS)) return; @@ -85,22 +90,22 @@ static inline void kvm_register_write(struct kvm_vcpu *vcpu, int reg, static inline unsigned long kvm_rip_read(struct kvm_vcpu *vcpu) { - return kvm_register_read(vcpu, VCPU_REGS_RIP); + return kvm_register_read_raw(vcpu, VCPU_REGS_RIP); } static inline void kvm_rip_write(struct kvm_vcpu *vcpu, unsigned long val) { - kvm_register_write(vcpu, VCPU_REGS_RIP, val); + kvm_register_write_raw(vcpu, VCPU_REGS_RIP, val); } static inline unsigned long kvm_rsp_read(struct kvm_vcpu *vcpu) { - return kvm_register_read(vcpu, VCPU_REGS_RSP); + return kvm_register_read_raw(vcpu, VCPU_REGS_RSP); } static inline void kvm_rsp_write(struct kvm_vcpu *vcpu, unsigned long val) { - kvm_register_write(vcpu, VCPU_REGS_RSP, val); + kvm_register_write_raw(vcpu, VCPU_REGS_RSP, val); } static inline u64 kvm_pdptr_read(struct kvm_vcpu *vcpu, int index) diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index ccf9499f2683..96df12157a8a 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -2468,7 +2468,7 @@ static int cr_interception(struct kvm_vcpu *vcpu) err = 0; if (cr >= 16) { /* mov to cr */ cr -= 16; - val = kvm_register_readl(vcpu, reg); + val = kvm_register_read(vcpu, reg); trace_kvm_cr_write(cr, val); switch (cr) { case 0: @@ -2514,7 +2514,7 @@ static int cr_interception(struct kvm_vcpu *vcpu) kvm_queue_exception(vcpu, UD_VECTOR); return 1; } - kvm_register_writel(vcpu, reg, val); + kvm_register_write(vcpu, reg, val); trace_kvm_cr_read(cr, val); } return kvm_complete_insn_gp(vcpu, err); @@ -2580,11 +2580,11 @@ static int dr_interception(struct kvm_vcpu *vcpu) dr = svm->vmcb->control.exit_code - SVM_EXIT_READ_DR0; if (dr >= 16) { /* mov to DRn */ dr -= 16; - val = kvm_register_readl(vcpu, reg); + val = kvm_register_read(vcpu, reg); err = kvm_set_dr(vcpu, dr, val); } else { kvm_get_dr(vcpu, dr, &val); - kvm_register_writel(vcpu, reg, val); + kvm_register_write(vcpu, reg, val); } return kvm_complete_insn_gp(vcpu, err); diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 4daf1ff45221..89976c95091e 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -4617,9 +4617,9 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, else if (addr_size == 0) off = (gva_t)sign_extend64(off, 15); if (base_is_valid) - off += kvm_register_readl(vcpu, base_reg); + off += kvm_register_read(vcpu, base_reg); if (index_is_valid) - off += kvm_register_readl(vcpu, index_reg) << scaling; + off += kvm_register_read(vcpu, index_reg) << scaling; vmx_get_segment(vcpu, &s, seg_reg); /* @@ -5021,7 +5021,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu) return nested_vmx_failInvalid(vcpu); /* Decode instruction info and find the field to read */ - field = kvm_register_readl(vcpu, (((instr_info) >> 28) & 0xf)); + field = kvm_register_read(vcpu, (((instr_info) >> 28) & 0xf)); offset = vmcs_field_to_offset(field); if (offset < 0) @@ -5039,7 +5039,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu) * on the guest's mode (32 or 64 bit), not on the given field's length. */ if (instr_info & BIT(10)) { - kvm_register_writel(vcpu, (((instr_info) >> 3) & 0xf), value); + kvm_register_write(vcpu, (((instr_info) >> 3) & 0xf), value); } else { len = is_64_bit_mode(vcpu) ? 8 : 4; if (get_vmx_mem_address(vcpu, exit_qualification, @@ -5113,7 +5113,7 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) return nested_vmx_failInvalid(vcpu); if (instr_info & BIT(10)) - value = kvm_register_readl(vcpu, (((instr_info) >> 3) & 0xf)); + value = kvm_register_read(vcpu, (((instr_info) >> 3) & 0xf)); else { len = is_64_bit_mode(vcpu) ? 8 : 4; if (get_vmx_mem_address(vcpu, exit_qualification, @@ -5124,7 +5124,7 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) return kvm_handle_memory_failure(vcpu, r, &e); } - field = kvm_register_readl(vcpu, (((instr_info) >> 28) & 0xf)); + field = kvm_register_read(vcpu, (((instr_info) >> 28) & 0xf)); offset = vmcs_field_to_offset(field); if (offset < 0) @@ -5321,7 +5321,7 @@ static int handle_invept(struct kvm_vcpu *vcpu) return 1; vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); - type = kvm_register_readl(vcpu, (vmx_instruction_info >> 28) & 0xf); + type = kvm_register_read(vcpu, (vmx_instruction_info >> 28) & 0xf); types = (vmx->nested.msrs.ept_caps >> VMX_EPT_EXTENT_SHIFT) & 6; @@ -5401,7 +5401,7 @@ static int handle_invvpid(struct kvm_vcpu *vcpu) return 1; vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); - type = kvm_register_readl(vcpu, (vmx_instruction_info >> 28) & 0xf); + type = kvm_register_read(vcpu, (vmx_instruction_info >> 28) & 0xf); types = (vmx->nested.msrs.vpid_caps & VMX_VPID_EXTENT_SUPPORTED_MASK) >> 8; @@ -5657,7 +5657,7 @@ static bool nested_vmx_exit_handled_cr(struct kvm_vcpu *vcpu, switch ((exit_qualification >> 4) & 3) { case 0: /* mov to cr */ reg = (exit_qualification >> 8) & 15; - val = kvm_register_readl(vcpu, reg); + val = kvm_register_read(vcpu, reg); switch (cr) { case 0: if (vmcs12->cr0_guest_host_mask & @@ -5743,7 +5743,7 @@ static bool nested_vmx_exit_handled_vmcs_access(struct kvm_vcpu *vcpu, /* Decode instruction info and find the field to access */ vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); - field = kvm_register_readl(vcpu, (((vmx_instruction_info) >> 28) & 0xf)); + field = kvm_register_read(vcpu, (((vmx_instruction_info) >> 28) & 0xf)); /* Out-of-range fields always cause a VM exit from L2 to L1 */ if (field >> 15) diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 7ef4c11d655b..13ac981fae1d 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -5090,7 +5090,7 @@ static int handle_cr(struct kvm_vcpu *vcpu) reg = (exit_qualification >> 8) & 15; switch ((exit_qualification >> 4) & 3) { case 0: /* mov to cr */ - val = kvm_register_readl(vcpu, reg); + val = kvm_register_read(vcpu, reg); trace_kvm_cr_write(cr, val); switch (cr) { case 0: @@ -5132,12 +5132,12 @@ static int handle_cr(struct kvm_vcpu *vcpu) case 3: WARN_ON_ONCE(enable_unrestricted_guest); val = kvm_read_cr3(vcpu); - kvm_register_writel(vcpu, reg, val); + kvm_register_write(vcpu, reg, val); trace_kvm_cr_read(cr, val); return kvm_skip_emulated_instruction(vcpu); case 8: val = kvm_get_cr8(vcpu); - kvm_register_writel(vcpu, reg, val); + kvm_register_write(vcpu, reg, val); trace_kvm_cr_read(cr, val); return kvm_skip_emulated_instruction(vcpu); } @@ -5210,10 +5210,10 @@ static int handle_dr(struct kvm_vcpu *vcpu) unsigned long val; kvm_get_dr(vcpu, dr, &val); - kvm_register_writel(vcpu, reg, val); + kvm_register_write(vcpu, reg, val); err = 0; } else { - err = kvm_set_dr(vcpu, dr, kvm_register_readl(vcpu, reg)); + err = kvm_set_dr(vcpu, dr, kvm_register_read(vcpu, reg)); } out: @@ -5565,7 +5565,7 @@ static int handle_invpcid(struct kvm_vcpu *vcpu) } vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); - type = kvm_register_readl(vcpu, (vmx_instruction_info >> 28) & 0xf); + type = kvm_register_read(vcpu, (vmx_instruction_info >> 28) & 0xf); if (type > 3) { kvm_inject_gp(vcpu, 0); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 63af93211871..5e7d1cd2e2a5 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6974,12 +6974,12 @@ static bool emulator_guest_has_fxsr(struct x86_emulate_ctxt *ctxt) static ulong emulator_read_gpr(struct x86_emulate_ctxt *ctxt, unsigned reg) { - return kvm_register_read(emul_to_vcpu(ctxt), reg); + return kvm_register_read_raw(emul_to_vcpu(ctxt), reg); } static void emulator_write_gpr(struct x86_emulate_ctxt *ctxt, unsigned reg, ulong val) { - kvm_register_write(emul_to_vcpu(ctxt), reg, val); + kvm_register_write_raw(emul_to_vcpu(ctxt), reg, val); } static void emulator_set_nmi_mask(struct x86_emulate_ctxt *ctxt, bool masked) @@ -8660,7 +8660,7 @@ static void enter_smm_save_state_32(struct kvm_vcpu *vcpu, char *buf) put_smstate(u32, buf, 0x7ff0, kvm_rip_read(vcpu)); for (i = 0; i < 8; i++) - put_smstate(u32, buf, 0x7fd0 + i * 4, kvm_register_read(vcpu, i)); + put_smstate(u32, buf, 0x7fd0 + i * 4, kvm_register_read_raw(vcpu, i)); kvm_get_dr(vcpu, 6, &val); put_smstate(u32, buf, 0x7fcc, (u32)val); @@ -8706,7 +8706,7 @@ static void enter_smm_save_state_64(struct kvm_vcpu *vcpu, char *buf) int i; for (i = 0; i < 16; i++) - put_smstate(u64, buf, 0x7ff8 - i * 8, kvm_register_read(vcpu, i)); + put_smstate(u64, buf, 0x7ff8 - i * 8, kvm_register_read_raw(vcpu, i)); put_smstate(u64, buf, 0x7f78, kvm_rip_read(vcpu)); put_smstate(u32, buf, 0x7f70, kvm_get_rflags(vcpu)); diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index daccf20fbcd5..f2a4094532cf 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -232,19 +232,19 @@ static inline bool vcpu_match_mmio_gpa(struct kvm_vcpu *vcpu, gpa_t gpa) return false; } -static inline unsigned long kvm_register_readl(struct kvm_vcpu *vcpu, int reg) +static inline unsigned long kvm_register_read(struct kvm_vcpu *vcpu, int reg) { - unsigned long val = kvm_register_read(vcpu, reg); + unsigned long val = kvm_register_read_raw(vcpu, reg); return is_64_bit_mode(vcpu) ? val : (u32)val; } -static inline void kvm_register_writel(struct kvm_vcpu *vcpu, +static inline void kvm_register_write(struct kvm_vcpu *vcpu, int reg, unsigned long val) { if (!is_64_bit_mode(vcpu)) val = (u32)val; - return kvm_register_write(vcpu, reg, val); + return kvm_register_write_raw(vcpu, reg, val); } static inline bool kvm_check_has_quirk(struct kvm *kvm, u64 quirk) diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index 7f27bb65a572..ae17250e1efe 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -673,7 +673,7 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu) bool longmode; u64 input, params[6]; - input = (u64)kvm_register_readl(vcpu, VCPU_REGS_RAX); + input = (u64)kvm_register_read(vcpu, VCPU_REGS_RAX); /* Hyper-V hypercalls get bit 31 set in EAX */ if ((input & 0x80000000) &&