[aarch64] Add support for pointer authentication B key
authorSam Tebbs <sam.tebbs@arm.com>
Wed, 5 Dec 2018 18:27:23 +0000 (18:27 +0000)
committerThomas Preud'homme <thomas.preudhomme@linaro.org>
Wed, 5 Dec 2018 18:30:08 +0000 (18:30 +0000)
commit3a67e1a6b4430374f3073e51bb19347d4c421cfe
tree6a75b3b1a27561b0e395dc69889051b71e67eff5
parent90af06793e9d391c0aa33994f21bba6971d084f7
[aarch64] Add support for pointer authentication B key

Armv8.3-A has another key used in pointer authentication called the
B-key (other than the A-key that is already supported). In order for
stack unwinders to work it is necessary to be able to identify frames
that have been signed with the B-key rather than the A-key and it was
felt that keeping this as an augmentation character in the CIE was the
best bet. The DWARF extensions for ARM therefore propose to add a new
augmentation character 'B' to the CIE augmentation string and the
corresponding cfi directive ".cfi_b_key_frame". I've made the relevant
changes to GAS and LD to add support for B-key unwinding, which required
modifying LD to check for 'B' in the augmentation string, adding the
".cfi_b_key_frame" directive to GAS and adding a "pauth_key" field to
GAS's fde_entry and cie_entry structs.

The pointer authentication instructions will behave as NOPs on
architectures that don't support them, and so a check for the
architecture being assembled for is not necessary since there will be no
behavioural difference between augmentation strings with and without the
'B' character on such architectures.

2018-12-05  Sam Tebbs  <sam.tebbs@arm.com>

bfd/
* elf-eh-frame.c (_bfd_elf_parse_eh_frame): Add check for 'B'.

gas/
* dw2gencfi.c (struct cie_entry): Add tc_cie_entry_extras invocation.
(alloc_fde_entry): Add tc_fde_entry_init_extra invocation.
(output_cie): Add tc_output_cie_extra invocation.
(select_cie_for_fde): Add tc_cie_fde_equivalent_extra and
tc_cie_entry_init_extra invocation.
(frch_cfi_data, cfa_save_data): Move to dwgencfi.h.
* config/tc-aarch64.c (s_aarch64_cfi_b_key_frame): Declare.
(md_pseudo_table): Add "cfi_b_key_frame".
* config/tc-aarch64.h (tc_fde_entry_extras, tc_cie_entry_extras,
tc_fde_entry_init_extra, tc_output_cie_extra,
tc_cie_fde_equivalent_extra, tc_cie_entry_init_extra): Define.
* dw2gencfi.h (struct fde_entry): Add tc_fde_entry_extras invocation.
(pointer_auth_key): Define.
(frch_cfi_data, cfa_save_data): Move from dwgencfi.c.
* doc/c-aarch64.texi (.cfi_b_key_frame): Add documentation.
* testsuite/gas/aarch64/(pac_ab_key.d, pac_ab_key.s): New file.
bfd/ChangeLog
bfd/elf-eh-frame.c
gas/ChangeLog
gas/config/tc-aarch64.c
gas/doc/c-aarch64.texi
gas/dw2gencfi.c
gas/dw2gencfi.h
gas/testsuite/gas/aarch64/pac_ab_key.d [new file with mode: 0644]
gas/testsuite/gas/aarch64/pac_ab_key.s [new file with mode: 0644]