Message ID | 20190319074340.11625-1-juergh@canonical.com |
---|---|
State | New |
Headers | show |
Series | [SRU,Bionic] ]PATCH] KVM: PPC: Book3S HV: Don't truncate HPTE index in xlate function | expand |
On 2019-03-19 08:43:40 , Juerg Haefliger wrote: > From: Paul Mackerras <paulus@ozlabs.org> > > BugLink: https://bugs.launchpad.net/bugs/1818645 > > 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@ozlabs.org> > (cherry picked from commit 46dec40fb741f00f1864580130779aeeaf24fb3d) > Signed-off-by: Juerg Haefliger <juergh@canonical.com> > --- > 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 ef243fed2f2b..00ae5384cf36 100644 > --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c > +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c > @@ -356,7 +356,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)) Acked-by: Khalid Elmously <khalid.elmously@canonical.com>
On 19.03.19 08:43, Juerg Haefliger wrote: > From: Paul Mackerras <paulus@ozlabs.org> > > BugLink: https://bugs.launchpad.net/bugs/1818645 > > 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@ozlabs.org> > (cherry picked from commit 46dec40fb741f00f1864580130779aeeaf24fb3d) > Signed-off-by: Juerg Haefliger <juergh@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> > --- > 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 ef243fed2f2b..00ae5384cf36 100644 > --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c > +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c > @@ -356,7 +356,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)) >
On 2019-03-19 08:43:40 , Juerg Haefliger wrote: > From: Paul Mackerras <paulus@ozlabs.org> > > BugLink: https://bugs.launchpad.net/bugs/1818645 > > 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@ozlabs.org> > (cherry picked from commit 46dec40fb741f00f1864580130779aeeaf24fb3d) > Signed-off-by: Juerg Haefliger <juergh@canonical.com> > --- > 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 ef243fed2f2b..00ae5384cf36 100644 > --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c > +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c > @@ -356,7 +356,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)) Acked-by: Khalid Elmously <khalid.elmously@canonical.com>
On 2019-03-19 08:43:40 , Juerg Haefliger wrote: > From: Paul Mackerras <paulus@ozlabs.org> > > BugLink: https://bugs.launchpad.net/bugs/1818645 > > 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@ozlabs.org> > (cherry picked from commit 46dec40fb741f00f1864580130779aeeaf24fb3d) > Signed-off-by: Juerg Haefliger <juergh@canonical.com> > --- > 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 ef243fed2f2b..00ae5384cf36 100644 > --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c > +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c > @@ -356,7 +356,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)) > -- > 2.19.1 > > > -- > kernel-team mailing list > kernel-team@lists.ubuntu.com > https://lists.ubuntu.com/mailman/listinfo/kernel-team
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index ef243fed2f2b..00ae5384cf36 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -356,7 +356,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))