diff options
author | Sudakshina Das <sudi.das@arm.com> | 2018-09-26 11:00:49 +0100 |
---|---|---|
committer | Richard Earnshaw <Richard.Earnshaw@arm.com> | 2018-10-09 15:39:35 +0100 |
commit | ff6054520cc86ac2f34c21bcc2e44ede50b56cdc (patch) | |
tree | e6585111c7956ce55bba8a2881162623d2e85b57 /opcodes/aarch64-opc.c | |
parent | af4bcb4ce6939da1738c847a06789d2223b67ca4 (diff) | |
download | gdb-ff6054520cc86ac2f34c21bcc2e44ede50b56cdc.zip gdb-ff6054520cc86ac2f34c21bcc2e44ede50b56cdc.tar.gz gdb-ff6054520cc86ac2f34c21bcc2e44ede50b56cdc.tar.bz2 |
[PATCH, BINUTILS, AARCH64, 7/9] Add BTI instruction
This patch is part of the patch series to add support for ARMv8.5-A
extensions.
(https://developer.arm.com/products/architecture/cpu-architecture/a-profile/docs/ddi0596/a/a64-base-instructions-alphabetic-order/bti-branch-target-identification)
The Branch Target Identification instructions (BTI) are allocated to
existing HINT space, using HINT numbers 32, 34, 36, 38, such that
bits[7:6] of the instruction identify the compatibility of the BTI
instruction to different branches.
BTI {<targets>}
where <targets> one of the following, specifying which type of
indirection is allowed:
j : Can be a target of any BR Xn isntruction.
c : Can be a target of any BLR Xn and BR {X16|X17}.
jc: Can be a target of any free branch.
A BTI instruction without any <targets> is the strictest of all and
can not be a target of nay free branch.
*** include/ChangeLog ***
2018-10-09 Sudakshina Das <sudi.das@arm.com>
* opcode/aarch64.h (AARCH64_FEATURE_BTI): New.
(AARCH64_ARCH_V8_5): Add AARCH64_FEATURE_BTI by default.
(aarch64_opnd): Add AARCH64_OPND_BTI_TARGET.
(HINT_OPD_CSYNC, HINT_OPD_C, HINT_OPD_J): New macros to
define HINT #imm values.
(HINT_OPD_JC, HINT_OPD_NULL): Likewise.
*** opcodes/ChangeLog ***
2018-10-09 Sudakshina Das <sudi.das@arm.com>
* aarch64-opc.h (HINT_OPD_NOPRINT, HINT_ENCODE): New.
(HINT_FLAG, HINT_VALUE): New macros to encode NO_PRINT flag
with the hint immediate.
* aarch64-opc.c (aarch64_hint_options): New entries for
c, j, jc and default (with HINT_OPD_F_NOPRINT flag) for BTI.
(aarch64_print_operand): Add case for AARCH64_OPND_BTI_TARGET
while checking for HINT_OPD_F_NOPRINT flag.
* aarch64-dis.c (aarch64_ext_hint): Use new HINT_VALUE to
extract value.
* aarch64-tbl.h (aarch64_feature_bti, BTI, BTI_INSN): New.
(aarch64_opcode_table): Add entry for BTI.
(AARCH64_OPERANDS): Add new description for BTI targets.
* aarch64-asm-2.c: Regenerate.
* aarch64-dis-2.c: Regenerate.
* aarch64-opc-2.c: Regenerate.
*** gas/ChangeLog ***
2018-10-09 Sudakshina Das <sudi.das@arm.com>
* config/tc-aarch64.c (parse_bti_operand): New.
(process_omitted_operand): Add case for AARCH64_OPND_BTI_TARGET.
(parse_operands): Likewise.
* testsuite/gas/aarch64/system.d: Update for BTI.
* testsuite/gas/aarch64/bti.s: New.
* testsuite/gas/aarch64/bti.d: New.
* testsuite/gas/aarch64/illegal-bti.d: New.
* testsuite/gas/aarch64/illegal-bti.l: New.
Diffstat (limited to 'opcodes/aarch64-opc.c')
-rw-r--r-- | opcodes/aarch64-opc.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c index 8d96392..d2a4f2f 100644 --- a/opcodes/aarch64-opc.c +++ b/opcodes/aarch64-opc.c @@ -466,8 +466,13 @@ const struct aarch64_name_value_pair aarch64_barrier_options[16] = const struct aarch64_name_value_pair aarch64_hint_options[] = { - { "csync", 0x11 }, /* PSB CSYNC. */ - { NULL, 0x0 }, + /* BTI. This is also the F_DEFAULT entry for AARCH64_OPND_BTI_TARGET. */ + { " ", HINT_ENCODE (HINT_OPD_F_NOPRINT, 0x20) }, + { "csync", HINT_OPD_CSYNC }, /* PSB CSYNC. */ + { "c", HINT_OPD_C }, /* BTI C. */ + { "j", HINT_OPD_J }, /* BTI J. */ + { "jc", HINT_OPD_JC }, /* BTI JC. */ + { NULL, HINT_OPD_NULL }, }; /* op -> op: load = 0 instruction = 1 store = 2 @@ -3654,7 +3659,9 @@ aarch64_print_operand (char *buf, size_t size, bfd_vma pc, break; case AARCH64_OPND_BARRIER_PSB: - snprintf (buf, size, "%s", opnd->hint_option->name); + case AARCH64_OPND_BTI_TARGET: + if ((HINT_FLAG (opnd->hint_option->value) & HINT_OPD_F_NOPRINT) == 0) + snprintf (buf, size, "%s", opnd->hint_option->name); break; default: |