Skip to content
  • Sam Tebbs's avatar
    [aarch64] Add support for pointer authentication B key · 3a67e1a6
    Sam Tebbs authored
    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.
    3a67e1a6
To find the state of this project's repository at the time of any of these versions, check out the tags.