| From: Paul Mackerras <paulus@ozlabs.org> |
| Date: Mon, 20 Aug 2018 16:05:45 +1000 |
| Subject: KVM: PPC: Book3S HV: Don't truncate HPTE index in xlate function |
| |
| commit 46dec40fb741f00f1864580130779aeeaf24fb3d upstream. |
| |
| 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> |
| [bwh: Backported to 3.16: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/powerpc/kvm/book3s_64_mmu_hv.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c |
| +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c |
| @@ -451,7 +451,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate |
| unsigned long pp, key; |
| unsigned long v, gr; |
| unsigned long *hptep; |
| - int index; |
| + long int index; |
| int virtmode = vcpu->arch.shregs.msr & (data ? MSR_DR : MSR_IR); |
| |
| /* Get SLB entry */ |