KVM: arm64: Fix PAR_TO_HPFAR() to work independently of PA_BITS.
authorRyan Roberts <ryan.roberts@arm.com>
Thu, 3 Nov 2022 15:05:07 +0000 (15:05 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 10 Nov 2022 19:22:58 +0000 (19:22 +0000)
commita0d37784bfd7f699986ba3a64cfeb68a03cb7fd0
tree1380702642c680085dd768fab266fd4699b15355
parent579d7ebe90a332cc5b6c02db9250fd0816a64f63
KVM: arm64: Fix PAR_TO_HPFAR() to work independently of PA_BITS.

Kernel configs with PAGE_SIZE=64KB and PA_BITS=48 still advertise 52 bit
IPA space on HW that implements LPA. This is by design (admitedly this
is a very unlikely configuration in the real world).

However on such a config, attempting to create a vm with the guest
kernel placed above 48 bits in IPA space results in misbehaviour due to
the hypervisor incorrectly interpretting a faulting IPA.

Fix up PAR_TO_HPFAR() to always take 52 bits out of the PAR rather than
masking to CONFIG_ARM64_PA_BITS. If the system has a smaller implemented
PARange this should be safe because the bits are res0.

A more robust approach would be to discover the IPA size in use by the
page-table and mask based on that, to avoid relying on res0 reading back
as zero. But this information is difficult to access safely from the
code's location, so take the easy way out.

Fixes: bc1d7de8c550 ("kvm: arm64: Add 52bit support for PAR to HPFAR conversoin")
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
[maz: commit message fixes]
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221103150507.32948-3-ryan.roberts@arm.com
arch/arm64/include/asm/kvm_arm.h