aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2018-05-15 16:37:20 +0100
committerTamar Christina <tamar.christina@arm.com>2018-05-15 17:17:36 +0100
commitf9830ec1655e7cc2aa88c9c34a20503978d9dc88 (patch)
tree54fe8dbd19770b80e10cb2c57202c98ab8e7dc7c /gas
parent7d02540ab73206249779ced77a6abe0be156442e (diff)
downloadgdb-f9830ec1655e7cc2aa88c9c34a20503978d9dc88.zip
gdb-f9830ec1655e7cc2aa88c9c34a20503978d9dc88.tar.gz
gdb-f9830ec1655e7cc2aa88c9c34a20503978d9dc88.tar.bz2
Implement Read/Write constraints on system registers on AArch64
This patch adds constraints for read and write only system registers with the msr and mrs instructions. The code will treat having both flags set and none set as the same. These flags add constraints that must be matched up. e.g. a system register with a READ only flag set, can only be used with mrs. If The constraint fails a warning is emitted. Examples of the warnings generated: test.s: Assembler messages: test.s:5: Warning: specified register cannot be written to at operand 1 -- `msr dbgdtrrx_el0,x3' test.s:7: Warning: specified register cannot be read from at operand 2 -- `mrs x3,dbgdtrtx_el0' test.s:8: Warning: specified register cannot be written to at operand 1 -- `msr midr_el1,x3' and disassembly notes: 0000000000000000 <main>: 0: d5130503 msr dbgdtrtx_el0, x3 4: d5130503 msr dbgdtrtx_el0, x3 8: d5330503 mrs x3, dbgdtrrx_el0 c: d5330503 mrs x3, dbgdtrrx_el0 10: d5180003 msr midr_el1, x3 ; note: writing to a read-only register. Note that because dbgdtrrx_el0 and dbgdtrtx_el0 have the same encoding, during disassembly the constraints are use to disambiguate between the two. An exact constraint match is always prefered over partial ones if available. As always the warnings can be suppressed with -w and also be made errors using warnings as errors. binutils/ PR binutils/21446 * doc/binutils.texi (-M): Document AArch64 options. gas/ PR binutils/21446 * testsuite/gas/aarch64/illegal-sysreg-2.s: Fix pmbidr_el1 test. * testsuite/gas/aarch64/illegal-sysreg-2.l: Likewise. * testsuite/gas/aarch64/illegal-sysreg-2.d: Likewise. * testsuite/gas/aarch64/sysreg-diagnostic.s: New. * testsuite/gas/aarch64/sysreg-diagnostic.l: New. * testsuite/gas/aarch64/sysreg-diagnostic.d: New. include/ PR binutils/21446 * opcode/aarch64.h (F_SYS_READ, F_SYS_WRITE): New. opcodes/ PR binutils/21446 * aarch64-asm.c (opintl.h): Include. (aarch64_ins_sysreg): Enforce read/write constraints. * aarch64-dis.c (aarch64_ext_sysreg): Likewise. * aarch64-opc.h (F_DEPRECATED, F_ARCHEXT, F_HASXT): Moved here. (F_REG_READ, F_REG_WRITE): New. * aarch64-opc.c (aarch64_print_operand): Generate notes for AARCH64_OPND_SYSREG. (F_DEPRECATED, F_ARCHEXT, F_HASXT): Move to aarch64-opc.h. (aarch64_sys_regs): Add constraints to currentel, midr_el1, ctr_el0, mpidr_el1, revidr_el1, aidr_el1, dczid_el0, id_dfr0_el1, id_pfr0_el1, id_pfr1_el1, id_afr0_el1, id_mmfr0_el1, id_mmfr1_el1, id_mmfr2_el1, id_mmfr3_el1, id_mmfr4_el1, id_isar0_el1, id_isar1_el1, id_isar2_el1, id_isar3_el1, id_isar4_el1, id_isar5_el1, mvfr0_el1, mvfr1_el1, mvfr2_el1, ccsidr_el1, id_aa64pfr0_el1, id_aa64pfr1_el1, id_aa64dfr0_el1, id_aa64dfr1_el1, id_aa64isar0_el1, id_aa64isar1_el1, id_aa64mmfr0_el1, id_aa64mmfr1_el1, id_aa64mmfr2_el1, id_aa64afr0_el1, id_aa64afr0_el1, id_aa64afr1_el1, id_aa64zfr0_el1, clidr_el1, csselr_el1, vsesr_el2, erridr_el1, erxfr_el1, rvbar_el1, rvbar_el2, rvbar_el3, isr_el1, tpidrro_el0, cntfrq_el0, cntpct_el0, cntvct_el0, mdccsr_el0, dbgdtrrx_el0, dbgdtrtx_el0, osdtrrx_el1, osdtrtx_el1, mdrar_el1, oslar_el1, oslsr_el1, dbgauthstatus_el1, pmbidr_el1, pmsidr_el1, pmswinc_el0, pmceid0_el0, pmceid1_el0. * aarch64-tbl.h (aarch64_opcode_table): Add constraints to msr (F_SYS_WRITE), mrs (F_SYS_READ).
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/testsuite/gas/aarch64/illegal-sysreg-2.l2
-rw-r--r--gas/testsuite/gas/aarch64/sysreg-2.d2
-rw-r--r--gas/testsuite/gas/aarch64/sysreg-2.s2
-rw-r--r--gas/testsuite/gas/aarch64/sysreg-diagnostic.d14
-rw-r--r--gas/testsuite/gas/aarch64/sysreg-diagnostic.l4
-rw-r--r--gas/testsuite/gas/aarch64/sysreg-diagnostic.s6
7 files changed, 35 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 84bba4b..a89ffe1 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,6 +1,16 @@
2018-05-15 Tamar Christina <tamar.christina@arm.com>
PR binutils/21446
+ * testsuite/gas/aarch64/illegal-sysreg-2.s: Fix pmbidr_el1 test.
+ * testsuite/gas/aarch64/illegal-sysreg-2.l: Likewise.
+ * testsuite/gas/aarch64/illegal-sysreg-2.d: Likewise.
+ * testsuite/gas/aarch64/sysreg-diagnostic.s: New.
+ * testsuite/gas/aarch64/sysreg-diagnostic.l: New.
+ * testsuite/gas/aarch64/sysreg-diagnostic.d: New.
+
+2018-05-15 Tamar Christina <tamar.christina@arm.com>
+
+ PR binutils/21446
* config/tc-aarch64.c (print_operands): Indicate no notes.
(output_operand_error_record): Support non-fatal errors.
(output_operand_error_report, warn_unpredictable_ldst, md_assemble):
diff --git a/gas/testsuite/gas/aarch64/illegal-sysreg-2.l b/gas/testsuite/gas/aarch64/illegal-sysreg-2.l
index f059611..1204056 100644
--- a/gas/testsuite/gas/aarch64/illegal-sysreg-2.l
+++ b/gas/testsuite/gas/aarch64/illegal-sysreg-2.l
@@ -27,8 +27,6 @@
[^:]*:[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 'pmbidr_el1'
-[^:]*:[0-9]+: Error: selected processor does not support system register name 'pmbidr_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'
diff --git a/gas/testsuite/gas/aarch64/sysreg-2.d b/gas/testsuite/gas/aarch64/sysreg-2.d
index a0539db..097f272 100644
--- a/gas/testsuite/gas/aarch64/sysreg-2.d
+++ b/gas/testsuite/gas/aarch64/sysreg-2.d
@@ -38,8 +38,6 @@ Disassembly of section .text:
[0-9a-f]+: d5389a27 mrs x7, pmbptr_el1
[0-9a-f]+: d5189a67 msr pmbsr_el1, x7
[0-9a-f]+: d5389a67 mrs x7, pmbsr_el1
- [0-9a-f]+: d5189ae7 msr pmbidr_el1, x7
- [0-9a-f]+: d5389ae7 mrs x7, pmbidr_el1
[0-9a-f]+: d5189907 msr pmscr_el1, x7
[0-9a-f]+: d5389907 mrs x7, pmscr_el1
[0-9a-f]+: d5189947 msr pmsicr_el1, x7
diff --git a/gas/testsuite/gas/aarch64/sysreg-2.s b/gas/testsuite/gas/aarch64/sysreg-2.s
index 2f6ea70..57eb08f 100644
--- a/gas/testsuite/gas/aarch64/sysreg-2.s
+++ b/gas/testsuite/gas/aarch64/sysreg-2.s
@@ -44,7 +44,7 @@
/* Statistical profiling. */
- .irp reg, pmblimitr_el1, pmbptr_el1, pmbsr_el1 pmbidr_el1
+ .irp reg, pmblimitr_el1, pmbptr_el1, pmbsr_el1
rw_sys_reg sys_reg=\reg xreg=x7 r=1 w=1
.endr
diff --git a/gas/testsuite/gas/aarch64/sysreg-diagnostic.d b/gas/testsuite/gas/aarch64/sysreg-diagnostic.d
new file mode 100644
index 0000000..2f52f36
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sysreg-diagnostic.d
@@ -0,0 +1,14 @@
+#objdump: -dr -M notes
+#as: -march=armv8-a
+#error-output: sysreg-diagnostic.l
+
+.*: file format .*
+
+Disassembly of section \.text:
+
+.* <.*>:
+.*: d5130503 msr dbgdtrtx_el0, x3
+.*: d5130503 msr dbgdtrtx_el0, x3
+.*: d5330503 mrs x3, dbgdtrrx_el0
+.*: d5330503 mrs x3, dbgdtrrx_el0
+.*: d5180003 msr midr_el1, x3 ; note: writing to a read-only register\.
diff --git a/gas/testsuite/gas/aarch64/sysreg-diagnostic.l b/gas/testsuite/gas/aarch64/sysreg-diagnostic.l
new file mode 100644
index 0000000..4566652
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sysreg-diagnostic.l
@@ -0,0 +1,4 @@
+.*: Assembler messages:
+.*:3: Warning: specified register cannot be written to at operand 1 -- `msr dbgdtrrx_el0,x3'
+.*:5: Warning: specified register cannot be read from at operand 2 -- `mrs x3,dbgdtrtx_el0'
+.*:6: Warning: specified register cannot be written to at operand 1 -- `msr midr_el1,x3'
diff --git a/gas/testsuite/gas/aarch64/sysreg-diagnostic.s b/gas/testsuite/gas/aarch64/sysreg-diagnostic.s
new file mode 100644
index 0000000..5f68fe6
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sysreg-diagnostic.s
@@ -0,0 +1,6 @@
+.text
+ msr dbgdtrtx_el0, x3
+ msr dbgdtrrx_el0, x3
+ mrs x3, dbgdtrrx_el0
+ mrs x3, dbgdtrtx_el0
+ msr midr_el1, x3