Message ID | 1346744187-31226-1-git-send-email-aik@ozlabs.ru |
---|---|
State | New, archived |
Headers | show |
On 04.09.2012, at 09:36, Alexey Kardashevskiy wrote: > From: Paul Mackerras <paulus@samba.org> > > TODO: ask Paul to make a proper message. TODO? Also, Ben or Paul, please ack if you think it's correct. Alex > > This is the fix for a host kernel compiled with a page size > other than 4K (TCE page size). In the case of a 64K page size, > the host used to lose address bits in hpte_rpn(). > The patch fixes it. > > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > --- > arch/powerpc/kvm/book3s_64_mmu_hv.c | 9 ++++----- > 1 file changed, 4 insertions(+), 5 deletions(-) > > diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c > index 80a5775..a41f11b 100644 > --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c > +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c > @@ -503,7 +503,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, > struct kvm *kvm = vcpu->kvm; > unsigned long *hptep, hpte[3], r; > unsigned long mmu_seq, psize, pte_size; > - unsigned long gfn, hva, pfn; > + unsigned long gpa, gfn, hva, pfn; > struct kvm_memory_slot *memslot; > unsigned long *rmap; > struct revmap_entry *rev; > @@ -541,15 +541,14 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, > > /* Translate the logical address and get the page */ > psize = hpte_page_size(hpte[0], r); > - gfn = hpte_rpn(r, psize); > + gpa = (r & HPTE_R_RPN & ~(psize - 1)) | (ea & (psize - 1)); > + gfn = gpa >> PAGE_SHIFT; > memslot = gfn_to_memslot(kvm, gfn); > > /* No memslot means it's an emulated MMIO region */ > - if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) { > - unsigned long gpa = (gfn << PAGE_SHIFT) | (ea & (psize - 1)); > + if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) > return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea, > dsisr & DSISR_ISSTORE); > - } > > if (!kvm->arch.using_mmu_notifiers) > return -EFAULT; /* should never get here */ > -- > 1.7.10.4 > > -- > To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 80a5775..a41f11b 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -503,7 +503,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, struct kvm *kvm = vcpu->kvm; unsigned long *hptep, hpte[3], r; unsigned long mmu_seq, psize, pte_size; - unsigned long gfn, hva, pfn; + unsigned long gpa, gfn, hva, pfn; struct kvm_memory_slot *memslot; unsigned long *rmap; struct revmap_entry *rev; @@ -541,15 +541,14 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, /* Translate the logical address and get the page */ psize = hpte_page_size(hpte[0], r); - gfn = hpte_rpn(r, psize); + gpa = (r & HPTE_R_RPN & ~(psize - 1)) | (ea & (psize - 1)); + gfn = gpa >> PAGE_SHIFT; memslot = gfn_to_memslot(kvm, gfn); /* No memslot means it's an emulated MMIO region */ - if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) { - unsigned long gpa = (gfn << PAGE_SHIFT) | (ea & (psize - 1)); + if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea, dsisr & DSISR_ISSTORE); - } if (!kvm->arch.using_mmu_notifiers) return -EFAULT; /* should never get here */