Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: PPC: Interpret SDR1 as HVA in PAPR mode

When running a PAPR guest, the guest is not allowed to set SDR1 - instead
the HTAB information is held in internal hypervisor structures. But all of
our current code relies on SDR1 and walking the HTAB like on real hardware.

So in order to not be too intrusive, we simply set SDR1 to the HTAB we hold
in host memory. That way we can keep the HTAB in user space, but use it from
kernel space to map the guest.

Signed-off-by: Alexander Graf <agraf@suse.de>

authored by

Alexander Graf and committed by
Avi Kivity
04fcc11b 317a8fa3

+7 -1
+7 -1
arch/powerpc/kvm/book3s_64_mmu.c
··· 128 128 dprintk("MMU: page=0x%x sdr1=0x%llx pteg=0x%llx vsid=0x%llx\n", 129 129 page, vcpu_book3s->sdr1, pteg, slbe->vsid); 130 130 131 - r = gfn_to_hva(vcpu_book3s->vcpu.kvm, pteg >> PAGE_SHIFT); 131 + /* When running a PAPR guest, SDR1 contains a HVA address instead 132 + of a GPA */ 133 + if (vcpu_book3s->vcpu.arch.papr_enabled) 134 + r = pteg; 135 + else 136 + r = gfn_to_hva(vcpu_book3s->vcpu.kvm, pteg >> PAGE_SHIFT); 137 + 132 138 if (kvm_is_error_hva(r)) 133 139 return r; 134 140 return r | (pteg & ~PAGE_MASK);