[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:
parent
231c059263
commit
c2825638b6
@ -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.
|
||||||
|
3
gas/testsuite/gas/aarch64/pan-illegal.d
Normal file
3
gas/testsuite/gas/aarch64/pan-illegal.d
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#as: -march=armv8.1-a --defsym ERROR=1
|
||||||
|
#source: pan.s
|
||||||
|
#error-output: pan-illegal.l
|
15
gas/testsuite/gas/aarch64/pan-illegal.l
Normal file
15
gas/testsuite/gas/aarch64/pan-illegal.l
Normal 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'
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user