[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, #<imm> with <imm> 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  <matthew.wahab@arm.com>

	* aarch64-opc.c (operand_general_constraint_met_p): Check validity
	of MSR PAN immediate operand.

gas/testsuite/
2015-11-19  Matthew Wahab  <matthew.wahab@arm.com>

	* gas/aarch64/pan-illegal.d: New.
	* gas/aarch64/pan-illegal.l: New.
	* gas/aarch64/pan.s: Add tests for invalid immediates.

Change-Id: Ibb3056c975eb792104da138d94594224f56a993e
This commit is contained in:
Matthew Wahab 2015-11-19 14:13:45 +00:00
parent 231c059263
commit c2825638b6
6 changed files with 43 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2015-11-19 Matthew Wahab <matthew.wahab@arm.com>
* 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 <amodra@gmail.com> 2015-11-19 Alan Modra <amodra@gmail.com>
* gas/ppc/altivec3.d: Allow for padding at end of section. * gas/ppc/altivec3.d: Allow for padding at end of section.

View File

@ -0,0 +1,3 @@
#as: -march=armv8.1-a --defsym ERROR=1
#source: pan.s
#error-output: pan-illegal.l

View File

@ -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'

View File

@ -31,4 +31,10 @@
msr pan, x0 msr pan, x0
mrs x1, pan 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 .arch_extension nopan

View File

@ -1,3 +1,8 @@
2015-11-19 Matthew Wahab <matthew.wahab@arm.com>
* aarch64-opc.c (operand_general_constraint_met_p): Check validity
of MSR PAN immediate operand.
2015-11-16 Nick Clifton <nickc@redhat.com> 2015-11-16 Nick Clifton <nickc@redhat.com>
* rx-dis.c (condition_names): Replace always and never with * rx-dis.c (condition_names): Replace always and never with

View File

@ -1862,6 +1862,14 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
{ {
case AARCH64_OPND_PSTATEFIELD: case AARCH64_OPND_PSTATEFIELD:
assert (idx == 0 && opnds[1].type == AARCH64_OPND_UIMM4); 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 /* MSR SPSel, #uimm4
Uses uimm4 as a control value to select the stack pointer: if Uses uimm4 as a control value to select the stack pointer: if
bit 0 is set it selects the current exception level's stack bit 0 is set it selects the current exception level's stack