]> Git Repo - J-linux.git/commitdiff
KVM: arm64: Do not allow ID_AA64MMFR0_EL1.ASIDbits to be overridden
authorMarc Zyngier <[email protected]>
Tue, 3 Dec 2024 19:02:36 +0000 (19:02 +0000)
committerOliver Upton <[email protected]>
Wed, 4 Dec 2024 00:21:08 +0000 (16:21 -0800)
Catalin reports that a hypervisor lying to a guest about the size
of the ASID field may result in unexpected issues:

- if the underlying HW does only supports 8 bit ASIDs, the ASID
  field in a TLBI VAE1* operation is only 8 bits, and the HW will
  ignore the other 8 bits

- if on the contrary the HW is 16 bit capable, the ASID field
  in the same TLBI operation is always 16 bits, irrespective of
  the value of TCR_ELx.AS.

This could lead to missed invalidations if the guest was lead to
assume that the HW had 8 bit ASIDs while they really are 16 bit wide.

In order to avoid any potential disaster that would be hard to debug,
prenent the migration between a host with 8 bit ASIDs to one with
wider ASIDs (the converse was obviously always forbidden). This is
also consistent with what we already do for VMIDs.

If it becomes absolutely mandatory to support such a migration path
in the future, we will have to trap and emulate all TLBIs, something
that nobody should look forward to.

Fixes: d5a32b60dc18 ("KVM: arm64: Allow userspace to change ID_AA64MMFR{0-2}_EL1")
Reported-by: Catalin Marinas <[email protected]>
Signed-off-by: Marc Zyngier <[email protected]>
Cc: [email protected]
Cc: Will Deacon <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Marc Zyngier <[email protected]>
Cc: James Morse <[email protected]>
Cc: Oliver Upton <[email protected]>
Acked-by: Catalin Marinas <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Oliver Upton <[email protected]>
arch/arm64/kvm/sys_regs.c

index 83c6b4a07ef56cf0ed9c8751ec80686f45dca6b2..e2a5c2918d9e5af9ee8526dce221d6e80c292d03 100644 (file)
@@ -2618,7 +2618,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        ID_WRITABLE(ID_AA64MMFR0_EL1, ~(ID_AA64MMFR0_EL1_RES0 |
                                        ID_AA64MMFR0_EL1_TGRAN4_2 |
                                        ID_AA64MMFR0_EL1_TGRAN64_2 |
-                                       ID_AA64MMFR0_EL1_TGRAN16_2)),
+                                       ID_AA64MMFR0_EL1_TGRAN16_2 |
+                                       ID_AA64MMFR0_EL1_ASIDBITS)),
        ID_WRITABLE(ID_AA64MMFR1_EL1, ~(ID_AA64MMFR1_EL1_RES0 |
                                        ID_AA64MMFR1_EL1_HCX |
                                        ID_AA64MMFR1_EL1_TWED |
This page took 0.060123 seconds and 4 git commands to generate.