diff options
Diffstat (limited to 'arch/x86/kvm/mmu.h')
-rw-r--r-- | arch/x86/kvm/mmu.h | 9 |
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 | ||
203 | void kvm_mmu_invalidate_zap_all_pages(struct kvm *kvm); | 202 | void kvm_mmu_invalidate_zap_all_pages(struct kvm *kvm); |