[PATCH v1] aarch64: Add support for Programmers Model system registers.

Alice Carlotti alice.carlotti@arm.com
Mon Jun 2 15:37:52 GMT 2025


On Tue, May 27, 2025 at 04:38:20PM +0100, Srinath Parvathaneni wrote:
Hi,

My first issue here is that the patch title is too vague and unhelpful.  If
I've understood the scope of the patch correctly, then a better title would be:
"aarch64: Support 2024 Debug Architecture"

> 
> This patch adds support for following system registers and the spec
> can be found here[1].
> 1. PMBSR_EL2, PMBSR_EL3, TRBSR_EL2, TRBSR_EL3 and PMBMAR_EL1 depends
>    on Armv9.5-A architecture.
> 2. HFGITR2_EL2 depends on Armv8.8-A architecture.
> 
> 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
> ---
>  .../aarch64/sysreg/armv8_8-a-sysregs-bad.d    |  3 ++
>  .../aarch64/sysreg/armv8_8-a-sysregs-bad.l    | 17 ++++++++++
>  .../gas/aarch64/sysreg/armv8_8-a-sysregs.d    | 31 ++++++++++---------
>  .../gas/aarch64/sysreg/armv8_8-a-sysregs.s    |  2 ++
>  .../armv9_5-a-sysregs-archv9_4-unsupported.l  | 22 ++++++++++++-
>  .../gas/aarch64/sysreg/armv9_5-a-sysregs.d    | 10 ++++++
>  .../gas/aarch64/sysreg/armv9_5-a-sysregs.s    |  7 +++++
>  opcodes/aarch64-sys-regs.def                  |  6 ++++
>  8 files changed, 83 insertions(+), 15 deletions(-)
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.d
>  create mode 100644 gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.l
> 

> diff --git a/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.d b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.d
> new file mode 100644
> index 00000000000..23df5febbfe
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.d
> @@ -0,0 +1,3 @@
> +#source: armv8_8-a-sysregs.s
> +#as: -march=armv8.7-a -I$srcdir/$subdir --no-info
> +#error_output: armv8_8-a-sysregs-bad.l
> diff --git a/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.l b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.l
> new file mode 100644
> index 00000000000..d85bb241e0f
> --- /dev/null
> +++ b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs-bad.l
> @@ -0,0 +1,17 @@
> +.* Assembler messages:
> +.*: Error: selected processor does not support PSTATE field name 'allint'
> +.*: Error: selected processor does not support system register name 'allint'
> +.*: Error: selected processor does not support PSTATE field name 'allint'
> +.*: Error: selected processor does not support system register name 'allint'
> +.*: Error: selected processor does not support PSTATE field name 'allint'
> +.*: Error: selected processor does not support system register name 'allint'
> +.*: Error: selected processor does not support PSTATE field name 'allint'
> +.*: Error: selected processor does not support system register name 'allint'
> +.*: Error: selected processor does not support system register name 'allint'
> +.*: Error: selected processor does not support system register name 'allint'
> +.*: Error: selected processor does not support system register name 'allint'
> +.*: Error: selected processor does not support PSTATE field name 'allint'
> +.*: Error: selected processor does not support PSTATE field name 'allint'
> +.*: Error: selected processor does not support system register name 'hfgitr2_el2'
> +.*: Error: selected processor does not support system register name 'icc_nmiar1_el1'
> +.*: Error: selected processor does not support system register name 'hfgitr2_el2'

Why are you adding new tests for 'msr allint'?  That seems to be unrelated to the rest of the patch.

> diff --git a/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.d b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.d
> index 294fed2c061..1024e2a5866 100644
> --- a/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.d
> +++ b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.d
> @@ -1,19 +1,22 @@
>  #as: -march=armv8.8-a
>  #objdump: -dr
>  
> -.*:     file format .*
> +[^:]+:     file format .*
>  
> -Disassembly of section \.text:
>  
> -0+ <.*>:
> -[^:]+:\s+d5184300 	msr	allint, x0
> -[^:]+:\s+d518430f 	msr	allint, x15
> -[^:]+:\s+d518431e 	msr	allint, x30
> -[^:]+:\s+d518431f 	msr	allint, xzr
> -[^:]+:\s+d5384300 	mrs	x0, allint
> -[^:]+:\s+d5384310 	mrs	x16, allint
> -[^:]+:\s+d538431e 	mrs	x30, allint
> -[^:]+:\s+d501401f 	msr	allint, #0x0
> -[^:]+:\s+d501411f 	msr	allint, #0x1
> -[^:]+:\s+d501421f 	msr	s0_1_c4_c2_0, xzr
> -[^:]+:\s+d538c9a0 	mrs	x0, icc_nmiar1_el1
> +[^:]+:
> +
> +[^:]+:
> +.*:	d5184300 	msr	allint, x0
> +.*:	d518430f 	msr	allint, x15
> +.*:	d518431e 	msr	allint, x30
> +.*:	d518431f 	msr	allint, xzr
> +.*:	d5384300 	mrs	x0, allint
> +.*:	d5384310 	mrs	x16, allint
> +.*:	d538431e 	mrs	x30, allint
> +.*:	d501401f 	msr	allint, #0x0
> +.*:	d501411f 	msr	allint, #0x1
> +.*:	d51c31e0 	msr	hfgitr2_el2, x0
> +.*:	d501421f 	msr	s0_1_c4_c2_0, xzr
> +.*:	d538c9a0 	mrs	x0, icc_nmiar1_el1
> +.*:	d53c31e0 	mrs	x0, hfgitr2_el2
> diff --git a/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.s b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.s
> index dd43ad8b506..259311e7637 100644
> --- a/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.s
> +++ b/gas/testsuite/gas/aarch64/sysreg/armv8_8-a-sysregs.s
> @@ -7,6 +7,8 @@
>  	mrs	x30, allint
>  	msr	allint, #0
>  	msr	allint, #1
> +	msr	hfgitr2_el2, x0
>  	.inst	0xd501421f
>  
>  	mrs	x0, icc_nmiar1_el1
> +	mrs	x0, hfgitr2_el2

You should add the new system register to a new (or different) test,
particularly as I think we'll be adjusting the gating of the other sysregs in
this file.

> diff --git a/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs-archv9_4-unsupported.l b/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs-archv9_4-unsupported.l
> index 58e7f9b9c26..57002348109 100644
> --- a/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs-archv9_4-unsupported.l
> +++ b/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs-archv9_4-unsupported.l
> @@ -14,4 +14,24 @@
>  [^ :]+:[0-9]+: Error: selected processor does not support system register name 'mdstepop_el1'
>  [^ :]+:[0-9]+:  Info: macro invoked from here
>  [^ :]+:[0-9]+: Error: selected processor does not support system register name 'mdstepop_el1'
> -[^ :]+:[0-9]+:  Info: macro invoked from here
> \ No newline at end of file
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'pmbsr_el2'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'pmbsr_el2'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'pmbsr_el3'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'pmbsr_el3'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'trbsr_el2'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'trbsr_el2'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'trbsr_el2'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'trbsr_el2'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'pmbmar_el1'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> +[^ :]+:[0-9]+: Error: selected processor does not support system register name 'pmbmar_el1'
> +[^ :]+:[0-9]+:  Info: macro invoked from here
> diff --git a/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.d b/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.d
> index c52142d3998..bc6529233be 100644
> --- a/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.d
> +++ b/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.d
> @@ -15,3 +15,13 @@ Disassembly of section \.text:
>  .*:	d5339c80 	mrs	x0, spmzr_el0
>  .*:	d5100540 	msr	mdstepop_el1, x0
>  .*:	d5300540 	mrs	x0, mdstepop_el1
> +.*:	d51c9a60 	msr	pmbsr_el2, x0
> +.*:	d53c9a60 	mrs	x0, pmbsr_el2
> +.*:	d51e9a60 	msr	pmbsr_el3, x0
> +.*:	d53e9a60 	mrs	x0, pmbsr_el3
> +.*:	d51c9b60 	msr	trbsr_el2, x0
> +.*:	d53c9b60 	mrs	x0, trbsr_el2
> +.*:	d51c9b60 	msr	trbsr_el2, x0
> +.*:	d53c9b60 	mrs	x0, trbsr_el2
> +.*:	d5189aa0 	msr	pmbmar_el1, x0
> +.*:	d5389aa0 	mrs	x0, pmbmar_el1
> diff --git a/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.s b/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.s
> index e3ba989c88e..473d9e3a8d7 100644
> --- a/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.s
> +++ b/gas/testsuite/gas/aarch64/sysreg/armv9_5-a-sysregs.s
> @@ -11,3 +11,10 @@ rw_sys_reg sys_reg=spmzr_el0 xreg=x0 r=1 w=1
>  
>  /* Enhanced Software Step Extension. */
>  rw_sys_reg sys_reg=mdstepop_el1 xreg=x0 r=1 w=1
> +
> +/* Programmers Model.  */
> +rw_sys_reg sys_reg=pmbsr_el2 xreg=x0 r=1 w=1
> +rw_sys_reg sys_reg=pmbsr_el3 xreg=x0 r=1 w=1
> +rw_sys_reg sys_reg=trbsr_el2 xreg=x0 r=1 w=1
> +rw_sys_reg sys_reg=trbsr_el2 xreg=x0 r=1 w=1
> +rw_sys_reg sys_reg=pmbmar_el1 xreg=x0 r=1 w=1
> diff --git a/opcodes/aarch64-sys-regs.def b/opcodes/aarch64-sys-regs.def
> index 9713ff08d1a..4fcb33e034e 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))

(This should have been added a couple of years ago - oops.)

>    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,11 @@
>    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_FEATURE (V9_5A))

I think this could also include a dependency on "+profile", since FEAT_SPE_nVM
requires both FEAT_SPE and Armv9.5-a.

>    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))

This is missing pmbsr_el12.  FEAT_SPE_EXC also requires both FEAT_SPE and
Armv9.5-a, so I think these dependencies should also be changed.

> +  SYSREG ("pmbsr_el2",		CPENC (3,4,9,10,3),	F_ARCHEXT,		AARCH64_FEATURE (V9_5A))
> +  SYSREG ("pmbsr_el3",		CPENC (3,6,9,10,3),	F_ARCHEXT,		AARCH64_FEATURE (V9_5A))
>    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 +1001,8 @@
>    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)

This is missing trbsr_el12.

> +  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