aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2014-04-24 07:52:01 -0400
committerAlexander Graf <agraf@suse.de>2014-05-30 08:26:21 -0400
commitcd087eefe637d545345ea5f888d4ea4fe52e312c (patch)
tree69a6fcf03d10a7b329e84dae3e487d0dd5ae9756
parent5deb8e7ad8ac7e3fcdfa042acff617f461b361c2 (diff)
KVM: PPC: Book3S PR: Do dcbz32 patching with big endian instructions
When the host CPU we're running on doesn't support dcbz32 itself, but the guest wants to have dcbz only clear 32 bytes of data, we loop through every executable mapped page to search for dcbz instructions and patch them with a special privileged instruction that we emulate as dcbz32. The only guests that want to see dcbz act as 32byte are book3s_32 guests, so we don't have to worry about little endian instruction ordering. So let's just always search for big endian dcbz instructions, also when we're on a little endian host. Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--arch/powerpc/kvm/book3s_32_mmu.c2
-rw-r--r--arch/powerpc/kvm/book3s_pr.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 628d90ed417d..93503bbdae43 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -131,7 +131,7 @@ static hva_t kvmppc_mmu_book3s_32_get_pteg(struct kvm_vcpu *vcpu,
131 pteg = (vcpu_book3s->sdr1 & 0xffff0000) | hash; 131 pteg = (vcpu_book3s->sdr1 & 0xffff0000) | hash;
132 132
133 dprintk("MMU: pc=0x%lx eaddr=0x%lx sdr1=0x%llx pteg=0x%x vsid=0x%x\n", 133 dprintk("MMU: pc=0x%lx eaddr=0x%lx sdr1=0x%llx pteg=0x%x vsid=0x%x\n",
134 kvmppc_get_pc(&vcpu_book3s->vcpu), eaddr, vcpu_book3s->sdr1, pteg, 134 kvmppc_get_pc(vcpu), eaddr, vcpu_book3s->sdr1, pteg,
135 sr_vsid(sre)); 135 sr_vsid(sre));
136 136
137 r = gfn_to_hva(vcpu->kvm, pteg >> PAGE_SHIFT); 137 r = gfn_to_hva(vcpu->kvm, pteg >> PAGE_SHIFT);
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index d424ca053765..6e55934dda0a 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -428,8 +428,8 @@ static void kvmppc_patch_dcbz(struct kvm_vcpu *vcpu, struct kvmppc_pte *pte)
428 428
429 /* patch dcbz into reserved instruction, so we trap */ 429 /* patch dcbz into reserved instruction, so we trap */
430 for (i=hpage_offset; i < hpage_offset + (HW_PAGE_SIZE / 4); i++) 430 for (i=hpage_offset; i < hpage_offset + (HW_PAGE_SIZE / 4); i++)
431 if ((page[i] & 0xff0007ff) == INS_DCBZ) 431 if ((be32_to_cpu(page[i]) & 0xff0007ff) == INS_DCBZ)
432 page[i] &= 0xfffffff7; 432 page[i] &= cpu_to_be32(0xfffffff7);
433 433
434 kunmap_atomic(page); 434 kunmap_atomic(page);
435 put_page(hpage); 435 put_page(hpage);