From c2825638b6784179f191c6ee8ebbda1c49ae5271 Mon Sep 17 00:00:00 2001 From: Matthew Wahab Date: Thu, 19 Nov 2015 14:13:45 +0000 Subject: [PATCH] [AArch64] Reject invalid immediate operands to MSR PAN The support for accessing the ARMv8.1 PSTATE field PAN allows instructions of the form MSR PAN, # with any unsigned 4-bit integer. However, the architecture specification requires that the immediate is either 0 or 1. This patch implements the constraint on the immediate, generating an error if the immediate operand is invalid, and adds tests for the illegal forms. opcodes/ 2015-11-19 Matthew Wahab * aarch64-opc.c (operand_general_constraint_met_p): Check validity of MSR PAN immediate operand. gas/testsuite/ 2015-11-19 Matthew Wahab * gas/aarch64/pan-illegal.d: New. * gas/aarch64/pan-illegal.l: New. * gas/aarch64/pan.s: Add tests for invalid immediates. Change-Id: Ibb3056c975eb792104da138d94594224f56a993e --- gas/testsuite/ChangeLog | 6 ++++++ gas/testsuite/gas/aarch64/pan-illegal.d | 3 +++ gas/testsuite/gas/aarch64/pan-illegal.l | 15 +++++++++++++++ gas/testsuite/gas/aarch64/pan.s | 6 ++++++ opcodes/ChangeLog | 5 +++++ opcodes/aarch64-opc.c | 8 ++++++++ 6 files changed, 43 insertions(+) create mode 100644 gas/testsuite/gas/aarch64/pan-illegal.d create mode 100644 gas/testsuite/gas/aarch64/pan-illegal.l diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 51a622edd9b..3d2b9487e09 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-11-19 Matthew Wahab + + * gas/aarch64/pan-illegal.d: New. + * gas/aarch64/pan-illegal.l: New. + * gas/aarch64/pan.s: Add tests for invalid immediates. + 2015-11-19 Alan Modra * gas/ppc/altivec3.d: Allow for padding at end of section. diff --git a/gas/testsuite/gas/aarch64/pan-illegal.d b/gas/testsuite/gas/aarch64/pan-illegal.d new file mode 100644 index 00000000000..372b9d7f521 --- /dev/null +++ b/gas/testsuite/gas/aarch64/pan-illegal.d @@ -0,0 +1,3 @@ +#as: -march=armv8.1-a --defsym ERROR=1 +#source: pan.s +#error-output: pan-illegal.l diff --git a/gas/testsuite/gas/aarch64/pan-illegal.l b/gas/testsuite/gas/aarch64/pan-illegal.l new file mode 100644 index 00000000000..f620ab0196e --- /dev/null +++ b/gas/testsuite/gas/aarch64/pan-illegal.l @@ -0,0 +1,15 @@ +[^:]*: Assembler messages: +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#2' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#3' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#4' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#5' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#6' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#7' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#8' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#9' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#10' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#11' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#12' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#13' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#14' +[^:]*:[0-9]+: Error: immediate value out of range 0 to 1 at operand 1 -- `msr pan,#15' diff --git a/gas/testsuite/gas/aarch64/pan.s b/gas/testsuite/gas/aarch64/pan.s index 059046cd8aa..4144e2bdcb6 100644 --- a/gas/testsuite/gas/aarch64/pan.s +++ b/gas/testsuite/gas/aarch64/pan.s @@ -31,4 +31,10 @@ msr pan, x0 mrs x1, pan + .ifdef ERROR + .irp N,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + msr pan, #\N + .endr + .endif + .arch_extension nopan diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index edec363bc74..5333c48d6bd 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2015-11-19 Matthew Wahab + + * aarch64-opc.c (operand_general_constraint_met_p): Check validity + of MSR PAN immediate operand. + 2015-11-16 Nick Clifton * rx-dis.c (condition_names): Replace always and never with diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c index c6ab4b24950..50dbd36e24c 100644 --- a/opcodes/aarch64-opc.c +++ b/opcodes/aarch64-opc.c @@ -1862,6 +1862,14 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx, { case AARCH64_OPND_PSTATEFIELD: assert (idx == 0 && opnds[1].type == AARCH64_OPND_UIMM4); + /* MSR PAN, #uimm4 + The immediate must be #0 or #1. */ + if (opnd->pstatefield == 0x04 /* PAN. */ + && opnds[1].imm.value > 1) + { + set_imm_out_of_range_error (mismatch_detail, idx, 0, 1); + return 0; + } /* MSR SPSel, #uimm4 Uses uimm4 as a control value to select the stack pointer: if bit 0 is set it selects the current exception level's stack -- 2.30.2