KVM: PPC: Book3S HV: Don't truncate HPTE index in xlate function
Subsystems (2)
PATCH 1/1 KVM: PPC: Book3S HV: Don't truncate HPTE index in xlate function
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.
--- arch/powerpc/kvm/book3s_64_mmu_hv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kvm/book3s_64_mmu_hv.c +1 -1
@@ -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))
Signature · 1 line
2.7.4
Quoted 14 lines · Paul Mackerras
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 ofkvmppc_hv_find_lock_hpte(), which is what calculates the index.
Quoted 2 lines
Fixes 697d3899dcb4 ("KVM: PPC: Implement MMIO emulation support for Book3S HV guests")Signed-off-by Paul Mackerras <[email protected]>
Unfortunately I haven't been able to get a hold of POWER9 time to test it yet, still working on it.
Quoted 17 lines
--- arch/powerpc/kvm/book3s_64_mmu_hv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)arch/powerpc/kvm/book3s_64_mmu_hv.c +1
-1@@ -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))
Signature · 4 lines
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