On Mon, Aug 20, 2018 at 04:06:59PM +1000, Paul Mackerras wrote: > This fixes a bug which causes guest virtual addresses to get translated > to guest real addresses incorrectly when the guest is using the HPT MMU > and has more than 256GB of RAM, or more specifically has a HPT larger > than 2GB. This has showed up in testing as a failure of the host to > emulate doorbell instructions correctly on POWER9 for HPT guests with > more than 256GB of RAM. > > The bug is that the HPTE index in kvmppc_mmu_book3s_64_hv_xlate() > is stored as an int, and in forming the HPTE address, the index gets > shifted left 4 bits as an int before being signed-extended to 64 bits. > The simple fix is to make the variable a long int, matching the > return type of kvmppc_hv_find_lock_hpte(), which is what calculates > the index. > > Fixes: 697d3899dcb4 ("KVM: PPC: Implement MMIO emulation support for Book3S HV guests") > Signed-off-by: Paul Mackerras <paulus@xxxxxxxxxx> Reviewed-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> Unfortunately I haven't been able to get a hold of POWER9 time to test it yet, still working on it. > --- > arch/powerpc/kvm/book3s_64_mmu_hv.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c > index 7f3a8cf..4c08f42 100644 > --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c > +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c > @@ -359,7 +359,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, > unsigned long pp, key; > unsigned long v, orig_v, gr; > __be64 *hptep; > - int index; > + long int index; > int virtmode = vcpu->arch.shregs.msr & (data ? MSR_DR : MSR_IR); > > if (kvm_is_radix(vcpu->kvm)) -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature