aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
-rw-r--r--arch/powerpc/kvm/book3s.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index f66de7e518f7..397701d39ae7 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -148,16 +148,8 @@ void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr)
148 } 148 }
149 } 149 }
150 150
151 if (((vcpu->arch.msr & (MSR_IR|MSR_DR)) != (old_msr & (MSR_IR|MSR_DR))) || 151 if ((vcpu->arch.msr & (MSR_PR|MSR_IR|MSR_DR)) !=
152 (vcpu->arch.msr & MSR_PR) != (old_msr & MSR_PR)) { 152 (old_msr & (MSR_PR|MSR_IR|MSR_DR))) {
153 bool dr = (vcpu->arch.msr & MSR_DR) ? true : false;
154 bool ir = (vcpu->arch.msr & MSR_IR) ? true : false;
155
156 /* Flush split mode PTEs */
157 if (dr != ir)
158 kvmppc_mmu_pte_vflush(vcpu, VSID_SPLIT_MASK,
159 VSID_SPLIT_MASK);
160
161 kvmppc_mmu_flush_segments(vcpu); 153 kvmppc_mmu_flush_segments(vcpu);
162 kvmppc_mmu_map_segment(vcpu, kvmppc_get_pc(vcpu)); 154 kvmppc_mmu_map_segment(vcpu, kvmppc_get_pc(vcpu));
163 } 155 }
@@ -535,6 +527,7 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
535 bool is_mmio = false; 527 bool is_mmio = false;
536 bool dr = (vcpu->arch.msr & MSR_DR) ? true : false; 528 bool dr = (vcpu->arch.msr & MSR_DR) ? true : false;
537 bool ir = (vcpu->arch.msr & MSR_IR) ? true : false; 529 bool ir = (vcpu->arch.msr & MSR_IR) ? true : false;
530 u64 vsid;
538 531
539 relocated = data ? dr : ir; 532 relocated = data ? dr : ir;
540 533
@@ -552,13 +545,20 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
552 545
553 switch (vcpu->arch.msr & (MSR_DR|MSR_IR)) { 546 switch (vcpu->arch.msr & (MSR_DR|MSR_IR)) {
554 case 0: 547 case 0:
555 pte.vpage |= VSID_REAL; 548 pte.vpage |= ((u64)VSID_REAL << (SID_SHIFT - 12));
556 break; 549 break;
557 case MSR_DR: 550 case MSR_DR:
558 pte.vpage |= VSID_REAL_DR;
559 break;
560 case MSR_IR: 551 case MSR_IR:
561 pte.vpage |= VSID_REAL_IR; 552 vcpu->arch.mmu.esid_to_vsid(vcpu, eaddr >> SID_SHIFT, &vsid);
553
554 if ((vcpu->arch.msr & (MSR_DR|MSR_IR)) == MSR_DR)
555 pte.vpage |= ((u64)VSID_REAL_DR << (SID_SHIFT - 12));
556 else
557 pte.vpage |= ((u64)VSID_REAL_IR << (SID_SHIFT - 12));
558 pte.vpage |= vsid;
559
560 if (vsid == -1)
561 page_found = -EINVAL;
562 break; 562 break;
563 } 563 }
564 564