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

Commit d41d1895 authored by Joerg Roedel's avatar Joerg Roedel Committed by Avi Kivity
Browse files

KVM: MMU: Introduce kvm_pdptr_read_mmu



This function is implemented to load the pdptr pointers of
the currently running guest (l1 or l2 guest). Therefore it
takes care about the current paging mode and can read pdptrs
out of l2 guest physical memory.

Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent ff03a073
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -45,6 +45,13 @@ static inline u64 kvm_pdptr_read(struct kvm_vcpu *vcpu, int index)
	return vcpu->arch.walk_mmu->pdptrs[index];
	return vcpu->arch.walk_mmu->pdptrs[index];
}
}


static inline u64 kvm_pdptr_read_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, int index)
{
	load_pdptrs(vcpu, mmu, mmu->get_cr3(vcpu));

	return mmu->pdptrs[index];
}

static inline ulong kvm_read_cr0_bits(struct kvm_vcpu *vcpu, ulong mask)
static inline ulong kvm_read_cr0_bits(struct kvm_vcpu *vcpu, ulong mask)
{
{
	ulong tmask = mask & KVM_POSSIBLE_CR0_GUEST_BITS;
	ulong tmask = mask & KVM_POSSIBLE_CR0_GUEST_BITS;
+1 −1
Original line number Original line Diff line number Diff line
@@ -2398,7 +2398,7 @@ static int mmu_alloc_roots(struct kvm_vcpu *vcpu)


		ASSERT(!VALID_PAGE(root));
		ASSERT(!VALID_PAGE(root));
		if (vcpu->arch.mmu.root_level == PT32E_ROOT_LEVEL) {
		if (vcpu->arch.mmu.root_level == PT32E_ROOT_LEVEL) {
			pdptr = kvm_pdptr_read(vcpu, i);
			pdptr = kvm_pdptr_read_mmu(vcpu, &vcpu->arch.mmu, i);
			if (!is_present_gpte(pdptr)) {
			if (!is_present_gpte(pdptr)) {
				vcpu->arch.mmu.pae_root[i] = 0;
				vcpu->arch.mmu.pae_root[i] = 0;
				continue;
				continue;
+1 −1
Original line number Original line Diff line number Diff line
@@ -137,7 +137,7 @@ walk:


#if PTTYPE == 64
#if PTTYPE == 64
	if (walker->level == PT32E_ROOT_LEVEL) {
	if (walker->level == PT32E_ROOT_LEVEL) {
		pte = kvm_pdptr_read(vcpu, (addr >> 30) & 3);
		pte = kvm_pdptr_read_mmu(vcpu, mmu, (addr >> 30) & 3);
		trace_kvm_mmu_paging_element(pte, walker->level);
		trace_kvm_mmu_paging_element(pte, walker->level);
		if (!is_present_gpte(pte)) {
		if (!is_present_gpte(pte)) {
			present = false;
			present = false;