[PATCH v3 03/42] arm64: sysreg: Add layout for HCR_EL2
Joey Gouly
joey.gouly at arm.com
Tue Apr 29 07:02:04 PDT 2025
On Sat, Apr 26, 2025 at 01:27:57PM +0100, Marc Zyngier wrote:
> Add HCR_EL2 to the sysreg file, more or less directly generated
> from the JSON file.
>
> Since the generated names significantly differ from the existing
> naming, express the old names in terms of the new one. One day, we'll
> fix this mess, but I'm not in any hurry.
>
> Signed-off-by: Marc Zyngier <maz at kernel.org>
> ---
> arch/arm64/include/asm/kvm_arm.h | 125 ++++++++++++++++---------------
> arch/arm64/tools/sysreg | 68 +++++++++++++++++
> 2 files changed, 132 insertions(+), 61 deletions(-)
>
> diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
> index 974d72b5905b8..f36d067967c33 100644
> --- a/arch/arm64/include/asm/kvm_arm.h
> +++ b/arch/arm64/include/asm/kvm_arm.h
> @@ -12,67 +12,70 @@
> #include <asm/sysreg.h>
> #include <asm/types.h>
>
> -/* Hyp Configuration Register (HCR) bits */
> -
> -#define HCR_TID5 (UL(1) << 58)
> -#define HCR_DCT (UL(1) << 57)
> -#define HCR_ATA_SHIFT 56
> -#define HCR_ATA (UL(1) << HCR_ATA_SHIFT)
> -#define HCR_TTLBOS (UL(1) << 55)
> -#define HCR_TTLBIS (UL(1) << 54)
> -#define HCR_ENSCXT (UL(1) << 53)
> -#define HCR_TOCU (UL(1) << 52)
> -#define HCR_AMVOFFEN (UL(1) << 51)
> -#define HCR_TICAB (UL(1) << 50)
> -#define HCR_TID4 (UL(1) << 49)
> -#define HCR_FIEN (UL(1) << 47)
> -#define HCR_FWB (UL(1) << 46)
> -#define HCR_NV2 (UL(1) << 45)
> -#define HCR_AT (UL(1) << 44)
> -#define HCR_NV1 (UL(1) << 43)
> -#define HCR_NV (UL(1) << 42)
> -#define HCR_API (UL(1) << 41)
> -#define HCR_APK (UL(1) << 40)
> -#define HCR_TEA (UL(1) << 37)
> -#define HCR_TERR (UL(1) << 36)
> -#define HCR_TLOR (UL(1) << 35)
> -#define HCR_E2H (UL(1) << 34)
> -#define HCR_ID (UL(1) << 33)
> -#define HCR_CD (UL(1) << 32)
> -#define HCR_RW_SHIFT 31
> -#define HCR_RW (UL(1) << HCR_RW_SHIFT)
> -#define HCR_TRVM (UL(1) << 30)
> -#define HCR_HCD (UL(1) << 29)
> -#define HCR_TDZ (UL(1) << 28)
> -#define HCR_TGE (UL(1) << 27)
> -#define HCR_TVM (UL(1) << 26)
> -#define HCR_TTLB (UL(1) << 25)
> -#define HCR_TPU (UL(1) << 24)
> -#define HCR_TPC (UL(1) << 23) /* HCR_TPCP if FEAT_DPB */
> -#define HCR_TSW (UL(1) << 22)
> -#define HCR_TACR (UL(1) << 21)
> -#define HCR_TIDCP (UL(1) << 20)
> -#define HCR_TSC (UL(1) << 19)
> -#define HCR_TID3 (UL(1) << 18)
> -#define HCR_TID2 (UL(1) << 17)
> -#define HCR_TID1 (UL(1) << 16)
> -#define HCR_TID0 (UL(1) << 15)
> -#define HCR_TWE (UL(1) << 14)
> -#define HCR_TWI (UL(1) << 13)
> -#define HCR_DC (UL(1) << 12)
> -#define HCR_BSU (3 << 10)
> -#define HCR_BSU_IS (UL(1) << 10)
> -#define HCR_FB (UL(1) << 9)
> -#define HCR_VSE (UL(1) << 8)
> -#define HCR_VI (UL(1) << 7)
> -#define HCR_VF (UL(1) << 6)
> -#define HCR_AMO (UL(1) << 5)
> -#define HCR_IMO (UL(1) << 4)
> -#define HCR_FMO (UL(1) << 3)
> -#define HCR_PTW (UL(1) << 2)
> -#define HCR_SWIO (UL(1) << 1)
> -#define HCR_VM (UL(1) << 0)
> -#define HCR_RES0 ((UL(1) << 48) | (UL(1) << 39))
> +/*
> + * Because I'm terribly lazy and that repainting the whole of the KVM
> + * code with the proper names is a pain, use a helper to map the names
> + * inherited from AArch32 with the new fancy nomenclature. One day...
> + */
> +#define __HCR(x) HCR_EL2_##x
> +
> +#define HCR_TID5 __HCR(TID5)
> +#define HCR_DCT __HCR(DCT)
> +#define HCR_ATA_SHIFT __HCR(ATA_SHIFT)
> +#define HCR_ATA __HCR(ATA)
> +#define HCR_TTLBOS __HCR(TTLBOS)
> +#define HCR_TTLBIS __HCR(TTLBIS)
> +#define HCR_ENSCXT __HCR(EnSCXT)
> +#define HCR_TOCU __HCR(TOCU)
> +#define HCR_AMVOFFEN __HCR(AMVOFFEN)
> +#define HCR_TICAB __HCR(TICAB)
> +#define HCR_TID4 __HCR(TID4)
> +#define HCR_FIEN __HCR(FIEN)
> +#define HCR_FWB __HCR(FWB)
> +#define HCR_NV2 __HCR(NV2)
> +#define HCR_AT __HCR(AT)
> +#define HCR_NV1 __HCR(NV1)
> +#define HCR_NV __HCR(NV)
> +#define HCR_API __HCR(API)
> +#define HCR_APK __HCR(APK)
> +#define HCR_TEA __HCR(TEA)
> +#define HCR_TERR __HCR(TERR)
> +#define HCR_TLOR __HCR(TLOR)
> +#define HCR_E2H __HCR(E2H)
> +#define HCR_ID __HCR(ID)
> +#define HCR_CD __HCR(CD)
> +#define HCR_RW __HCR(RW)
> +#define HCR_TRVM __HCR(TRVM)
> +#define HCR_HCD __HCR(HCD)
> +#define HCR_TDZ __HCR(TDZ)
> +#define HCR_TGE __HCR(TGE)
> +#define HCR_TVM __HCR(TVM)
> +#define HCR_TTLB __HCR(TTLB)
> +#define HCR_TPU __HCR(TPU)
> +#define HCR_TPC __HCR(TPCP)
> +#define HCR_TSW __HCR(TSW)
> +#define HCR_TACR __HCR(TACR)
> +#define HCR_TIDCP __HCR(TIDCP)
> +#define HCR_TSC __HCR(TSC)
> +#define HCR_TID3 __HCR(TID3)
> +#define HCR_TID2 __HCR(TID2)
> +#define HCR_TID1 __HCR(TID1)
> +#define HCR_TID0 __HCR(TID0)
> +#define HCR_TWE __HCR(TWE)
> +#define HCR_TWI __HCR(TWI)
> +#define HCR_DC __HCR(DC)
> +#define HCR_BSU __HCR(BSU)
> +#define HCR_BSU_IS __HCR(BSU_IS)
> +#define HCR_FB __HCR(FB)
> +#define HCR_VSE __HCR(VSE)
> +#define HCR_VI __HCR(VI)
> +#define HCR_VF __HCR(VF)
> +#define HCR_AMO __HCR(AMO)
> +#define HCR_IMO __HCR(IMO)
> +#define HCR_FMO __HCR(FMO)
> +#define HCR_PTW __HCR(PTW)
> +#define HCR_SWIO __HCR(SWIO)
> +#define HCR_VM __HCR(VM)
>
> /*
> * The bits we set in HCR:
> diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg
> index fce8328c7c00b..7f39c8f7f036d 100644
> --- a/arch/arm64/tools/sysreg
> +++ b/arch/arm64/tools/sysreg
> @@ -2531,6 +2531,74 @@ Field 1 AFSR1_EL1
> Field 0 AFSR0_EL1
> EndSysregFields
>
> +Sysreg HCR_EL2 3 4 1 1 0
> +Field 63:60 TWEDEL
> +Field 59 TWEDEn
> +Field 58 TID5
> +Field 57 DCT
> +Field 56 ATA
> +Field 55 TTLBOS
> +Field 54 TTLBIS
> +Field 53 EnSCXT
> +Field 52 TOCU
> +Field 51 AMVOFFEN
> +Field 50 TICAB
> +Field 49 TID4
> +Field 48 GPF
> +Field 47 FIEN
> +Field 46 FWB
> +Field 45 NV2
> +Field 44 AT
> +Field 43 NV1
> +Field 42 NV
> +Field 41 API
> +Field 40 APK
> +Field 39 TME
> +Field 38 MIOCNCE
> +Field 37 TEA
> +Field 36 TERR
> +Field 35 TLOR
> +Field 34 E2H
> +Field 33 ID
> +Field 32 CD
> +Field 31 RW
> +Field 30 TRVM
> +Field 29 HCD
> +Field 28 TDZ
> +Field 27 TGE
> +Field 26 TVM
> +Field 25 TTLB
> +Field 24 TPU
> +Field 23 TPCP
> +Field 22 TSW
> +Field 21 TACR
> +Field 20 TIDCP
> +Field 19 TSC
> +Field 18 TID3
> +Field 17 TID2
> +Field 16 TID1
> +Field 15 TID0
> +Field 14 TWE
> +Field 13 TWI
> +Field 12 DC
> +UnsignedEnum 11:10 BSU
> + 0b00 NONE
> + 0b01 IS
> + 0b10 OS
> + 0b11 FS
> +EndEnum
> +Field 9 FB
> +Field 8 VSE
> +Field 7 VI
> +Field 6 VF
> +Field 5 AMO
> +Field 4 IMO
> +Field 3 FMO
> +Field 2 PTW
> +Field 1 SWIO
> +Field 0 VM
> +EndSysreg
> +
> Sysreg MDCR_EL2 3 4 1 1 1
> Res0 63:51
> Field 50 EnSTEPOP
Reviewed-by: Joey Gouly <joey.gouly at arm.com>
More information about the linux-arm-kernel
mailing list