aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/mmu.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm/mmu.h')
-rw-r--r--arch/x86/kvm/mmu.h9
1 files changed, 4 insertions, 5 deletions
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h
index b70df72e2b33..66b33b96a31b 100644
--- a/arch/x86/kvm/mmu.h
+++ b/arch/x86/kvm/mmu.h
@@ -173,10 +173,9 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
173 int index = (pfec >> 1) + 173 int index = (pfec >> 1) +
174 (smap >> (X86_EFLAGS_AC_BIT - PFERR_RSVD_BIT + 1)); 174 (smap >> (X86_EFLAGS_AC_BIT - PFERR_RSVD_BIT + 1));
175 bool fault = (mmu->permissions[index] >> pte_access) & 1; 175 bool fault = (mmu->permissions[index] >> pte_access) & 1;
176 u32 errcode = PFERR_PRESENT_MASK;
176 177
177 WARN_ON(pfec & (PFERR_PK_MASK | PFERR_RSVD_MASK)); 178 WARN_ON(pfec & (PFERR_PK_MASK | PFERR_RSVD_MASK));
178 pfec |= PFERR_PRESENT_MASK;
179
180 if (unlikely(mmu->pkru_mask)) { 179 if (unlikely(mmu->pkru_mask)) {
181 u32 pkru_bits, offset; 180 u32 pkru_bits, offset;
182 181
@@ -189,15 +188,15 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
189 pkru_bits = (kvm_read_pkru(vcpu) >> (pte_pkey * 2)) & 3; 188 pkru_bits = (kvm_read_pkru(vcpu) >> (pte_pkey * 2)) & 3;
190 189
191 /* clear present bit, replace PFEC.RSVD with ACC_USER_MASK. */ 190 /* clear present bit, replace PFEC.RSVD with ACC_USER_MASK. */
192 offset = pfec - 1 + 191 offset = (pfec & ~1) +
193 ((pte_access & PT_USER_MASK) << (PFERR_RSVD_BIT - PT_USER_SHIFT)); 192 ((pte_access & PT_USER_MASK) << (PFERR_RSVD_BIT - PT_USER_SHIFT));
194 193
195 pkru_bits &= mmu->pkru_mask >> offset; 194 pkru_bits &= mmu->pkru_mask >> offset;
196 pfec |= -pkru_bits & PFERR_PK_MASK; 195 errcode |= -pkru_bits & PFERR_PK_MASK;
197 fault |= (pkru_bits != 0); 196 fault |= (pkru_bits != 0);
198 } 197 }
199 198
200 return -(uint32_t)fault & pfec; 199 return -(u32)fault & errcode;
201} 200}
202 201
203void kvm_mmu_invalidate_zap_all_pages(struct kvm *kvm); 202void kvm_mmu_invalidate_zap_all_pages(struct kvm *kvm);