KVM: x86: Remove separate "bit" defines for page fault error code masks
authorSean Christopherson <seanjc@google.com>
Wed, 28 Feb 2024 02:41:33 +0000 (18:41 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 7 May 2024 15:59:17 +0000 (11:59 -0400)
Open code the bit number directly in the PFERR_* masks and drop the
intermediate PFERR_*_BIT defines, as having to bounce through two macros
just to see which flag corresponds to which bit is quite annoying, as is
having to define two macros just to add recognition of a new flag.

Use ternary operator to derive the bit in permission_fault(), the one
function that actually needs the bit number as part of clever shifting
to avoid conditional branches.  Generally the compiler is able to turn
it into a conditional move, and if not it's not really a big deal.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20240228024147.41573-3-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/mmu.h

index 01c69840647e45bcc0a26fcb3cbf4eb2205cbb3a..065beb3b35398fe41f20cca75ae3cddbda1b9e23 100644 (file)
@@ -254,28 +254,16 @@ enum x86_intercept_stage;
        KVM_GUESTDBG_INJECT_DB | \
        KVM_GUESTDBG_BLOCKIRQ)
 
-
-#define PFERR_PRESENT_BIT 0
-#define PFERR_WRITE_BIT 1
-#define PFERR_USER_BIT 2
-#define PFERR_RSVD_BIT 3
-#define PFERR_FETCH_BIT 4
-#define PFERR_PK_BIT 5
-#define PFERR_SGX_BIT 15
-#define PFERR_GUEST_FINAL_BIT 32
-#define PFERR_GUEST_PAGE_BIT 33
-#define PFERR_IMPLICIT_ACCESS_BIT 48
-
-#define PFERR_PRESENT_MASK     BIT(PFERR_PRESENT_BIT)
-#define PFERR_WRITE_MASK       BIT(PFERR_WRITE_BIT)
-#define PFERR_USER_MASK                BIT(PFERR_USER_BIT)
-#define PFERR_RSVD_MASK                BIT(PFERR_RSVD_BIT)
-#define PFERR_FETCH_MASK       BIT(PFERR_FETCH_BIT)
-#define PFERR_PK_MASK          BIT(PFERR_PK_BIT)
-#define PFERR_SGX_MASK         BIT(PFERR_SGX_BIT)
-#define PFERR_GUEST_FINAL_MASK BIT_ULL(PFERR_GUEST_FINAL_BIT)
-#define PFERR_GUEST_PAGE_MASK  BIT_ULL(PFERR_GUEST_PAGE_BIT)
-#define PFERR_IMPLICIT_ACCESS  BIT_ULL(PFERR_IMPLICIT_ACCESS_BIT)
+#define PFERR_PRESENT_MASK     BIT(0)
+#define PFERR_WRITE_MASK       BIT(1)
+#define PFERR_USER_MASK                BIT(2)
+#define PFERR_RSVD_MASK                BIT(3)
+#define PFERR_FETCH_MASK       BIT(4)
+#define PFERR_PK_MASK          BIT(5)
+#define PFERR_SGX_MASK         BIT(15)
+#define PFERR_GUEST_FINAL_MASK BIT_ULL(32)
+#define PFERR_GUEST_PAGE_MASK  BIT_ULL(33)
+#define PFERR_IMPLICIT_ACCESS  BIT_ULL(48)
 
 #define PFERR_NESTED_GUEST_PAGE (PFERR_GUEST_PAGE_MASK |       \
                                 PFERR_WRITE_MASK |             \
index 60f21bb4c27b196d7da820a304771b31b700899f..2343c9f00e318a0d2e9971b146a414c35b997421 100644 (file)
@@ -213,7 +213,7 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
         */
        u64 implicit_access = access & PFERR_IMPLICIT_ACCESS;
        bool not_smap = ((rflags & X86_EFLAGS_AC) | implicit_access) == X86_EFLAGS_AC;
-       int index = (pfec + (not_smap << PFERR_RSVD_BIT)) >> 1;
+       int index = (pfec | (not_smap ? PFERR_RSVD_MASK : 0)) >> 1;
        u32 errcode = PFERR_PRESENT_MASK;
        bool fault;
 
@@ -234,8 +234,7 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
                pkru_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));
+               offset = (pfec & ~1) | ((pte_access & PT_USER_MASK) ? PFERR_RSVD_MASK : 0);
 
                pkru_bits &= mmu->pkru_mask >> offset;
                errcode |= -pkru_bits & PFERR_PK_MASK;