aboutsummaryrefslogtreecommitdiff
path: root/opcodes/aarch64-dis.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2016-04-28 09:11:03 +0100
committerNick Clifton <nickc@redhat.com>2016-04-28 09:11:03 +0100
commit4bd13cde17a27c342b79b72bde9ef8e1b5373344 (patch)
treeb8216b559ad09261cc8a82c332e6c8ac90b3959a /opcodes/aarch64-dis.c
parenta3a65e6e1d8b31bf2c8b0abca1903106ae48e092 (diff)
downloadfsf-binutils-gdb-4bd13cde17a27c342b79b72bde9ef8e1b5373344.zip
fsf-binutils-gdb-4bd13cde17a27c342b79b72bde9ef8e1b5373344.tar.gz
fsf-binutils-gdb-4bd13cde17a27c342b79b72bde9ef8e1b5373344.tar.bz2
Add support to AArch64 disassembler for verifying instructions. Add verifier for LDPSW.
PR target/19722 opcodes * aarch64-dis.c (aarch64_opcode_decode): Run verifier if present. * aarch64-opc.c (verify_ldpsw): New function. * aarch64-opc.h (verify_ldpsw): New prototype. * aarch64-tbl.h: Add initialiser for verifier field. (LDPSW): Set verifier to verify_ldpsw. binutils* testsuite/binutils-all/aarch64/illegal.s: New test. * testsuite/binutils-all/aarch64/illegal.d: New test driver. include * opcode/aarch64.h (struct aarch64_opcode): Add verifier field.
Diffstat (limited to 'opcodes/aarch64-dis.c')
-rw-r--r--opcodes/aarch64-dis.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c
index 05e4768..9ffc713 100644
--- a/opcodes/aarch64-dis.c
+++ b/opcodes/aarch64-dis.c
@@ -2047,6 +2047,7 @@ aarch64_opcode_decode (const aarch64_opcode *opcode, const aarch64_insn code,
{
const aarch64_operand *opnd;
enum aarch64_opnd type;
+
type = opcode->operands[i];
if (type == AARCH64_OPND_NIL)
break;
@@ -2059,6 +2060,13 @@ aarch64_opcode_decode (const aarch64_opcode *opcode, const aarch64_insn code,
}
}
+ /* If the opcode has a verifier, then check it now. */
+ if (opcode->verifier && ! opcode->verifier (opcode, code))
+ {
+ DEBUG_TRACE ("operand verifier FAIL");
+ goto decode_fail;
+ }
+
/* Match the qualifiers. */
if (aarch64_match_operands_constraint (inst, NULL) == 1)
{