From: Chenyi Qiang <chenyi.qiang@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>,
Sean Christopherson <sean.j.christopherson@intel.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
Xiaoyao Li <xiaoyao.li@intel.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [RFC 4/7] KVM: MMU: Refactor pkr_mask to cache condition
Date: Fri, 7 Aug 2020 16:48:38 +0800 [thread overview]
Message-ID: <20200807084841.7112-5-chenyi.qiang@intel.com> (raw)
In-Reply-To: <20200807084841.7112-1-chenyi.qiang@intel.com>
pkr_mask bitmap indicates if protection key checks are needed for user
pages currently. It is indexed by page fault error code bits [4:1] with
PFEC.RSVD replaced by the ACC_USER_MASK from the page tables. Refactor
it by reverting to the use of PFEC.RSVD. After that, PKS and PKU can
share the same bitmap.
Signed-off-by: Chenyi Qiang <chenyi.qiang@intel.com>
---
arch/x86/kvm/mmu.h | 10 ++++++----
arch/x86/kvm/mmu/mmu.c | 16 ++++++++++------
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h
index 0c2fdf0abf22..7fb4c63d5704 100644
--- a/arch/x86/kvm/mmu.h
+++ b/arch/x86/kvm/mmu.h
@@ -202,11 +202,13 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
* 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;
+ if (pte_access & PT_USER_MASK)
+ pkr_bits = (vcpu->arch.pkru >> (pte_pkey * 2)) & 3;
+ else
+ pkr_bits = 0;
- /* clear present bit, replace PFEC.RSVD with ACC_USER_MASK. */
- offset = (pfec & ~1) +
- ((pte_access & PT_USER_MASK) << (PFERR_RSVD_BIT - PT_USER_SHIFT));
+ /* clear present bit */
+ offset = (pfec & ~1);
pkr_bits &= mmu->pkr_mask >> offset;
errcode |= -pkr_bits & PFERR_PK_MASK;
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 481442f5e27a..333b4da739f8 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -4737,21 +4737,25 @@ static void update_pkr_bitmask(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
for (bit = 0; bit < ARRAY_SIZE(mmu->permissions); ++bit) {
unsigned pfec, pkey_bits;
- bool check_pkey, check_write, ff, uf, wf, pte_user;
+ bool check_pkey, check_write, ff, uf, wf, rsvdf;
pfec = bit << 1;
ff = pfec & PFERR_FETCH_MASK;
uf = pfec & PFERR_USER_MASK;
wf = pfec & PFERR_WRITE_MASK;
- /* PFEC.RSVD is replaced by ACC_USER_MASK. */
- pte_user = pfec & PFERR_RSVD_MASK;
+ /*
+ * PFERR_RSVD_MASK bit is not set if the
+ * access is subject to PK restrictions.
+ */
+ rsvdf = pfec & PFERR_RSVD_MASK;
/*
- * Only need to check the access which is not an
- * instruction fetch and is to a user page.
+ * need to check the access which is not an
+ * instruction fetch and is not a rsvd fault.
*/
- check_pkey = (!ff && pte_user);
+ check_pkey = (!ff && !rsvdf);
+
/*
* write access is controlled by PKRU if it is a
* user access or CR0.WP = 1.
--
2.17.1
next prev parent reply other threads:[~2020-08-07 8:47 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-07 8:48 [RFC 0/7] KVM: PKS Virtualization support Chenyi Qiang
2020-08-07 8:48 ` [RFC 1/7] KVM: VMX: Introduce PKS VMCS fields Chenyi Qiang
2020-08-10 23:17 ` Jim Mattson
2020-08-07 8:48 ` [RFC 2/7] KVM: VMX: Expose IA32_PKRS MSR Chenyi Qiang
2020-08-12 21:21 ` Jim Mattson
2020-08-13 5:42 ` Chenyi Qiang
2020-08-13 17:31 ` Jim Mattson
2020-08-18 7:27 ` Chenyi Qiang
2020-08-18 18:23 ` Jim Mattson
2020-08-22 3:28 ` Sean Christopherson
2021-01-26 18:01 ` Paolo Bonzini
2021-01-27 7:55 ` Chenyi Qiang
2021-02-01 9:53 ` Chenyi Qiang
2021-02-01 10:05 ` Paolo Bonzini
2020-08-07 8:48 ` [RFC 3/7] KVM: MMU: Rename the pkru to pkr Chenyi Qiang
2021-01-26 18:16 ` Paolo Bonzini
2020-08-07 8:48 ` Chenyi Qiang [this message]
2021-01-26 18:16 ` [RFC 4/7] KVM: MMU: Refactor pkr_mask to cache condition Paolo Bonzini
2021-01-27 3:14 ` Chenyi Qiang
2020-08-07 8:48 ` [RFC 5/7] KVM: MMU: Add support for PKS emulation Chenyi Qiang
2021-01-26 18:23 ` Paolo Bonzini
2021-01-27 3:00 ` Chenyi Qiang
2021-01-27 8:37 ` Paolo Bonzini
2020-08-07 8:48 ` [RFC 6/7] KVM: X86: Expose PKS to guest and userspace Chenyi Qiang
2020-08-13 19:04 ` Jim Mattson
2020-08-14 2:33 ` Chenyi Qiang
2020-09-30 4:36 ` Sean Christopherson
2021-01-26 18:24 ` Paolo Bonzini
2021-01-26 19:56 ` Sean Christopherson
2021-01-26 20:05 ` Paolo Bonzini
2020-08-07 8:48 ` [RFC 7/7] KVM: VMX: Enable PKS for nested VM Chenyi Qiang
2020-08-11 0:05 ` Jim Mattson
2020-08-12 15:00 ` Sean Christopherson
2020-08-12 18:32 ` Jim Mattson
2020-08-13 4:52 ` Chenyi Qiang
2020-08-13 17:52 ` Jim Mattson
2020-08-14 10:07 ` Chenyi Qiang
2020-08-14 17:34 ` Jim Mattson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200807084841.7112-5-chenyi.qiang@intel.com \
--to=chenyi.qiang@intel.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=sean.j.christopherson@intel.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
--cc=xiaoyao.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.