aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_32_mmu.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2010-07-29 08:47:54 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:50:48 -0400
commite8508940a88691ad3d1c46608cd968eb4be9cbc5 (patch)
treec14d6cbc9c947cdbf69a255f04d44024a79ed6e6 /arch/powerpc/kvm/book3s_32_mmu.c
parentbeb03f14da9ceff76ff08cbb8af064b52dc21f7e (diff)
KVM: PPC: Magic Page Book3s support
We need to override EA as well as PA lookups for the magic page. When the guest tells us to project it, the magic page overrides any guest mappings. In order to reflect that, we need to hook into all the MMU layers of KVM to force map the magic page if necessary. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm/book3s_32_mmu.c')
-rw-r--r--arch/powerpc/kvm/book3s_32_mmu.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 449bce5f021a..a7d121adc842 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -281,8 +281,24 @@ static int kvmppc_mmu_book3s_32_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
281 struct kvmppc_pte *pte, bool data) 281 struct kvmppc_pte *pte, bool data)
282{ 282{
283 int r; 283 int r;
284 ulong mp_ea = vcpu->arch.magic_page_ea;
284 285
285 pte->eaddr = eaddr; 286 pte->eaddr = eaddr;
287
288 /* Magic page override */
289 if (unlikely(mp_ea) &&
290 unlikely((eaddr & ~0xfffULL) == (mp_ea & ~0xfffULL)) &&
291 !(vcpu->arch.shared->msr & MSR_PR)) {
292 pte->vpage = kvmppc_mmu_book3s_32_ea_to_vp(vcpu, eaddr, data);
293 pte->raddr = vcpu->arch.magic_page_pa | (pte->raddr & 0xfff);
294 pte->raddr &= KVM_PAM;
295 pte->may_execute = true;
296 pte->may_read = true;
297 pte->may_write = true;
298
299 return 0;
300 }
301
286 r = kvmppc_mmu_book3s_32_xlate_bat(vcpu, eaddr, pte, data); 302 r = kvmppc_mmu_book3s_32_xlate_bat(vcpu, eaddr, pte, data);
287 if (r < 0) 303 if (r < 0)
288 r = kvmppc_mmu_book3s_32_xlate_pte(vcpu, eaddr, pte, data, true); 304 r = kvmppc_mmu_book3s_32_xlate_pte(vcpu, eaddr, pte, data, true);