aarch64: Update feature RAS system registers
authorPrzemyslaw Wirkus <przemyslaw.wirkus@arm.com>
Wed, 4 Nov 2020 20:47:06 +0000 (20:47 +0000)
committerPrzemyslaw Wirkus <przemyslaw.wirkus@arm.com>
Wed, 4 Nov 2020 20:54:13 +0000 (20:54 +0000)
This patch:
+ updates RAS feature system registers with new RAS 1.1 regs.
+ extends RAS/RAS 1.1 support for all architecture levels of Armv8-A.

Please note that early Armv8-A architectures do not officially support RAS
extension.

Rationale of the patch:
To ease development so that user-friendly RAS system registers operands can be
used. Certain use cases require developers to enable only more generic
architecture (e.g. -march=armv8-a) during system development. Users must use
RAS extension registers bearing in mind that system they use must support it.

The RAS (Reliability, Availability, Serviceability) extension is a
system-level extension that defines a number of system registers.

RAS 1.1 (FEAT_RASv1p1) introduces five new system registers:
ERXPFGCTL_EL1, ERXPFGCDN_EL1, ERXMISC2_EL1, ERXMISC3_EL1 and
ERXPFGF_EL1.

For details see [0].

[0] https://developer.arm.com/docs/ddi0595/i/

15 files changed:
gas/ChangeLog
gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.d [new file with mode: 0644]
gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.l [new file with mode: 0644]
gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.s [new file with mode: 0644]
gas/testsuite/gas/aarch64/armv8-ras-1_1.d [new file with mode: 0644]
gas/testsuite/gas/aarch64/armv8-ras-1_1.s [new file with mode: 0644]
gas/testsuite/gas/aarch64/illegal-ras-1.d [deleted file]
gas/testsuite/gas/aarch64/illegal-ras-1.l [deleted file]
gas/testsuite/gas/aarch64/illegal-ras-1.s [deleted file]
gas/testsuite/gas/aarch64/illegal-sysreg-2.d [deleted file]
gas/testsuite/gas/aarch64/illegal-sysreg-2.l [deleted file]
include/ChangeLog
include/opcode/aarch64.h
opcodes/ChangeLog
opcodes/aarch64-opc.c

index bb6660fe8ed821200480f2d170ee9465ac3ea793..a38b38963c0c2a044f33fed5ca0f570fe344af41 100644 (file)
@@ -1,3 +1,16 @@
+2020-11-04  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
+
+       * testsuite/gas/aarch64/armv8-ras-1_1-invalid.d: New test.
+       * testsuite/gas/aarch64/armv8-ras-1_1-invalid.l: New test.
+       * testsuite/gas/aarch64/armv8-ras-1_1-invalid.s: New test.
+       * testsuite/gas/aarch64/armv8-ras-1_1.d: New test.
+       * testsuite/gas/aarch64/armv8-ras-1_1.s: New test.
+       * testsuite/gas/aarch64/illegal-ras-1.d: Remove.
+       * testsuite/gas/aarch64/illegal-ras-1.l: Remove.
+       * testsuite/gas/aarch64/illegal-ras-1.s: Remove.
+       * testsuite/gas/aarch64/illegal-sysreg-2.d: Remove.
+       * testsuite/gas/aarch64/illegal-sysreg-2.l: Remove.
+
 2020-11-03  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
 
        * NEWS: Update docs.
diff --git a/gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.d b/gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.d
new file mode 100644 (file)
index 0000000..89f83f5
--- /dev/null
@@ -0,0 +1,3 @@
+#name: Invalid RAS 1.1 System registers usage
+#source: armv8-ras-1_1-invalid.s
+#warning_output: armv8-ras-1_1-invalid.l
diff --git a/gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.l b/gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.l
new file mode 100644 (file)
index 0000000..730cba3
--- /dev/null
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*: Warning: specified register cannot be written to at operand 1 -- `msr erxpfgf_el1,x0'
diff --git a/gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.s b/gas/testsuite/gas/aarch64/armv8-ras-1_1-invalid.s
new file mode 100644 (file)
index 0000000..faa2715
--- /dev/null
@@ -0,0 +1,2 @@
+/* Write to R/O RAS 1.1 system register.  */
+msr erxpfgf_el1, x0
diff --git a/gas/testsuite/gas/aarch64/armv8-ras-1_1.d b/gas/testsuite/gas/aarch64/armv8-ras-1_1.d
new file mode 100644 (file)
index 0000000..7f4fac6
--- /dev/null
@@ -0,0 +1,26 @@
+#name: RAS 1.1 System registers
+#objdump: -dr
+
+.*:     file format .*
+
+Disassembly of section \.text:
+
+0+ <.*>:
+.*:    d5385540        mrs     x0, erxmisc2_el1
+.*:    d5385560        mrs     x0, erxmisc3_el1
+.*:    d53854c0        mrs     x0, erxpfgcdn_el1
+.*:    d53854a0        mrs     x0, erxpfgctl_el1
+.*:    d5185540        msr     erxmisc2_el1, x0
+.*:    d5185560        msr     erxmisc3_el1, x0
+.*:    d51854c0        msr     erxpfgcdn_el1, x0
+.*:    d51854a0        msr     erxpfgctl_el1, x0
+.*:    d5385480        mrs     x0, erxpfgf_el1
+.*:    d5385540        mrs     x0, erxmisc2_el1
+.*:    d5385560        mrs     x0, erxmisc3_el1
+.*:    d53854c0        mrs     x0, erxpfgcdn_el1
+.*:    d53854a0        mrs     x0, erxpfgctl_el1
+.*:    d5185540        msr     erxmisc2_el1, x0
+.*:    d5185560        msr     erxmisc3_el1, x0
+.*:    d51854c0        msr     erxpfgcdn_el1, x0
+.*:    d51854a0        msr     erxpfgctl_el1, x0
+.*:    d5385480        mrs     x0, erxpfgf_el1
diff --git a/gas/testsuite/gas/aarch64/armv8-ras-1_1.s b/gas/testsuite/gas/aarch64/armv8-ras-1_1.s
new file mode 100644 (file)
index 0000000..a76ec41
--- /dev/null
@@ -0,0 +1,39 @@
+/* Armv8-A RAS 1.1 extension system registers.
+
+Please note that early Armv8-a architectures do not officially support RAS
+extension.
+
+Certain use cases require developers to enable only more generic architecture
+(e.g. -march=armv8-a) during system development. Users must use RAS extension
+registers bearing in mind that system they use must support it.  */
+
+/* Arm8-A.  */
+.arch armv8-a
+
+    /* RAS 1.1 Read/Write registers.  */
+    mrs x0, erxmisc2_el1
+    mrs x0, erxmisc3_el1
+    mrs x0, erxpfgcdn_el1
+    mrs x0, erxpfgctl_el1
+    msr erxmisc2_el1, x0
+    msr erxmisc3_el1, x0
+    msr erxpfgcdn_el1, x0
+    msr erxpfgctl_el1, x0
+
+    /* RAS 1.1 Read-only registers.  */
+    mrs x0, erxpfgf_el1
+
+/* Armv8-A + RAS.  */
+.arch armv8-a+ras
+    /* RAS 1.1 Read/Write registers.  */
+    mrs x0, erxmisc2_el1
+    mrs x0, erxmisc3_el1
+    mrs x0, erxpfgcdn_el1
+    mrs x0, erxpfgctl_el1
+    msr erxmisc2_el1, x0
+    msr erxmisc3_el1, x0
+    msr erxpfgcdn_el1, x0
+    msr erxpfgctl_el1, x0
+
+    /* RAS 1.1 Read-only registers.  */
+    mrs x0, erxpfgf_el1
diff --git a/gas/testsuite/gas/aarch64/illegal-ras-1.d b/gas/testsuite/gas/aarch64/illegal-ras-1.d
deleted file mode 100644 (file)
index 2eb70b4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#name: Illegal RAS instruction use.
-#source: illegal-ras-1.s
-#as: -march=armv8-a -mno-verbose-error
-#error_output: illegal-ras-1.l
diff --git a/gas/testsuite/gas/aarch64/illegal-ras-1.l b/gas/testsuite/gas/aarch64/illegal-ras-1.l
deleted file mode 100644 (file)
index bf8ca6b..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-[^:]+: Assembler messages:
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erridr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'errselr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'errselr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxfr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxctlr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxctlr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxstatus_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxstatus_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxaddr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxaddr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc0_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc0_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc1_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc1_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'vsesr_el2'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'disr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'disr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'vdisr_el2'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erridr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'errselr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'errselr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxfr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxctlr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxctlr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxstatus_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxstatus_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxaddr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxaddr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc0_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc0_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc1_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'erxmisc1_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'vsesr_el2'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'disr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'disr_el1'
-^[^:]+:[0-9]+: Error: selected processor does not support system register name 'vdisr_el2'
diff --git a/gas/testsuite/gas/aarch64/illegal-ras-1.s b/gas/testsuite/gas/aarch64/illegal-ras-1.s
deleted file mode 100644 (file)
index ae85e8d..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-       /* Incorrect use of the RAS extension instructions. */
-       .text
-
-       .macro rw_sys_reg sys_reg xreg r w
-       .ifc \w, 1
-       msr \sys_reg, \xreg
-       .endif
-       .ifc \r, 1
-       mrs \xreg, \sys_reg
-       .endif
-       .endm
-
-       /* ARMv8-A.  */
-       .arch armv8-a
-       hint #0x10
-
-       rw_sys_reg sys_reg=erridr_el1 xreg=x5 r=1 w=0
-       rw_sys_reg sys_reg=errselr_el1 xreg=x7 r=1 w=1
-
-       rw_sys_reg sys_reg=erxfr_el1 xreg=x5 r=1 w=0
-       rw_sys_reg sys_reg=erxctlr_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=erxstatus_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=erxaddr_el1 xreg=x5 r=1 w=1
-
-       rw_sys_reg sys_reg=erxmisc0_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=erxmisc1_el1 xreg=x5 r=1 w=1
-
-       rw_sys_reg sys_reg=vsesr_el2 xreg=x5 r=1 w=0
-       rw_sys_reg sys_reg=disr_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=vdisr_el2 xreg=x5 r=1 w=0
-
-       /* ARMv8.1-A.  */
-
-       .arch armv8.1-a
-       hint #0x10
-
-       rw_sys_reg sys_reg=erridr_el1 xreg=x5 r=1 w=0
-       rw_sys_reg sys_reg=errselr_el1 xreg=x7 r=1 w=1
-
-       rw_sys_reg sys_reg=erxfr_el1 xreg=x5 r=1 w=0
-       rw_sys_reg sys_reg=erxctlr_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=erxstatus_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=erxaddr_el1 xreg=x5 r=1 w=1
-
-       rw_sys_reg sys_reg=erxmisc0_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=erxmisc1_el1 xreg=x5 r=1 w=1
-
-       rw_sys_reg sys_reg=vsesr_el2 xreg=x5 r=1 w=0
-       rw_sys_reg sys_reg=disr_el1 xreg=x5 r=1 w=1
-       rw_sys_reg sys_reg=vdisr_el2 xreg=x5 r=1 w=0
diff --git a/gas/testsuite/gas/aarch64/illegal-sysreg-2.d b/gas/testsuite/gas/aarch64/illegal-sysreg-2.d
deleted file mode 100644 (file)
index 891f4f6..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#as: -march=armv8-a
-#source: sysreg-2.s
-#error_output: illegal-sysreg-2.l
diff --git a/gas/testsuite/gas/aarch64/illegal-sysreg-2.l b/gas/testsuite/gas/aarch64/illegal-sysreg-2.l
deleted file mode 100644 (file)
index 1204056..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-[^:]*: Assembler messages:
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'id_aa64mmfr2_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erridr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'errselr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'errselr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxfr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxctlr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxctlr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxstatus_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxstatus_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxaddr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxaddr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxmisc0_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxmisc0_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxmisc1_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'erxmisc1_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'vsesr_el2'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'disr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'disr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'vdisr_el2'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'cvap'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 's1e1rp'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 's1e1wp'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmblimitr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmblimitr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmbptr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmbptr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmbsr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmbsr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmscr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmscr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsicr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsicr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsirr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsirr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsfcr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsfcr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsevfr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsevfr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmslatfr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmslatfr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmscr_el2'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmscr_el2'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmscr_el12'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmscr_el12'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmbidr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmsidr_el1'
index b403c5cce20461a5455d6d6426c419d1ea822747..252b494b1f72403e8430a2f6e0f6d76e06778ed7 100644 (file)
@@ -1,3 +1,8 @@
+2020-11-04  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
+
+       * opcode/aarch64.h (AARCH64_ARCH_V8): Add RAS to Armv8-A.
+       (AARCH64_ARCH_V8_2): Remove RAS from Armv8.2-A set.
+
 2020-11-03  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
 
        * opcode/aarch64.h (AARCH64_FEATURE_LS64): New +ls64 feature flag.
index 07eb911f5dfa0d923c85ccda3c25bc2e0baeb302..efa265717ada2ca7327467fecd73027c02b2766c 100644 (file)
@@ -97,6 +97,7 @@ typedef uint32_t aarch64_insn;
 #define AARCH64_ARCH_V8                AARCH64_FEATURE (AARCH64_FEATURE_V8, \
                                                 AARCH64_FEATURE_V8_A \
                                                 | AARCH64_FEATURE_FP  \
+                                                | AARCH64_FEATURE_RAS \
                                                 | AARCH64_FEATURE_SIMD)
 #define AARCH64_ARCH_V8_1      AARCH64_FEATURE (AARCH64_ARCH_V8, \
                                                 AARCH64_FEATURE_CRC    \
@@ -106,8 +107,7 @@ typedef uint32_t aarch64_insn;
                                                 | AARCH64_FEATURE_LOR  \
                                                 | AARCH64_FEATURE_RDMA)
 #define AARCH64_ARCH_V8_2      AARCH64_FEATURE (AARCH64_ARCH_V8_1,     \
-                                                AARCH64_FEATURE_V8_2   \
-                                                | AARCH64_FEATURE_RAS)
+                                                AARCH64_FEATURE_V8_2)
 #define AARCH64_ARCH_V8_3      AARCH64_FEATURE (AARCH64_ARCH_V8_2,     \
                                                 AARCH64_FEATURE_V8_3   \
                                                 | AARCH64_FEATURE_RCPC \
index 01a23035bc26fd11186f57e3bc66fca1e96c1b91..44db63c540914c891796f0631f60cb1b4f4eaa72 100644 (file)
@@ -1,3 +1,8 @@
+2020-11-04  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
+
+       * aarch64-opc.c: Add RAS 1.1 new system registers: ERXPFGCTL_EL1,
+       ERXPFGCDN_EL1, ERXMISC2_EL1, ERXMISC3_EL1 and ERXPFGF_EL1.
+
 2020-11-03  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
 
        * aarch64-tbl.h (QL_X2NIL): New qualifier for 64-byte stores.
index 290a438e5aa21c84cf98a488b980105f1c37de82..3f142879ed2a145cffff47fbe3e07a4f1b5a302d 100644 (file)
@@ -4017,6 +4017,11 @@ const aarch64_sys_reg aarch64_sys_regs [] =
   SR_RAS  ("erxaddr_el1",      CPENC (3,0,C5,C4,3),    0),
   SR_RAS  ("erxmisc0_el1",     CPENC (3,0,C5,C5,0),    0),
   SR_RAS  ("erxmisc1_el1",     CPENC (3,0,C5,C5,1),    0),
+  SR_RAS  ("erxmisc2_el1",     CPENC (3,0,C5,C5,2),    0),
+  SR_RAS  ("erxmisc3_el1",     CPENC (3,0,C5,C5,3),    0),
+  SR_RAS  ("erxpfgcdn_el1",    CPENC (3,0,C5,C4,6),    0),
+  SR_RAS  ("erxpfgctl_el1",    CPENC (3,0,C5,C4,5),    0),
+  SR_RAS  ("erxpfgf_el1",      CPENC (3,0,C5,C4,4),    F_REG_READ),
   SR_CORE ("far_el1",          CPENC (3,0,C6,C0,0),    0),
   SR_CORE ("far_el2",          CPENC (3,4,C6,C0,0),    0),
   SR_CORE ("far_el3",          CPENC (3,6,C6,C0,0),    0),