[PATCH v2] aarch64: Support 2024 Debug Architecture system registers.

Alice Carlotti alice.carlotti@arm.com
Mon Jun 16 14:05:05 GMT 2025
On Thu, Jun 05, 2025 at 04:01:55PM +0100, Srinath Parvathaneni wrote:
> Changes from v1->v2:
> 1. Modified the subject of the patch.
> 2. Added new testcases for the new sysregs instead of using the
>    existing testcases.
> 3. Modified the guarding of few sysregs by including "PROFILE"
>    (FEAT_SPE) in their guarding condition as per spec.
> 4. Also included the support for PMBSR_EL12 and TRBSR_EL12
>    system registers.
> 
> ---------------
> This patch adds support for following system registers and the spec
> can be found here[1].
> 1. PMBSR_EL12, PMBSR_EL2, PMBSR_EL3, PMBMAR_EL1 depends on FEAT_SPE
>    and Armv9.5-A architecture and these are enabled by passing
>    -march=armv9.5-a+profile.
> 2. TRBSR_EL12, TRBSR_EL2, and TRBSR_EL3 depends Armv9.5-A architecture
>    and these are enabled by passing -march=armv9.5-a.
> 3. HFGITR2_EL2 depends on Armv8.8-A architecture and enabled by passing
>    -march=armv8.8-a.
> 
> Regression tested for aarch64-none-elf target and found no regressions.
> 
> Ok for binutils-master?
> 
> Regards,
> Srinath.
> 
> [1]: https://developer.arm.com/documentation/ddi0601/2025-03/AArch64-Registers?lang=en
> ---
>  .../gas/aarch64/sysreg/sysreg-10-bad.d        |  3 +
>  .../gas/aarch64/sysreg/sysreg-10-bad.l        |  3 +
>  gas/testsuite/gas/aarch64/sysreg/sysreg-10.d  | 12 ++++
>  gas/testsuite/gas/aarch64/sysreg/sysreg-10.s  |  2 +
>  .../gas/aarch64/sysreg/sysreg-9-bad.d         |  3 +
>  .../gas/aarch64/sysreg/sysreg-9-bad.l         | 61 +++++++++++++++++++
>  .../gas/aarch64/sysreg/sysreg-9-bad.s         | 26 ++++++++
>  gas/testsuite/gas/aarch64/sysreg/sysreg-9.d   | 25 ++++++++
>  gas/testsuite/gas/aarch64/sysreg/sysreg-9.s   | 14 +++++
>  opcodes/aarch64-sys-regs.def                  |  8 +++
>  10 files changed, 157 insertions(+)
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.d
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.l
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-10.d
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-10.s
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.d
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.l
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.s
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-9.d
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/sysreg-9.s
> 

> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.d b/gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.d
> new file mode 100644
> index 00000000000..628de52d2ca
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.d
> @@ -0,0 +1,3 @@
> +#source: sysreg-10.s
> +#as: -march=armv8.7-a -I$srcdir/$subdir
> +#error_output: sysreg-10-bad.l
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.l b/gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.l
> new file mode 100644
> index 00000000000..c3387cb6ea7
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-10-bad.l
> @@ -0,0 +1,3 @@
> +.*: Assembler messages:
> +.*: Error: selected processor does not support system register name 'hfgitr2_el2'
> +.*: Error: selected processor does not support system register name 'hfgitr2_el2'
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-10.d b/gas/testsuite/gas/aarch64/sysreg/sysreg-10.d
> new file mode 100644
> index 00000000000..f07df916485
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-10.d
> @@ -0,0 +1,12 @@
> +#source: sysreg-10.s
> +#as: -march=armv8.8-a -I$srcdir/$subdir
> +#objdump: -dr
> +
> +[^:]+:     file format .*
> +
> +
> +[^:]+:
> +
> +[^:]+:
> +.*:	d53c31e0 	mrs	x0, hfgitr2_el2
> +.*:	d51c31e0 	msr	hfgitr2_el2, x0
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-10.s b/gas/testsuite/gas/aarch64/sysreg/sysreg-10.s
> new file mode 100644
> index 00000000000..bab756470fb
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-10.s
> @@ -0,0 +1,2 @@
> +	mrs	x0, hfgitr2_el2
> +	msr	hfgitr2_el2, x0
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.d b/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.d
> new file mode 100644
> index 00000000000..a1ebac603c6
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.d
> @@ -0,0 +1,3 @@
> +#source: sysreg-9-bad.s
> +#as: -I$srcdir/$subdir
> +#error_output: sysreg-9-bad.l
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.l b/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.l
> new file mode 100644
> index 00000000000..b4874c28c7d
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.l
> @@ -0,0 +1,61 @@
> +.*: Assembler messages:
> +.*: Error: selected processor does not support system register name 'pmbmar_el1'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbmar_el1'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el3'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el3'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbmar_el1'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbmar_el1'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el3'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el3'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbmar_el1'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbmar_el1'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el3'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'pmbsr_el3'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'trbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'trbsr_el12'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'trbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'trbsr_el2'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'trbsr_el3'
> +.*:  Info: macro invoked from here
> +.*: Error: selected processor does not support system register name 'trbsr_el3'
> +.*:  Info: macro invoked from here
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.s b/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.s
> new file mode 100644
> index 00000000000..535283b50cf
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-9-bad.s
> @@ -0,0 +1,26 @@
> +.include "sysreg-test-utils.inc"
> +
> +.text
> +
> +.arch	armv9.4-a+profile
> +rw_sys_reg sys_reg=pmbmar_el1 r=1 w=1

You don't need the default values or the sys_reg parameter name, so this can
just be:

rw_sys_reg pmbar_el1

(and similarly for the other macro calls).

Ok with that change (here and in sysreg-9.s).

Alice

> +rw_sys_reg sys_reg=pmbsr_el12 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el2 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el3 r=1 w=1
> +
> +.arch	armv9.5-a
> +rw_sys_reg sys_reg=pmbmar_el1 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el12 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el2 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el3 r=1 w=1
> +
> +.arch	armv9.4-a
> +rw_sys_reg sys_reg=pmbmar_el1 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el12 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el2 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el3 r=1 w=1
> +
> +.arch	armv9.4-a
> +rw_sys_reg sys_reg=trbsr_el12 r=1 w=1
> +rw_sys_reg sys_reg=trbsr_el2 r=1 w=1
> +rw_sys_reg sys_reg=trbsr_el3 r=1 w=1
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-9.d b/gas/testsuite/gas/aarch64/sysreg/sysreg-9.d
> new file mode 100644
> index 00000000000..61b63ce3eec
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-9.d
> @@ -0,0 +1,25 @@
> +#source: sysreg-9.s
> +#as: -I$srcdir/$subdir
> +#objdump: -dr
> +
> +
> +[^:]+:     file format .*
> +
> +
> +[^:]+:
> +
> +[^:]+:
> +.*:	d5189aa0 	msr	pmbmar_el1, x0
> +.*:	d5389aa0 	mrs	x0, pmbmar_el1
> +.*:	d51d9a60 	msr	pmbsr_el12, x0
> +.*:	d53d9a60 	mrs	x0, pmbsr_el12
> +.*:	d51c9a60 	msr	pmbsr_el2, x0
> +.*:	d53c9a60 	mrs	x0, pmbsr_el2
> +.*:	d51e9a60 	msr	pmbsr_el3, x0
> +.*:	d53e9a60 	mrs	x0, pmbsr_el3
> +.*:	d51d9b60 	msr	trbsr_el12, x0
> +.*:	d53d9b60 	mrs	x0, trbsr_el12
> +.*:	d51c9b60 	msr	trbsr_el2, x0
> +.*:	d53c9b60 	mrs	x0, trbsr_el2
> +.*:	d51e9b60 	msr	trbsr_el3, x0
> +.*:	d53e9b60 	mrs	x0, trbsr_el3
> diff --git a/gas/testsuite/gas/aarch64/sysreg/sysreg-9.s b/gas/testsuite/gas/aarch64/sysreg/sysreg-9.s
> new file mode 100644
> index 00000000000..2166f532826
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/sysreg-9.s
> @@ -0,0 +1,14 @@
> +.include "sysreg-test-utils.inc"
> +
> +.text
> +
> +.arch	armv9.5-a+profile
> +rw_sys_reg sys_reg=pmbmar_el1 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el12 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el2 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el3 r=1 w=1
> +
> +.arch	armv9.5-a
> +rw_sys_reg sys_reg=trbsr_el12 r=1 w=1
> +rw_sys_reg sys_reg=trbsr_el2 r=1 w=1
> +rw_sys_reg sys_reg=trbsr_el3 r=1 w=1
> diff --git a/opcodes/aarch64-sys-regs.def b/opcodes/aarch64-sys-regs.def
> index 9713ff08d1a..4da843a7be4 100644
> --- a/opcodes/aarch64-sys-regs.def
> +++ b/opcodes/aarch64-sys-regs.def
> @@ -449,6 +449,7 @@
>    SYSREG ("hdfgwtr_el2",	CPENC (3,4,3,1,5),	F_ARCHEXT,		AARCH64_FEATURE (V8_6A))
>    SYSREG ("hdfgwtr2_el2",	CPENC (3,4,3,1,1),	F_ARCHEXT,		AARCH64_FEATURE (FGT2))
>    SYSREG ("hfgitr_el2",		CPENC (3,4,1,1,6),	F_ARCHEXT,		AARCH64_FEATURE (V8_6A))
> +  SYSREG ("hfgitr2_el2",	CPENC (3,4,3,1,7),	F_ARCHEXT,		AARCH64_FEATURE (V8_8A))
>    SYSREG ("hfgrtr_el2",		CPENC (3,4,1,1,4),	F_ARCHEXT,		AARCH64_FEATURE (V8_6A))
>    SYSREG ("hfgrtr2_el2",	CPENC (3,4,3,1,2),	F_ARCHEXT,		AARCH64_FEATURE (FGT2))
>    SYSREG ("hfgwtr_el2",		CPENC (3,4,1,1,5),	F_ARCHEXT,		AARCH64_FEATURE (V8_6A))
> @@ -628,8 +629,12 @@
>    SYSREG ("pfar_el2",		CPENC (3,4,6,0,5),      F_ARCHEXT,              AARCH64_FEATURE (PFAR))
>    SYSREG ("pmbidr_el1",		CPENC (3,0,9,10,7),	F_REG_READ|F_ARCHEXT,	AARCH64_FEATURE (PROFILE))
>    SYSREG ("pmblimitr_el1",	CPENC (3,0,9,10,0),	F_ARCHEXT,		AARCH64_FEATURE (PROFILE))
> +  SYSREG ("pmbmar_el1",		CPENC (3,0,9,10,5),	F_ARCHEXT,		AARCH64_FEATURES (2, PROFILE, V9_5A))
>    SYSREG ("pmbptr_el1",		CPENC (3,0,9,10,1),	F_ARCHEXT,		AARCH64_FEATURE (PROFILE))
>    SYSREG ("pmbsr_el1",		CPENC (3,0,9,10,3),	F_ARCHEXT,		AARCH64_FEATURE (PROFILE))
> +  SYSREG ("pmbsr_el12",		CPENC (3,5,9,10,3),	F_ARCHEXT,		AARCH64_FEATURES (2, V9_5A, PROFILE))
> +  SYSREG ("pmbsr_el2",		CPENC (3,4,9,10,3),	F_ARCHEXT,		AARCH64_FEATURES (2, V9_5A, PROFILE))
> +  SYSREG ("pmbsr_el3",		CPENC (3,6,9,10,3),	F_ARCHEXT,		AARCH64_FEATURES (2, V9_5A, PROFILE))
>    SYSREG ("pmccfiltr_el0",	CPENC (3,3,14,15,7),	0,			AARCH64_NO_FEATURES)
>    SYSREG ("pmccntr_el0",	CPENC (3,3,9,13,0),	0,			AARCH64_NO_FEATURES)
>    SYSREG ("pmccntsvr_el1",	CPENC (2,0,14,11,7),	F_REG_READ|F_ARCHEXT,	AARCH64_FEATURE (PMUv3_SS))
> @@ -997,6 +1002,9 @@
>    SYSREG ("trbmar_el1",		CPENC (3,0,9,11,4),	0,			AARCH64_NO_FEATURES)
>    SYSREG ("trbptr_el1",		CPENC (3,0,9,11,1),	0,			AARCH64_NO_FEATURES)
>    SYSREG ("trbsr_el1",		CPENC (3,0,9,11,3),	0,			AARCH64_NO_FEATURES)
> +  SYSREG ("trbsr_el12",		CPENC (3,5,9,11,3),	F_ARCHEXT,		AARCH64_FEATURE (V9_5A))
> +  SYSREG ("trbsr_el2",		CPENC (3,4,9,11,3),	F_ARCHEXT,		AARCH64_FEATURE (V9_5A))
> +  SYSREG ("trbsr_el3",		CPENC (3,6,9,11,3),	F_ARCHEXT,		AARCH64_FEATURE (V9_5A))
>    SYSREG ("trbtrg_el1",		CPENC (3,0,9,11,6),	0,			AARCH64_NO_FEATURES)
>    SYSREG ("trcacatr0",		CPENC (2,1,2,0,2),	0,			AARCH64_NO_FEATURES)
>    SYSREG ("trcacatr1",		CPENC (2,1,2,2,2),	0,			AARCH64_NO_FEATURES)



More information about the Binutils mailing list