[PATCH 3/3][GCC][AARCH64] Add support for pointer authentication B key

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH 3/3][GCC][AARCH64] Add support for pointer authentication B key

Sam Tebbs
Hi all,

This patch adds support for the Armv8.3-A pointer authentication instructions
that use the B-key (pacib*, autib* and retab). This required adding builtins for
pacib1716 and autib1716, adding the "b-key" feature to the -mbranch-protection
option, and required emitting a new CFI directive ".cfi_b_key_frame" which
causes GAS to add 'B' to the CIE augmentation string. I also had to add a new
hook called ASM_POST_CFI_STARTPROC which is triggered when the .cfi_startproc
directive is emitted.

The libgcc stack unwinder has been amended to authenticate return addresses
with the B key when the function has been signed with the B key.

The previous patch in this series is here:
https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00104.html

Bootstrapped successfully and regression tested on aarch64-none-elf.

OK for trunk?

gcc/
2018-11-02  Sam Tebbs<[hidden email]>

        * config/aarch64/aarch64-builtins.c (aarch64_builtins): Add
        AARCH64_PAUTH_BUILTIN_AUTIB1716 and AARCH64_PAUTH_BUILTIN_PACIB1716.
        * config/aarch64/aarch64-builtins.c (aarch64_init_pauth_hint_builtins):
        Add autib1716 and pacib1716 initialisation.
        * config/aarch64/aarch64-builtins.c (aarch64_expand_builtin): Add checks
        for autib1716 and pacib1716.
        * config/aarch64/aarch64-protos.h (aarch64_key_type,
        aarch64_post_cfi_startproc): Define.
        * config/aarch64/aarch64-protos.h (aarch64_ra_sign_key): Define extern.
        * config/aarch64/aarch64.c (aarch64_return_address_signing_enabled): Add
        check for b-key, remove frame.laid_out assertion.
        * config/aarch64/aarch64.c (aarch64_ra_sign_key,
        aarch64_post_cfi_startproc, aarch64_handle_pac_ret_b_key): Define.
        * config/aarch64/aarch64.h (TARGET_ASM_POST_CFI_STARTPROC): Define.
        * config/aarch64/aarch64.c (aarch64_pac_ret_subtypes): Add "b-key".
        * config/aarch64/aarch64.md (unspec): Add UNSPEC_AUTIA1716,
        UNSPEC_AUTIB1716, UNSPEC_AUTIASP, UNSPEC_AUTIBSP, UNSPEC_PACIA1716,
        UNSPEC_PACIB1716, UNSPEC_PACIASP, UNSPEC_PACIBSP.
        * config/aarch64/aarch64.md (do_return): Add check for b-key.
        * config/aarch64/aarch64.md (<pauth_mnem_prefix>sp): Add check for
        signing key and scope selected.
        * config/aarch64/aarch64.md (<pauth_mnem_prefix>1716): Add check for
        signing key and scope selected.
        * config/aarch64/aarch64.opt (msign-return-address=): Deprecate.
        * config/aarch64/iterators.md (PAUTH_LR_SP): Add UNSPEC_AUTIASP,
        UNSPEC_AUTIBSP, UNSPEC_PACIASP, UNSPEC_PACIBSP.
        * config/aarch64/iterators.md (PAUTH_17_16): Add UNSPEC_AUTIA1716,
        UNSPEC_AUTIB1716, UNSPEC_PACIA1716, UNSPEC_PACIB1716.
        * config/aarch64/iterators.md (pauth_mnem_prefix): Add UNSPEC_AUTIA1716,
        UNSPEC_AUTIB1716, UNSPEC_PACIA1716, UNSPEC_PACIB1716, UNSPEC_AUTIASP,
        UNSPEC_AUTIBSP, UNSPEC_PACIASP, UNSPEC_PACIBSP.
        * config/aarch64/iterators.md (pauth_hint_num_a): Replace
        UNSPEC_PACI1716 and UNSPEC_AUTI1716 with UNSPEC_PACIA1716 and
        UNSPEC_AUTIA1716 respectively.
        * config/aarch64/iterators.md (pauth_hint_num_b): New int attribute.

gcc/testsuite
2018-11-02  Sam Tebbs<[hidden email]>

        * gcc.target/aarch64/return_address_sign_1.c (dg-final): Replace
        "autiasp" and "paciasp" with "hint\t29 // autisp" and
        "hint\t25 // pacisp" respectively.
        * gcc.target/aarch64/return_address_sign_2.c (dg-final): Replace
        "paciasp" with "hint\t25 // pacisp".
        * gcc.target/aarch64/return_address_sign_3.c (dg-final): Replace
        "paciasp" and "autiasp" with "pacisp" and "autisp" respectively.
        * gcc.target/aarch64/return_address_sign_b_1.c: New file.
        * gcc.target/aarch64/return_address_sign_b_2.c: New file.
        * gcc.target/aarch64/return_address_sign_b_3.c: New file.
        * gcc.target/aarch64/return_address_sign_b_exception.c: New file.
        * gcc.target/aarch64/return_address_sign_builtin.c: New file

libgcc/
2018-11-02  Sam Tebbs<[hidden email]>

        * config/aarch64/aarch64-unwind.h (aarch64_cie_signed_with_b_key): New
        function.
        * config/aarch64/aarch64-unwind.h (aarch64_post_extract_frame_addr,
        aarch64_post_frob_eh_handler_addr): Add check for b-key.
        * unwind-dw2-fde.c (get_cie_encoding): Add check for 'B' in augmentation
        string.
        * unwind-dw2.c (extract_cie_info): Add check for 'B' in augmentation
        string.


latest.patch (38K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 3/3][GCC][AARCH64] Add support for pointer authentication B key

Sam Tebbs
On 11/02/2018 05:35 PM, Sam Tebbs wrote:

> Hi all,
>
> This patch adds support for the Armv8.3-A pointer authentication instructions
> that use the B-key (pacib*, autib* and retab). This required adding builtins for
> pacib1716 and autib1716, adding the "b-key" feature to the -mbranch-protection
> option, and required emitting a new CFI directive ".cfi_b_key_frame" which
> causes GAS to add 'B' to the CIE augmentation string. I also had to add a new
> hook called ASM_POST_CFI_STARTPROC which is triggered when the .cfi_startproc
> directive is emitted.
>
> The libgcc stack unwinder has been amended to authenticate return addresses
> with the B key when the function has been signed with the B key.
>
> The previous patch in this series is here:
> https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00104.html
>
> Bootstrapped successfully and regression tested on aarch64-none-elf.
>
> OK for trunk?
>
> gcc/
> 2018-11-02  Sam Tebbs  <[hidden email]>
>
> * config/aarch64/aarch64-builtins.c (aarch64_builtins): Add
> AARCH64_PAUTH_BUILTIN_AUTIB1716 and AARCH64_PAUTH_BUILTIN_PACIB1716.
> * config/aarch64/aarch64-builtins.c (aarch64_init_pauth_hint_builtins):
> Add autib1716 and pacib1716 initialisation.
> * config/aarch64/aarch64-builtins.c (aarch64_expand_builtin): Add checks
> for autib1716 and pacib1716.
> * config/aarch64/aarch64-protos.h (aarch64_key_type,
> aarch64_post_cfi_startproc): Define.
> * config/aarch64/aarch64-protos.h (aarch64_ra_sign_key): Define extern.
> * config/aarch64/aarch64.c (aarch64_return_address_signing_enabled): Add
> check for b-key, remove frame.laid_out assertion.
> * config/aarch64/aarch64.c (aarch64_ra_sign_key,
> aarch64_post_cfi_startproc, aarch64_handle_pac_ret_b_key): Define.
> * config/aarch64/aarch64.h (TARGET_ASM_POST_CFI_STARTPROC): Define.
> * config/aarch64/aarch64.c (aarch64_pac_ret_subtypes): Add "b-key".
> * config/aarch64/aarch64.md (unspec): Add UNSPEC_AUTIA1716,
> UNSPEC_AUTIB1716, UNSPEC_AUTIASP, UNSPEC_AUTIBSP, UNSPEC_PACIA1716,
> UNSPEC_PACIB1716, UNSPEC_PACIASP, UNSPEC_PACIBSP.
> * config/aarch64/aarch64.md (do_return): Add check for b-key.
> * config/aarch64/aarch64.md (<pauth_mnem_prefix>sp): Add check for
> signing key and scope selected.
> * config/aarch64/aarch64.md (<pauth_mnem_prefix>1716): Add check for
> signing key and scope selected.
> * config/aarch64/aarch64.opt (msign-return-address=): Deprecate.
> * config/aarch64/iterators.md (PAUTH_LR_SP): Add UNSPEC_AUTIASP,
> UNSPEC_AUTIBSP, UNSPEC_PACIASP, UNSPEC_PACIBSP.
> * config/aarch64/iterators.md (PAUTH_17_16): Add UNSPEC_AUTIA1716,
> UNSPEC_AUTIB1716, UNSPEC_PACIA1716, UNSPEC_PACIB1716.
> * config/aarch64/iterators.md (pauth_mnem_prefix): Add UNSPEC_AUTIA1716,
> UNSPEC_AUTIB1716, UNSPEC_PACIA1716, UNSPEC_PACIB1716, UNSPEC_AUTIASP,
> UNSPEC_AUTIBSP, UNSPEC_PACIASP, UNSPEC_PACIBSP.
> * config/aarch64/iterators.md (pauth_hint_num_a): Replace
> UNSPEC_PACI1716 and UNSPEC_AUTI1716 with UNSPEC_PACIA1716 and
> UNSPEC_AUTIA1716 respectively.
> * config/aarch64/iterators.md (pauth_hint_num_b): New int attribute.
>
> gcc/testsuite
> 2018-11-02  Sam Tebbs  <[hidden email]>
>
> * gcc.target/aarch64/return_address_sign_1.c (dg-final): Replace
> "autiasp" and "paciasp" with "hint\t29 // autisp" and
> "hint\t25 // pacisp" respectively.
> * gcc.target/aarch64/return_address_sign_2.c (dg-final): Replace
> "paciasp" with "hint\t25 // pacisp".
> * gcc.target/aarch64/return_address_sign_3.c (dg-final): Replace
> "paciasp" and "autiasp" with "pacisp" and "autisp" respectively.
> * gcc.target/aarch64/return_address_sign_b_1.c: New file.
> * gcc.target/aarch64/return_address_sign_b_2.c: New file.
> * gcc.target/aarch64/return_address_sign_b_3.c: New file.
> * gcc.target/aarch64/return_address_sign_b_exception.c: New file.
> * gcc.target/aarch64/return_address_sign_builtin.c: New file
>
> libgcc/
> 2018-11-02  Sam Tebbs  <[hidden email]>
>
> * config/aarch64/aarch64-unwind.h (aarch64_cie_signed_with_b_key): New
> function.
> * config/aarch64/aarch64-unwind.h (aarch64_post_extract_frame_addr,
> aarch64_post_frob_eh_handler_addr): Add check for b-key.
> * unwind-dw2-fde.c (get_cie_encoding): Add check for 'B' in augmentation
> string.
> * unwind-dw2.c (extract_cie_info): Add check for 'B' in augmentation
> string.
Attached is an updated patch rebased on an improvement to the
-mbranch-protection option documentation.

latest.diff (34K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 3/3][GCC][AARCH64] Add support for pointer authentication B key

Sam Tebbs
On 11/02/2018 06:01 PM, Sam Tebbs wrote:

> On 11/02/2018 05:35 PM, Sam Tebbs wrote:
>
>> Hi all,
>>
>> This patch adds support for the Armv8.3-A pointer authentication instructions
>> that use the B-key (pacib*, autib* and retab). This required adding builtins for
>> pacib1716 and autib1716, adding the "b-key" feature to the -mbranch-protection
>> option, and required emitting a new CFI directive ".cfi_b_key_frame" which
>> causes GAS to add 'B' to the CIE augmentation string. I also had to add a new
>> hook called ASM_POST_CFI_STARTPROC which is triggered when the .cfi_startproc
>> directive is emitted.
>>
>> The libgcc stack unwinder has been amended to authenticate return addresses
>> with the B key when the function has been signed with the B key.
>>
>> The previous patch in this series is here:
>> https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00104.html
>>
>> Bootstrapped successfully and regression tested on aarch64-none-elf.
>>
>> OK for trunk?
>>
>> gcc/
>> 2018-11-02  Sam Tebbs  <[hidden email]>
>>
>> * config/aarch64/aarch64-builtins.c (aarch64_builtins): Add
>> AARCH64_PAUTH_BUILTIN_AUTIB1716 and AARCH64_PAUTH_BUILTIN_PACIB1716.
>> * config/aarch64/aarch64-builtins.c (aarch64_init_pauth_hint_builtins):
>> Add autib1716 and pacib1716 initialisation.
>> * config/aarch64/aarch64-builtins.c (aarch64_expand_builtin): Add checks
>> for autib1716 and pacib1716.
>> * config/aarch64/aarch64-protos.h (aarch64_key_type,
>> aarch64_post_cfi_startproc): Define.
>> * config/aarch64/aarch64-protos.h (aarch64_ra_sign_key): Define extern.
>> * config/aarch64/aarch64.c (aarch64_return_address_signing_enabled): Add
>> check for b-key, remove frame.laid_out assertion.
>> * config/aarch64/aarch64.c (aarch64_ra_sign_key,
>> aarch64_post_cfi_startproc, aarch64_handle_pac_ret_b_key): Define.
>> * config/aarch64/aarch64.h (TARGET_ASM_POST_CFI_STARTPROC): Define.
>> * config/aarch64/aarch64.c (aarch64_pac_ret_subtypes): Add "b-key".
>> * config/aarch64/aarch64.md (unspec): Add UNSPEC_AUTIA1716,
>> UNSPEC_AUTIB1716, UNSPEC_AUTIASP, UNSPEC_AUTIBSP, UNSPEC_PACIA1716,
>> UNSPEC_PACIB1716, UNSPEC_PACIASP, UNSPEC_PACIBSP.
>> * config/aarch64/aarch64.md (do_return): Add check for b-key.
>> * config/aarch64/aarch64.md (<pauth_mnem_prefix>sp): Add check for
>> signing key and scope selected.
>> * config/aarch64/aarch64.md (<pauth_mnem_prefix>1716): Add check for
>> signing key and scope selected.
>> * config/aarch64/aarch64.opt (msign-return-address=): Deprecate.
>> * config/aarch64/iterators.md (PAUTH_LR_SP): Add UNSPEC_AUTIASP,
>> UNSPEC_AUTIBSP, UNSPEC_PACIASP, UNSPEC_PACIBSP.
>> * config/aarch64/iterators.md (PAUTH_17_16): Add UNSPEC_AUTIA1716,
>> UNSPEC_AUTIB1716, UNSPEC_PACIA1716, UNSPEC_PACIB1716.
>> * config/aarch64/iterators.md (pauth_mnem_prefix): Add UNSPEC_AUTIA1716,
>> UNSPEC_AUTIB1716, UNSPEC_PACIA1716, UNSPEC_PACIB1716, UNSPEC_AUTIASP,
>> UNSPEC_AUTIBSP, UNSPEC_PACIASP, UNSPEC_PACIBSP.
>> * config/aarch64/iterators.md (pauth_hint_num_a): Replace
>> UNSPEC_PACI1716 and UNSPEC_AUTI1716 with UNSPEC_PACIA1716 and
>> UNSPEC_AUTIA1716 respectively.
>> * config/aarch64/iterators.md (pauth_hint_num_b): New int attribute.
>>
>> gcc/testsuite
>> 2018-11-02  Sam Tebbs  <[hidden email]>
>>
>> * gcc.target/aarch64/return_address_sign_1.c (dg-final): Replace
>> "autiasp" and "paciasp" with "hint\t29 // autisp" and
>> "hint\t25 // pacisp" respectively.
>> * gcc.target/aarch64/return_address_sign_2.c (dg-final): Replace
>> "paciasp" with "hint\t25 // pacisp".
>> * gcc.target/aarch64/return_address_sign_3.c (dg-final): Replace
>> "paciasp" and "autiasp" with "pacisp" and "autisp" respectively.
>> * gcc.target/aarch64/return_address_sign_b_1.c: New file.
>> * gcc.target/aarch64/return_address_sign_b_2.c: New file.
>> * gcc.target/aarch64/return_address_sign_b_3.c: New file.
>> * gcc.target/aarch64/return_address_sign_b_exception.c: New file.
>> * gcc.target/aarch64/return_address_sign_builtin.c: New file
>>
>> libgcc/
>> 2018-11-02  Sam Tebbs  <[hidden email]>
>>
>> * config/aarch64/aarch64-unwind.h (aarch64_cie_signed_with_b_key): New
>> function.
>> * config/aarch64/aarch64-unwind.h (aarch64_post_extract_frame_addr,
>> aarch64_post_frob_eh_handler_addr): Add check for b-key.
>> * unwind-dw2-fde.c (get_cie_encoding): Add check for 'B' in augmentation
>> string.
>> * unwind-dw2.c (extract_cie_info): Add check for 'B' in augmentation
>> string.
> Attached is an updated patch rebased on an improvement to the
> -mbranch-protection option documentation.

ping