Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp2598152pxb; Sun, 24 Apr 2022 20:25:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyF8NnEUg0et45W+zfSvFUYE8au9pcp/KZRpSb7PGk4zjmr5a6AjpP4mdgip/XFWeIzVA68 X-Received: by 2002:a05:6402:1941:b0:413:2555:53e3 with SMTP id f1-20020a056402194100b00413255553e3mr16679083edz.164.1650857143260; Sun, 24 Apr 2022 20:25:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650857143; cv=none; d=google.com; s=arc-20160816; b=YcaWWBoS9E46fYZG70sPhlvQUKRErHQnD8b0W5wRGI+Q3scQttJ43pLeezNCZ8ux0r eFf1O2OxaLzxhih/9viOyQTr+YLefd0HH//5fVJyUZnrJSXDUUEl4sB9GaztNJASo75y Cevbnox5ltFMawwMmji2iNEUuE8qelF/XNgOMLcqJxXbTDn9JlYF3+XGZx3Dh2vyn9iv xzIEyoWzETNtc2UY6cHw+gGHgRmm+jf1ykatc4ab4xSyN4i9kdUmSGn6e3frj/HZAIQ0 in+b5t+EwW5fegiMXTZ0qV4wfbC5Mml3VB62YfXyYA70okTcHHRE4N06FRY4ep0u/CrP KfmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ZRa4gZoGM3bf5rKMBIvpQqgvg5gCBN8q1DQkn1v6wpw=; b=fkPkZKxtaxM6Rcp6Xielz96WLNftmRRUjOobzJ3Jp6GI2DR+MAucpf0vZUhLNngADY WdJOEAB6IHtvEZiRTnCKIWd6fPEO6wQpQWZ9U1RPspeWbrfg5h0PgDLokuc7hbz3oFAW 2PC6M7bQErm7HOJo3A8Ko74vYSlIfCaP1hfI3Vga/7qXkZ0kTN4yMhzlM6BKEyR5h5lf iNHTElocaX5fq1Uc8AS9wJrGVjxNRRzBE3Rly5pQz9MOeQdd+0QrkPlDBg/P/M8FDE5V QCMsvrlDoOzBsdPIF2+ostoY0YEClqZEWRNBzgS2dWGdCXJuUyZLiKF3jEPKAc0l1Mn6 FTxw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="Sy+X/Iy9"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id og9-20020a1709071dc900b006e7f908e9d8si11971861ejc.671.2022.04.24.20.25.12; Sun, 24 Apr 2022 20:25:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="Sy+X/Iy9"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239086AbiDXKTO (ORCPT + 99 others); Sun, 24 Apr 2022 06:19:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60062 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239011AbiDXKTB (ORCPT ); Sun, 24 Apr 2022 06:19:01 -0400 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8D4B54ECDE; Sun, 24 Apr 2022 03:16:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650795361; x=1682331361; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qz/GE1fawZvUOeTVkWMItT1dq54iN+MwN7o2/FhMXlA=; b=Sy+X/Iy9JpUaylKCSrQ884Vr+vfmIvLy48Ex9JN2BBIjaWxxJR+VVHw8 qq9pcTJOMKv9n5pZSk+WMQ+BRrhIXfSQDirMAUn48+hO5bEVDf9ieL6iU bUr9u+KbC+9NcOwajModtGE+jM7bya4iRRwVnkcfBv1wPiKELkm2qFA6E 7W4UXdk0mBaO5Vi2xv5YFZqc3OGuXoW0r6/T5TvK5gxBdBLDrjsWg+Ovs nOLeHlOr4+6VB9CUGH3O3HIU69NzCt3mhHMhNGhKmxCMs3cyY1Rrnm50O 3h+xR8HJJLZoFXs1JVfWeCADk+KM3M5jzHOEs08ymIf6zlO4hqyH6IEVn A==; X-IronPort-AV: E=McAfee;i="6400,9594,10326"; a="264813946" X-IronPort-AV: E=Sophos;i="5.90,286,1643702400"; d="scan'208";a="264813946" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Apr 2022 03:16:00 -0700 X-IronPort-AV: E=Sophos;i="5.90,286,1643702400"; d="scan'208";a="616086719" Received: from 984fee00be24.jf.intel.com ([10.165.54.246]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Apr 2022 03:15:59 -0700 From: Lei Wang To: pbonzini@redhat.com, seanjc@google.com, vkuznets@redhat.com, wanpengli@tencent.com, jmattson@google.com, joro@8bytes.org Cc: lei4.wang@intel.com, chenyi.qiang@intel.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v7 5/8] KVM: MMU: Add helper function to get pkr bits Date: Sun, 24 Apr 2022 03:15:54 -0700 Message-Id: <20220424101557.134102-6-lei4.wang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220424101557.134102-1-lei4.wang@intel.com> References: <20220424101557.134102-1-lei4.wang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Extra the PKR stuff to a separate, non-inline helper, which is a preparation to introduce pks support. Signed-off-by: Lei Wang --- arch/x86/kvm/mmu.h | 20 +++++--------------- arch/x86/kvm/mmu/mmu.c | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h index cb3f07e63778..cea03053a153 100644 --- a/arch/x86/kvm/mmu.h +++ b/arch/x86/kvm/mmu.h @@ -204,6 +204,9 @@ static inline int kvm_mmu_do_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, return vcpu->arch.mmu->page_fault(vcpu, &fault); } +u32 kvm_mmu_pkr_bits(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, + unsigned pte_access, unsigned pte_pkey, unsigned int pfec); + /* * Check if a given access (described through the I/D, W/R and U/S bits of a * page fault error code pfec) causes a permission fault with the given PTE @@ -240,21 +243,8 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, WARN_ON(pfec & (PFERR_PK_MASK | PFERR_RSVD_MASK)); if (unlikely(mmu->pkr_mask)) { - u32 pkr_bits, offset; - - /* - * PKRU defines 32 bits, there are 16 domains and 2 - * attribute bits per domain in pkru. pte_pkey is the - * index of the protection domain, so pte_pkey * 2 is - * is the index of the first bit for the domain. - */ - pkr_bits = (vcpu->arch.pkru >> (pte_pkey * 2)) & 3; - - /* clear present bit, replace PFEC.RSVD with ACC_USER_MASK. */ - offset = (pfec & ~1) + - ((pte_access & PT_USER_MASK) << (PFERR_RSVD_BIT - PT_USER_SHIFT)); - - pkr_bits &= mmu->pkr_mask >> offset; + u32 pkr_bits = + kvm_mmu_pkr_bits(vcpu, mmu, pte_access, pte_pkey, pfec); errcode |= -pkr_bits & PFERR_PK_MASK; fault |= (pkr_bits != 0); } diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index de665361548d..6d3276986102 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -6477,3 +6477,24 @@ void kvm_mmu_pre_destroy_vm(struct kvm *kvm) if (kvm->arch.nx_lpage_recovery_thread) kthread_stop(kvm->arch.nx_lpage_recovery_thread); } + +u32 kvm_mmu_pkr_bits(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, + unsigned pte_access, unsigned pte_pkey, unsigned int pfec) +{ + u32 pkr_bits, offset; + + /* + * PKRU defines 32 bits, there are 16 domains and 2 + * attribute bits per domain in pkru. pte_pkey is the + * index of the protection domain, so pte_pkey * 2 is + * is the index of the first bit for the domain. + */ + pkr_bits = (vcpu->arch.pkru >> (pte_pkey * 2)) & 3; + + /* clear present bit, replace PFEC.RSVD with ACC_USER_MASK. */ + offset = (pfec & ~1) + ((pte_access & PT_USER_MASK) + << (PFERR_RSVD_BIT - PT_USER_SHIFT)); + + pkr_bits &= mmu->pkr_mask >> offset; + return pkr_bits; +} -- 2.25.1