git: aa555b6004d6 - main - arm64: mte: add system register definitions

From: Andrew Turner <andrew_at_FreeBSD.org>
Date: Mon, 13 Apr 2026 14:24:08 UTC
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=aa555b6004d605ff0fd48832340b0c32f14d51d4

commit aa555b6004d605ff0fd48832340b0c32f14d51d4
Author:     Harry Moulton <harry.moulton@arm.com>
AuthorDate: 2026-04-13 11:53:37 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2026-04-13 14:23:05 +0000

    arm64: mte: add system register definitions
    
    Add system register and bit field definitions for Memory Tagging
    Extension (MTE) in ARMv8.5.
    
    Reviewed by:    andrew
    Sponsored by:   Arm Ltd
    Signed-off-by:  Harry Moulton <harry.moulton@arm.com>
    Co-authored-by: Andrew Turner <andrew@FreeBSD.org>
    Differential Revision:  https://reviews.freebsd.org/D55945
---
 sys/arm64/include/armreg.h     | 96 +++++++++++++++++++++++++++++++++++++++++-
 sys/arm64/include/hypervisor.h | 24 +++++++++++
 2 files changed, 118 insertions(+), 2 deletions(-)

diff --git a/sys/arm64/include/armreg.h b/sys/arm64/include/armreg.h
index 257239b923af..6447f0064d33 100644
--- a/sys/arm64/include/armreg.h
+++ b/sys/arm64/include/armreg.h
@@ -232,6 +232,11 @@
 #define	CLIDR_ICB_WIDTH		3
 #define	CLIDR_ICB_MASK		(UL(0x7) << CLIDR_ICB_SHIFT)
 #define	CLIDR_ICB_VAL(x)	((x) & CLIDR_ICB_MASK)
+#define	CLIDR_TTYPE_MASK	UL(0x7)
+#define	 CLIDR_TTYPE_NONE	0x0	/* No tag cache */
+#define	 CLIDR_TTYPE_SAT	0x1	/* Separate Allocation Tag cache */
+#define	 CLIDR_TTYPE_UATU	0x2 /* Unified Allocation Tag, unified lines */
+#define	 CLIDR_TTYPE_UATS	0x3	/* Unified Allocation Tag, separate lines */
 
 /* CNTKCTL_EL1 - Counter-timer Kernel Control Register */
 #define	CNTKCTL_EL1_op0		3
@@ -399,6 +404,12 @@
 #define	CSSELR_Level_WIDTH	3
 #define	CSSELR_Level_MASK	(UL(0x7) << CSSELR_Level_SHIFT)
 #define	 CSSELR_Level(i)	(i << CSSELR_Level_SHIFT)
+#define	CSSELR_TnD_SHIFT	4
+#define	CSSELR_TnD_WIDTH	1
+#define	CSSELR_TnD_MASK		(UL(0x1) << CSSELR_TnD_SHIFT)
+#define	CSSELR_TnD_VAL(x)	((x) & CSSELR_TnD_MASK)
+#define	 CSSELR_TnD_DIU		(0x0 << CSSELR_TnD_SHIFT)	/* Data, Instruction or Unified cache */
+#define	 CSSELR_TnD_SAT		(0x1 << CSSELR_TnD_SHIFT)	/* Separate Allocation Tag cache */
 
 /* CTR_EL0 - Cache Type Register */
 #define	CTR_EL0_REG		MRS_REG_ALT_NAME(CTR_EL0)
@@ -700,6 +711,7 @@
 #define	 ISS_DATA_DFSC_PF_L2	(0x0e << 0)
 #define	 ISS_DATA_DFSC_PF_L3	(0x0f << 0)
 #define	 ISS_DATA_DFSC_EXT	(0x10 << 0)
+#define	 ISS_DATA_DFSC_TAG	(0x11 << 0)
 #define	 ISS_DATA_DFSC_EXT_L0	(0x14 << 0)
 #define	 ISS_DATA_DFSC_EXT_L1	(0x15 << 0)
 #define	 ISS_DATA_DFSC_EXT_L2	(0x16 << 0)
@@ -776,6 +788,30 @@
 #define	FAR_EL12_CRm			0
 #define	FAR_EL12_op2			0
 
+/* GCR_EL1 - Tag Control Register */
+#define	GCR_EL1_REG		MRS_REG_ALT_NAME(GCR_EL1)
+#define	GCR_EL1_op0		3
+#define	GCR_EL1_op1		0
+#define	GCR_EL1_CRn		1
+#define	GCR_EL1_CRm		0
+#define	GCR_EL1_op2		6
+#define	GCR_Exclude_SHIFT	0
+#define	GCR_Exclude_MASK	(UL(0xffff) << GCR_Exclude_SHIFT)
+#define	GCR_RRND_SHIFT		16
+#define	GCR_RRND		(UL(0x1) << GCR_RRND_SHIFT)
+
+/* GMID_EL1 - Multiple tag transfer ID Register */
+#define	GMID_EL1_REG		MRS_REG_ALT_NAME(GMID_EL1)
+#define	GMID_EL1_op0		3
+#define	GMID_EL1_op1		1
+#define	GMID_EL1_CRn		0
+#define	GMID_EL1_CRm		0
+#define	GMID_EL1_op2		4
+#define	GMID_BS_SHIFT		0
+#define	GMID_BS_WIDTH		4
+#define	GMID_BS_MASK		(UL(0xf) << GMID_BS_SHIFT)
+#define	GMID_BS_SIZE(reg)	(((reg) & GMID_BS_MASK) >> GMID_BS_SHIFT)
+
 /* ICC_CTLR_EL1 */
 #define	ICC_CTLR_EL1_EOIMODE	(1U << 1)
 
@@ -2043,6 +2079,7 @@
 #define	 MAIR_DEVICE_nGnRE		UL(0x04)
 #define	 MAIR_NORMAL_NC			UL(0x44)
 #define	 MAIR_NORMAL_WT			UL(0xbb)
+#define	 MAIR_NORMAL_TG			UL(0xf0)
 #define	 MAIR_NORMAL_WB			UL(0xff)
 
 /* MAIR_EL12 */
@@ -2656,6 +2693,18 @@
 #define	PMXEVTYPER_EL0_CRm		13
 #define	PMXEVTYPER_EL0_op2		1
 
+/* RGSR_EL1 - Random Allocation Tag Seed Register */
+#define	RGSR_EL1_REG			MRS_REG_ALT_NAME(RGSR_EL1)
+#define	RGSR_EL1_op0			3
+#define	RGSR_EL1_op1			0
+#define	RGSR_EL1_CRn			1
+#define	RGSR_EL1_CRm			0
+#define	RGSR_EL1_op2			5
+#define	RGSR_TAG_SHIFT			0
+#define	RGSR_TAG_MASK			(UL(0xf) << RGSR_TAG_SHIFT)
+#define	RGSR_SEED_SHIFT			8
+#define	RGSR_SEED_MASK			(UL(0xffff) << RGSR_SEED_SHIFT)
+
 /* RNDRRS */
 #define	RNDRRS_REG			MRS_REG_ALT_NAME(RNDRRS)
 #define	RNDRRS_op0			3
@@ -2710,8 +2759,18 @@
 #define	SCTLR_BT0			(UL(0x1) << 35)
 #define	SCTLR_BT1			(UL(0x1) << 36)
 #define	SCTLR_ITFSB			(UL(0x1) << 37)
-#define	SCTLR_TCF0_MASK			(UL(0x3) << 38)
-#define	SCTLR_TCF_MASK			(UL(0x3) << 40)
+#define	SCTLR_TCF0_SHIFT		38
+#define	SCTLR_TCF0_MASK			(UL(0x3) << SCTLR_TCF0_SHIFT)
+#define	SCTLR_TCF0_NONE			(UL(0x0) << SCTLR_TCF0_SHIFT)
+#define	SCTLR_TCF0_SYNC			(UL(0x1) << SCTLR_TCF0_SHIFT)
+#define	SCTLR_TCF0_ASYNC		(UL(0x2) << SCTLR_TCF0_SHIFT)
+#define	SCTLR_TCF0_ASYM			(UL(0x3) << SCTLR_TCF0_SHIFT)
+#define	SCTLR_TCF_SHIFT			40
+#define	SCTLR_TCF_MASK			(UL(0x3) << SCTLR_TCF_SHIFT)
+#define	SCTLR_TCF_NONE			(UL(0x0) << SCTLR_TCF_SHIFT)
+#define	SCTLR_TCF_SYNC			(UL(0x1) << SCTLR_TCF_SHIFT)
+#define	SCTLR_TCF_ASYNC			(UL(0x2) << SCTLR_TCF_SHIFT)
+#define	SCTLR_TCF_ASYM			(UL(0x3) << SCTLR_TCF_SHIFT)
 #define	SCTLR_ATA0			(UL(0x1) << 42)
 #define	SCTLR_ATA			(UL(0x1) << 43)
 #define	SCTLR_DSSBS			(UL(0x1) << 44)
@@ -2821,6 +2880,15 @@
 #define	REVIDR_EL1_CRm			0
 #define	REVIDR_EL1_op2			6
 
+/* TCO - Tag Check Override */
+#define	TCO			MRS(TCO)
+#define	TCO_REG			MRS_REG_ALT_NAME(TCO)
+#define	TCO_op0			3
+#define	TCO_op1			3
+#define	TCO_CRn			4
+#define	TCO_CRm			2
+#define	TCO_op2			7
+
 /* TCR_EL1 - Translation Control Register */
 #define	TCR_EL1_REG			MRS_REG_ALT_NAME(TCR_EL1)
 #define	TCR_EL1_op0			3
@@ -2936,6 +3004,30 @@
 #define	TCR_EL12_CRm			0
 #define	TCR_EL12_op2			2
 
+/* TFSRE0_EL1 - Tag Fault Status Register (EL0) */
+#define	TFSRE0_EL1_REG		MRS_REG_ALT_NAME(TFSRE0_EL1)
+#define	TFSRE0_EL1_op0		3
+#define	TFSRE0_EL1_op1		0
+#define	TFSRE0_EL1_CRn		5
+#define	TFSRE0_EL1_CRm		6
+#define	TFSRE0_EL1_op2		1
+#define	TFSRE0_TF0_SHIFT	0
+#define	TFSRE0_TF0_MASK		(UL(0x1) << TFSRE0_TF0_SHIFT)
+#define	TFSRE0_TF1_SHIFT	1
+#define	TFSRE0_TF1_MASK		(UL(0x1) << TFSRE0_TF1_SHIFT)
+
+/* TFSR_EL1 - Tag Fault Status Register */
+#define	TFSR_EL1_REG		MRS_REG_ALT_NAME(TFSR_EL1)
+#define	TFSR_EL1_op0		3
+#define	TFSR_EL1_op1		0
+#define	TFSR_EL1_CRn		5
+#define	TFSR_EL1_CRm		6
+#define	TFSR_EL1_op2		0
+#define	TFSR_TF0_SHIFT		0
+#define	TFSR_TF0_MASK		(UL(0x1) << TFSR_TF0_SHIFT)
+#define	TFSR_TF1_SHIFT		1
+#define	TFSR_TF1_MASK		(UL(0x1) << TFSR_TF1_SHIFT)
+
 /* TTBR0_EL1 & TTBR1_EL1 - Translation Table Base Register 0 & 1 */
 #define	TTBR_ASID_SHIFT		48
 #define	TTBR_ASID_MASK		(0xfffful << TTBR_ASID_SHIFT)
diff --git a/sys/arm64/include/hypervisor.h b/sys/arm64/include/hypervisor.h
index 3ee5c12f2265..73adf89b4182 100644
--- a/sys/arm64/include/hypervisor.h
+++ b/sys/arm64/include/hypervisor.h
@@ -2062,6 +2062,16 @@
 #define	SCTLR_EL2_EIS		(0x1UL << SCTLR_EL2_EIS_SHIFT)
 #define	SCTLR_EL2_EE_SHIFT	25
 #define	SCTLR_EL2_EE		(0x1UL << SCTLR_EL2_EE_SHIFT)
+#define	SCTLR_EL2_ITFSB_SHIFT	37
+#define	SCTLR_EL2_ITFSB		(0x1UL << SCTLR_EL2_ITFSB_SHIFT)
+#define	SCTLR_EL2_TCF0_SHIFT	38
+#define	SCTLR_EL2_TCF0		(0x2UL << SCTLR_EL2_TCF0_SHIFT)
+#define	SCTLR_EL2_TCF_SHIFT	40
+#define	SCTLR_EL2_TCF		(0x2UL << SCTLR_EL2_TCF_SHIFT)
+#define	SCTLR_EL2_ATA0_SHIFT	42
+#define	SCTLR_EL2_ATA0		(0x1UL << SCTLR_EL2_ATA0_SHIFT)
+#define	SCTLR_EL2_ATA_SHIFT	43
+#define	SCTLR_EL2_ATA		(0x1UL << SCTLR_EL2_ATA_SHIFT)
 
 /* TCR_EL2 - Translation Control Register */
 #define	TCR_EL2_RES1		((0x1UL << 31) | (0x1UL << 23))
@@ -2104,6 +2114,20 @@
 #define	TCR_EL2_HWU62		(1UL << TCR_EL2_HWU62_SHIFT)
 #define	TCR_EL2_HWU		\
     (TCR_EL2_HWU59 | TCR_EL2_HWU60 | TCR_EL2_HWU61 | TCR_EL2_HWU62)
+#define	TCR_EL2_TCMA_SHIFT	30
+#define	TCR_EL2_TCMA		(1UL << TCR_EL2_TCMA_SHIFT)
+
+/* TFSR_EL2 - Tag Fault Status Register EL2 */
+#define	TFSR_EL2_REG		MRS_REG_ALT_NAME(TFSR_EL2)
+#define	TFSR_EL2_op0		3
+#define	TFSR_EL2_op1		4
+#define	TFSR_EL2_CRn		5
+#define	TFSR_EL2_CRm		6
+#define	TFSR_EL2_op2		0
+#define	TFSR_TF0_SHIFT		0
+#define	TFSR_TF0_MASK		(UL(0x1) << TFSR_TF0_SHIFT)
+#define	TFSR_TF1_SHIFT		1
+#define	TFSR_TF1_MASK		(UL(0x1) << TFSR_TF1_SHIFT)
 
 /* VMPDIR_EL2 - Virtualization Multiprocessor ID Register */
 #define	VMPIDR_EL2_U		0x0000000040000000