Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4929154pxj; Tue, 22 Jun 2021 11:03:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyZEfL3Z4tUz8RgY+T2JDyW6IUacFfkhtqiojv9Cg3Z6rsM1L1uPNuu//BeTRZx4k0xdFw2 X-Received: by 2002:a02:3705:: with SMTP id r5mr5141121jar.144.1624384994456; Tue, 22 Jun 2021 11:03:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624384994; cv=none; d=google.com; s=arc-20160816; b=k5sZBOu0tjMHiExyhGqqC4akmavtG/6Z1gpffM+FXnI15u2OGJVR9BjhQzpgBTFCAZ tNUk7s/LpZUXuaN3brmuQz7ZP9ZfYVyv+rYgwnRp1GIfbZ2Tcikz2zm0elU4TdrRIvAx zWKgNVVZVQVSF0eccRpjXjBLmkhZ/5y9fovneJ0Q3Bk8JCNEK3w3N50C/iFyPcY4FTyl yeq8ARaQEV226tl8/mEgaMVmvw0MXNVSIGhRnU98zjoEjY0GkFLOLa0ViMQ710dmEg76 QnGhAqWE3gydKsj18qIZitE/iacEvI75I+CYzRbeM5qqkpmK+CQe8FvsdvrmUh4HncR9 9KVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:reply-to:dkim-signature; bh=ZjfAtztgIxSnkfwWudgTHhql9ALcAbuUdFL41aYtPBI=; b=V1F0Se5m/uKxd6uOpkBSJfbctDymBCeMvO7GSDFhEUVysJqaDZvgVShNUhMXqceVZ7 nmXepwKn30NkYluGObOHZ3MyVnIGm+rbMRUsStY0np7l8T2PqO670u7S4vTmFIeIpTSP nPk2u8j8idpvfEuBUW6ONQxwvhFTfavZdfPTT71LZEfWXE6aCGW8nKi21b84NWuz8hQn N9q9d5t4zQ2GZW+T+mbuoWFcLaogaVQrPS8UvHDCIFD7SWOyoTldPIade9SH2Ir42ZyF 98XIBI2HoPITsZ0sXb45Hc5h4sFrAWDI6mCwv+Q9QeFv8YWheH1GwshtgHDTFwdqsIvu qGJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=csSsNrTm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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. [23.128.96.18]) by mx.google.com with ESMTP id s13si63150jat.111.2021.06.22.11.03.00; Tue, 22 Jun 2021 11:03:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=csSsNrTm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S232721AbhFVSEr (ORCPT + 99 others); Tue, 22 Jun 2021 14:04:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37658 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232882AbhFVSEL (ORCPT ); Tue, 22 Jun 2021 14:04:11 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20738C0604C7 for ; Tue, 22 Jun 2021 10:59:19 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id cj11-20020a056214056bb029026a99960c7aso13382035qvb.22 for ; Tue, 22 Jun 2021 10:59:19 -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=ZjfAtztgIxSnkfwWudgTHhql9ALcAbuUdFL41aYtPBI=; b=csSsNrTm7SI12ppYN58JeYha3x+cE+fgCutJGEvssLDjbBEMULDn1BwPwszMlXx1GB 6+lYsiYTW4zTUgzVS6UFclb9K1iRvv+VzsYeVjAtPSOGbHq1+lowv20Ckt3x2RyPnGLm D8oP2XMw2uUruTasrKXEpjXmsuxJlaShM13diQbc19bSuzd86my16ue/NCBb+zoh8p+7 8uMk+rhOQITvUfGXvyag8v/fQH/naHWyyk9WIg+WBPz10Cg4x5QhTdhWCisCZcfwTTeb NzXrODE/xUOf+eNwhdPjsCfeKJi6zWf4u0uvNPRju9jEpids20Q5QnkV1pGyDoZdVayb 8xmA== 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=ZjfAtztgIxSnkfwWudgTHhql9ALcAbuUdFL41aYtPBI=; b=gCZksxKQfz89iJFTNFIYoq4eqNETu3PakJn5fdAKJlWQAOZsl+rA8tVGv79EVpuUQA vvcvcgPBl7jjgOJrNRf4oZh8FtBi6hWMotIlGpGtIthatlb5jmf9IUQZbylFIxUa+wg9 sdORC8Ika9nWjA6spd9tVg6CRo3CyGpz0OBVHi/M/1x4GsGPmUdrtPf265U6I8XXjrC6 lQXcMgHtS3+isMVoipczH8PcrHF8PvRFoP5tX56a8MFQ76djloiNESDRwHCsM1GbuSq0 KqvoFDlXAfYhcTKaLvMwQf1CNt8Fnu26RPHh+g/rn3Hn6tRAOZyReCniTgIRK2DYh5SY EvwQ== X-Gm-Message-State: AOAM5313HIYOK7SzdOFrbBgqHyqQl18k1Qxr4xE9ZGp5EIgk5I4tk/Lw AINIr09SWD1FtxIrJsn85QTX5egeYao= X-Received: from seanjc798194.pdx.corp.google.com ([2620:15c:f:10:5722:92ce:361f:3832]) (user=seanjc job=sendgmr) by 2002:a25:ab91:: with SMTP id v17mr6397028ybi.512.1624384758232; Tue, 22 Jun 2021 10:59:18 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 22 Jun 2021 10:57:21 -0700 In-Reply-To: <20210622175739.3610207-1-seanjc@google.com> Message-Id: <20210622175739.3610207-37-seanjc@google.com> Mime-Version: 1.0 References: <20210622175739.3610207-1-seanjc@google.com> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog Subject: [PATCH 36/54] KVM: x86/mmu: Use MMU's role/role_regs to compute context's metadata 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, Yu Zhang , Maxim Levitsky Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use the MMU's role and role_regs to calculate the MMU's guest root level and NX bit. For some flows, the vCPU state may not be correct (or relevant), e.g. EPT doesn't interact with EFER.NX and nested NPT will configure the guest_mmu with possibly-stale vCPU state. Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/mmu.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 67aa19ab628d..30cbc6cdb0db 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3948,8 +3948,7 @@ int kvm_tdp_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, max_level, true); } -static void nonpaging_init_context(struct kvm_vcpu *vcpu, - struct kvm_mmu *context) +static void nonpaging_init_context(struct kvm_mmu *context) { context->page_fault = nonpaging_page_fault; context->gva_to_gpa = nonpaging_gva_to_gpa; @@ -4513,14 +4512,13 @@ static void update_last_nonleaf_level(struct kvm_mmu *mmu) mmu->last_nonleaf_level++; } -static void paging64_init_context_common(struct kvm_vcpu *vcpu, - struct kvm_mmu *context, +static void paging64_init_context_common(struct kvm_mmu *context, int root_level) { - context->nx = is_nx(vcpu); + context->nx = is_efer_nx(context); context->root_level = root_level; - MMU_WARN_ON(!is_pae(vcpu)); + WARN_ON_ONCE(!is_cr4_pae(context)); context->page_fault = paging64_page_fault; context->gva_to_gpa = paging64_gva_to_gpa; context->sync_page = paging64_sync_page; @@ -4528,17 +4526,16 @@ static void paging64_init_context_common(struct kvm_vcpu *vcpu, context->direct_map = false; } -static void paging64_init_context(struct kvm_vcpu *vcpu, - struct kvm_mmu *context) +static void paging64_init_context(struct kvm_mmu *context, + struct kvm_mmu_role_regs *regs) { - int root_level = is_la57_mode(vcpu) ? - PT64_ROOT_5LEVEL : PT64_ROOT_4LEVEL; + int root_level = ____is_cr4_la57(regs) ? PT64_ROOT_5LEVEL : + PT64_ROOT_4LEVEL; - paging64_init_context_common(vcpu, context, root_level); + paging64_init_context_common(context, root_level); } -static void paging32_init_context(struct kvm_vcpu *vcpu, - struct kvm_mmu *context) +static void paging32_init_context(struct kvm_mmu *context) { context->nx = false; context->root_level = PT32_ROOT_LEVEL; @@ -4549,10 +4546,9 @@ static void paging32_init_context(struct kvm_vcpu *vcpu, context->direct_map = false; } -static void paging32E_init_context(struct kvm_vcpu *vcpu, - struct kvm_mmu *context) +static void paging32E_init_context(struct kvm_mmu *context) { - paging64_init_context_common(vcpu, context, PT32E_ROOT_LEVEL); + paging64_init_context_common(context, PT32E_ROOT_LEVEL); } static union kvm_mmu_extended_role kvm_calc_mmu_role_ext(struct kvm_vcpu *vcpu, @@ -4712,13 +4708,13 @@ static void shadow_mmu_init_context(struct kvm_vcpu *vcpu, struct kvm_mmu *conte context->mmu_role.as_u64 = new_role.as_u64; if (!____is_cr0_pg(regs)) - nonpaging_init_context(vcpu, context); + nonpaging_init_context(context); else if (____is_efer_lma(regs)) - paging64_init_context(vcpu, context); + paging64_init_context(context, regs); else if (____is_cr4_pae(regs)) - paging32E_init_context(vcpu, context); + paging32E_init_context(context); else - paging32_init_context(vcpu, context); + paging32_init_context(context); if (____is_cr0_pg(regs)) { reset_rsvds_bits_mask(vcpu, context); -- 2.32.0.288.g62a8d224e6-goog