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