Skip to content
Snippets Groups Projects
  • Matthieu Longo's avatar
    f5316739
    aarch64: store signing key and signing method in DWARF _Unwind_FrameState · f5316739
    Matthieu Longo authored
    This patch is only a refactoring of the existing implementation
    of PAuth and returned-address signing. The existing behavior is
    preserved.
    
    _Unwind_FrameState already contains several CIE and FDE information
    (see the attributes below the comment "The information we care
    about from the CIE/FDE" in libgcc/unwind-dw2.h).
    The patch aims at moving the information from DWARF CIE (signing
    key stored in the augmentation string) and FDE (the used signing
    method) into _Unwind_FrameState along the already-stored CIE and
    FDE information.
    Note: those information have to be saved in frame_state_reg_info
    instead of _Unwind_FrameState as they need to be savable by
    DW_CFA_remember_state and restorable by DW_CFA_restore_state, that
    both rely on the attribute "prev".
    
    Those new information in _Unwind_FrameState simplifies the look-up
    of the signing key when the return address is demangled. It also
    allows future signing methods to be easily added.
    
    _Unwind_FrameState is not a part of the public API of libunwind,
    so the change is backward compatible.
    
    A new architecture-specific handler MD_ARCH_EXTENSION_FRAME_INIT
    allows to reset values (if needed) in the frame state and unwind
    context before changing the frame state to the caller context.
    
    A new architecture-specific handler MD_ARCH_EXTENSION_CIE_AUG_HANDLER
    isolates the architecture-specific augmentation strings in AArch64
    backend, and allows others architectures to reuse augmentation
    strings that would have clashed with AArch64 DWARF extensions.
    
    aarch64_demangle_return_addr, DW_CFA_AARCH64_negate_ra_state and
    DW_CFA_val_expression cases in libgcc/unwind-dw2-execute_cfa.h
    were documented to clarify where the value of the RA state register
    is stored (FS and CONTEXT respectively).
    
    libgcc/ChangeLog:
    
    	* config/aarch64/aarch64-unwind.h
    	(AARCH64_DWARF_RA_STATE_MASK): The mask for RA state register.
    	(aarch64_ra_signing_method_t): The diversifiers used to sign a
    	function's return address.
    	(aarch64_pointer_auth_key): The key used to sign a function's
    	return address.
    	(aarch64_cie_signed_with_b_key): Deleted as the signing key is
    	available now in _Unwind_FrameState.
    	(MD_ARCH_EXTENSION_CIE_AUG_HANDLER): New CIE augmentation string
    	handler for architecture extensions.
    	(MD_ARCH_EXTENSION_FRAME_INIT): New architecture-extension
    	initialization routine for DWARF frame state and context before
    	execution of DWARF instructions.
    	(aarch64_context_ra_state_get): Read RA state register from CONTEXT.
    	(aarch64_ra_state_get): Read RA state register from FS.
    	(aarch64_ra_state_set): Write RA state register into FS.
    	(aarch64_ra_state_toggle): Toggle RA state register in FS.
    	(aarch64_cie_aug_handler): Handler AArch64 augmentation strings.
    	(aarch64_arch_extension_frame_init): Initialize defaults for the
    	signing key (PAUTH_KEY_A), and RA state register (RA_no_signing).
    	(aarch64_demangle_return_addr): Rely on the frame registers and
    	the signing_key attribute in _Unwind_FrameState.
    	* unwind-dw2-execute_cfa.h:
    	Use the right alias DW_CFA_AARCH64_negate_ra_state for __aarch64__
    	instead of DW_CFA_GNU_window_save.
    	(DW_CFA_AARCH64_negate_ra_state): Save the signing method in RA
    	state register. Toggle RA state register without resetting 'how'
    	to REG_UNSAVED.
    	* unwind-dw2.c:
    	(extract_cie_info): Save the signing key in the current
    	_Unwind_FrameState while parsing the augmentation data.
    	(uw_frame_state_for): Reset some attributes related to architecture
    	extensions in _Unwind_FrameState.
    	(uw_update_context): Move authentication code to AArch64 unwinding.
    	* unwind-dw2.h (enum register_rule): Give a name to the existing
    	enum for the register rules, and replace 'unsigned char' by 'enum
    	register_rule' to facilitate debugging in GDB.
    	(_Unwind_FrameState): Add a new architecture-extension attribute
    	to store the signing key.
    f5316739
    History
    aarch64: store signing key and signing method in DWARF _Unwind_FrameState
    Matthieu Longo authored
    This patch is only a refactoring of the existing implementation
    of PAuth and returned-address signing. The existing behavior is
    preserved.
    
    _Unwind_FrameState already contains several CIE and FDE information
    (see the attributes below the comment "The information we care
    about from the CIE/FDE" in libgcc/unwind-dw2.h).
    The patch aims at moving the information from DWARF CIE (signing
    key stored in the augmentation string) and FDE (the used signing
    method) into _Unwind_FrameState along the already-stored CIE and
    FDE information.
    Note: those information have to be saved in frame_state_reg_info
    instead of _Unwind_FrameState as they need to be savable by
    DW_CFA_remember_state and restorable by DW_CFA_restore_state, that
    both rely on the attribute "prev".
    
    Those new information in _Unwind_FrameState simplifies the look-up
    of the signing key when the return address is demangled. It also
    allows future signing methods to be easily added.
    
    _Unwind_FrameState is not a part of the public API of libunwind,
    so the change is backward compatible.
    
    A new architecture-specific handler MD_ARCH_EXTENSION_FRAME_INIT
    allows to reset values (if needed) in the frame state and unwind
    context before changing the frame state to the caller context.
    
    A new architecture-specific handler MD_ARCH_EXTENSION_CIE_AUG_HANDLER
    isolates the architecture-specific augmentation strings in AArch64
    backend, and allows others architectures to reuse augmentation
    strings that would have clashed with AArch64 DWARF extensions.
    
    aarch64_demangle_return_addr, DW_CFA_AARCH64_negate_ra_state and
    DW_CFA_val_expression cases in libgcc/unwind-dw2-execute_cfa.h
    were documented to clarify where the value of the RA state register
    is stored (FS and CONTEXT respectively).
    
    libgcc/ChangeLog:
    
    	* config/aarch64/aarch64-unwind.h
    	(AARCH64_DWARF_RA_STATE_MASK): The mask for RA state register.
    	(aarch64_ra_signing_method_t): The diversifiers used to sign a
    	function's return address.
    	(aarch64_pointer_auth_key): The key used to sign a function's
    	return address.
    	(aarch64_cie_signed_with_b_key): Deleted as the signing key is
    	available now in _Unwind_FrameState.
    	(MD_ARCH_EXTENSION_CIE_AUG_HANDLER): New CIE augmentation string
    	handler for architecture extensions.
    	(MD_ARCH_EXTENSION_FRAME_INIT): New architecture-extension
    	initialization routine for DWARF frame state and context before
    	execution of DWARF instructions.
    	(aarch64_context_ra_state_get): Read RA state register from CONTEXT.
    	(aarch64_ra_state_get): Read RA state register from FS.
    	(aarch64_ra_state_set): Write RA state register into FS.
    	(aarch64_ra_state_toggle): Toggle RA state register in FS.
    	(aarch64_cie_aug_handler): Handler AArch64 augmentation strings.
    	(aarch64_arch_extension_frame_init): Initialize defaults for the
    	signing key (PAUTH_KEY_A), and RA state register (RA_no_signing).
    	(aarch64_demangle_return_addr): Rely on the frame registers and
    	the signing_key attribute in _Unwind_FrameState.
    	* unwind-dw2-execute_cfa.h:
    	Use the right alias DW_CFA_AARCH64_negate_ra_state for __aarch64__
    	instead of DW_CFA_GNU_window_save.
    	(DW_CFA_AARCH64_negate_ra_state): Save the signing method in RA
    	state register. Toggle RA state register without resetting 'how'
    	to REG_UNSAVED.
    	* unwind-dw2.c:
    	(extract_cie_info): Save the signing key in the current
    	_Unwind_FrameState while parsing the augmentation data.
    	(uw_frame_state_for): Reset some attributes related to architecture
    	extensions in _Unwind_FrameState.
    	(uw_update_context): Move authentication code to AArch64 unwinding.
    	* unwind-dw2.h (enum register_rule): Give a name to the existing
    	enum for the register rules, and replace 'unsigned char' by 'enum
    	register_rule' to facilitate debugging in GDB.
    	(_Unwind_FrameState): Add a new architecture-extension attribute
    	to store the signing key.