Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ceee7df7 authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Paolo Bonzini
Browse files

KVM: MMU: fix smap permission check



Current permission check assumes that RSVD bit in PFEC is always zero,
however, it is not true since MMIO #PF will use it to quickly identify
MMIO access

Fix it by clearing the bit if walking guest page table is needed

Signed-off-by: default avatarXiao Guangrong <guangrong.xiao@linux.intel.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent a4cca3b4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -166,6 +166,8 @@ static inline bool permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
	int index = (pfec >> 1) +
		    (smap >> (X86_EFLAGS_AC_BIT - PFERR_RSVD_BIT + 1));

	WARN_ON(pfec & PFERR_RSVD_MASK);

	return (mmu->permissions[index] >> pte_access) & 1;
}

+7 −0
Original line number Diff line number Diff line
@@ -718,6 +718,13 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,
					      mmu_is_nested(vcpu));
		if (likely(r != RET_MMIO_PF_INVALID))
			return r;

		/*
		 * page fault with PFEC.RSVD  = 1 is caused by shadow
		 * page fault, should not be used to walk guest page
		 * table.
		 */
		error_code &= ~PFERR_RSVD_MASK;
	};

	r = mmu_topup_memory_caches(vcpu);