KVM: PPC: Book3S PR: Invalidate SLB entries properly
At present, if the guest creates a valid SLB (segment lookaside buffer) entry with the slbmte instruction, then invalidates it with the slbie instruction, then reads the entry with the slbmfee/slbmfev instructions, the result of the slbmfee will have the valid bit set, even though the entry is not actually considered valid by the host. This is confusing, if not worse. This fixes it by zeroing out the orige and origv fields of the SLB entry structure when the entry is invalidated. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Родитель
0f296829b5
Коммит
681562cd56
|
@ -397,6 +397,8 @@ static void kvmppc_mmu_book3s_64_slbie(struct kvm_vcpu *vcpu, u64 ea)
|
|||
dprintk("KVM MMU: slbie(0x%llx, 0x%llx)\n", ea, slbe->esid);
|
||||
|
||||
slbe->valid = false;
|
||||
slbe->orige = 0;
|
||||
slbe->origv = 0;
|
||||
|
||||
seg_size = 1ull << kvmppc_slb_sid_shift(slbe);
|
||||
kvmppc_mmu_flush_segment(vcpu, ea & ~(seg_size - 1), seg_size);
|
||||
|
@ -408,8 +410,11 @@ static void kvmppc_mmu_book3s_64_slbia(struct kvm_vcpu *vcpu)
|
|||
|
||||
dprintk("KVM MMU: slbia()\n");
|
||||
|
||||
for (i = 1; i < vcpu->arch.slb_nr; i++)
|
||||
for (i = 1; i < vcpu->arch.slb_nr; i++) {
|
||||
vcpu->arch.slb[i].valid = false;
|
||||
vcpu->arch.slb[i].orige = 0;
|
||||
vcpu->arch.slb[i].origv = 0;
|
||||
}
|
||||
|
||||
if (vcpu->arch.shared->msr & MSR_IR) {
|
||||
kvmppc_mmu_flush_segments(vcpu);
|
||||
|
|
Загрузка…
Ссылка в новой задаче