Skip to content

Commit a0d3778

Browse files
Ryan RobertsMarc Zyngier
authored andcommitted
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: bc1d7de ("kvm: arm64: Add 52bit support for PAR to HPFAR conversoin") Signed-off-by: Ryan Roberts <[email protected]> [maz: commit message fixes] Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 579d7eb commit a0d3778

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

arch/arm64/include/asm/kvm_arm.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,13 @@
340340
* We have
341341
* PAR [PA_Shift - 1 : 12] = PA [PA_Shift - 1 : 12]
342342
* HPFAR [PA_Shift - 9 : 4] = FIPA [PA_Shift - 1 : 12]
343+
*
344+
* Always assume 52 bit PA since at this point, we don't know how many PA bits
345+
* the page table has been set up for. This should be safe since unused address
346+
* bits in PAR are res0.
343347
*/
344348
#define PAR_TO_HPFAR(par) \
345-
(((par) & GENMASK_ULL(PHYS_MASK_SHIFT - 1, 12)) >> 8)
349+
(((par) & GENMASK_ULL(52 - 1, 12)) >> 8)
346350

347351
#define ECN(x) { ESR_ELx_EC_##x, #x }
348352

0 commit comments

Comments
 (0)