aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_32_mmu.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2014-04-24 06:51:44 -0400
committerAlexander Graf <agraf@suse.de>2014-05-30 08:26:19 -0400
commit860540bc50a174c2dff5e11821375475a5da5f4e (patch)
tree69ac545a7e426de358e7fcba81f187f9aeab7d86 /arch/powerpc/kvm/book3s_32_mmu.c
parent740f834eb2505e1883b54cfc1644af80834ab6b6 (diff)
KVM: PPC: Book3S_32: PR: Access HTAB in big endian
The HTAB is always big endian. We access the guest's HTAB using copy_from/to_user, but don't yet take care of the fact that we might be running on an LE host. Wrap all accesses to the guest HTAB with big endian accessors. Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm/book3s_32_mmu.c')
-rw-r--r--arch/powerpc/kvm/book3s_32_mmu.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 60fc3f4de25f..0e42b167da0b 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -208,6 +208,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
208 u32 sre; 208 u32 sre;
209 hva_t ptegp; 209 hva_t ptegp;
210 u32 pteg[16]; 210 u32 pteg[16];
211 u32 pte0, pte1;
211 u32 ptem = 0; 212 u32 ptem = 0;
212 int i; 213 int i;
213 int found = 0; 214 int found = 0;
@@ -233,11 +234,13 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
233 } 234 }
234 235
235 for (i=0; i<16; i+=2) { 236 for (i=0; i<16; i+=2) {
236 if (ptem == pteg[i]) { 237 pte0 = be32_to_cpu(pteg[i]);
238 pte1 = be32_to_cpu(pteg[i + 1]);
239 if (ptem == pte0) {
237 u8 pp; 240 u8 pp;
238 241
239 pte->raddr = (pteg[i+1] & ~(0xFFFULL)) | (eaddr & 0xFFF); 242 pte->raddr = (pte1 & ~(0xFFFULL)) | (eaddr & 0xFFF);
240 pp = pteg[i+1] & 3; 243 pp = pte1 & 3;
241 244
242 if ((sr_kp(sre) && (vcpu->arch.shared->msr & MSR_PR)) || 245 if ((sr_kp(sre) && (vcpu->arch.shared->msr & MSR_PR)) ||
243 (sr_ks(sre) && !(vcpu->arch.shared->msr & MSR_PR))) 246 (sr_ks(sre) && !(vcpu->arch.shared->msr & MSR_PR)))
@@ -260,7 +263,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
260 } 263 }
261 264
262 dprintk_pte("MMU: Found PTE -> %x %x - %x\n", 265 dprintk_pte("MMU: Found PTE -> %x %x - %x\n",
263 pteg[i], pteg[i+1], pp); 266 pte0, pte1, pp);
264 found = 1; 267 found = 1;
265 break; 268 break;
266 } 269 }
@@ -269,7 +272,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
269 /* Update PTE C and A bits, so the guest's swapper knows we used the 272 /* Update PTE C and A bits, so the guest's swapper knows we used the
270 page */ 273 page */
271 if (found) { 274 if (found) {
272 u32 pte_r = pteg[i+1]; 275 u32 pte_r = pte1;
273 char __user *addr = (char __user *) (ptegp + (i+1) * sizeof(u32)); 276 char __user *addr = (char __user *) (ptegp + (i+1) * sizeof(u32));
274 277
275 /* 278 /*
@@ -296,7 +299,8 @@ no_page_found:
296 to_book3s(vcpu)->sdr1, ptegp); 299 to_book3s(vcpu)->sdr1, ptegp);
297 for (i=0; i<16; i+=2) { 300 for (i=0; i<16; i+=2) {
298 dprintk_pte(" %02d: 0x%x - 0x%x (0x%x)\n", 301 dprintk_pte(" %02d: 0x%x - 0x%x (0x%x)\n",
299 i, pteg[i], pteg[i+1], ptem); 302 i, be32_to_cpu(pteg[i]),
303 be32_to_cpu(pteg[i+1]), ptem);
300 } 304 }
301 } 305 }
302 306