diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_32_mmu.c')
-rw-r--r-- | arch/powerpc/kvm/book3s_32_mmu.c | 16 |
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 | ||