[PATCH v3 4/4] aarch64 SFrame: skip with warning new CFI directive used with pauth_lr
Matthieu Longo
matthieu.longo@arm.com
Tue Jan 14 11:02:08 GMT 2025
On 2025-01-13 23:12, Indu Bhagat wrote:
> On 1/13/25 3:22 AM, Matthieu Longo wrote:
>> Today, SFrame v2 specification does not describe how to encode the
>> information corresponding to the PAC signing method.
>> SFrame v3 specification should hopefully specify it.
>>
>
> How about we add "Pauth_LR" as the specific PAC signing method in the
> statement above? Something like:
>
> "Today, SFrame V2 specification does not describe how to encode the
> information corresponding to the Pauth_LR PAC signing method (it only
> support Pauth PAC signing method). SFrame V3 ..."
>
Fixed.
>> In the meantime, if the GNU assembler finds .cfi_negate_ra_state_with_pc
>> and --gsframe is specified, it will output a warning to the user and
>> will fail to generate the FDE entry.
>>
>> A new SFrame test for .cfi_negate_ra_state_with_pc is also added to
>> reflect this issue.
>
> OK.
>
> Thanks for the patch
>
>> ---
>> gas/gen-sframe.c | 16 ++++++++++++
>> .../gas/cfi-sframe/cfi-sframe-aarch64-4.d | 25 +++++++++++++++++++
>> .../gas/cfi-sframe/cfi-sframe-aarch64-4.s | 23 +++++++++++++++++
>> gas/testsuite/gas/cfi-sframe/cfi-sframe.exp | 1 +
>> 4 files changed, 65 insertions(+)
>> create mode 100644 gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.d
>> create mode 100644 gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.s
>>
>> diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
>> index a3c40bdd735..e96b7c02d09 100644
>> --- a/gas/gen-sframe.c
>> +++ b/gas/gen-sframe.c
>> @@ -1272,6 +1272,19 @@ sframe_xlate_do_aarch64_negate_ra_state (struct
>> sframe_xlate_ctx *xlate_ctx,
>> return SFRAME_XLATE_OK;
>> }
>> +/* Translate DW_CFA_AARCH64_negate_ra_state_with_pc into SFrame context.
>> + Return SFRAME_XLATE_OK if success. */
>> +
>> +static int
>> +sframe_xlate_do_aarch64_negate_ra_state_with_pc (struct
>> sframe_xlate_ctx *xlate_ctx ATTRIBUTE_UNUSED,
>> + struct cfi_insn_data *cfi_insn
>> ATTRIBUTE_UNUSED)
>> +{
>> + as_warn (_("skipping SFrame FDE; .cfi_negate_ra_state_with_pc"));
>> + /* The used signing method should be encoded inside the FDE in
>> SFrame v3.
>> + For now, PAuth_LR extension is not supported with SFrame. */
>> + return SFRAME_XLATE_ERR_NOTREPRESENTED; /* Not represented. */
>> +}
>> +
>> /* Translate DW_CFA_GNU_window_save into SFrame context.
>> DW_CFA_GNU_window_save is a DWARF Sparc extension, but is
>> multiplexed with a
>> directive of DWARF AArch64 extension:
>> DW_CFA_AARCH64_negate_ra_state.
>> @@ -1387,6 +1400,9 @@ sframe_do_cfi_insn (struct sframe_xlate_ctx
>> *xlate_ctx,
>> case DW_CFA_GNU_window_save:
>> err = sframe_xlate_do_gnu_window_save (xlate_ctx, cfi_insn);
>> break;
>> + case DW_CFA_AARCH64_negate_ra_state_with_pc:
>> + err = sframe_xlate_do_aarch64_negate_ra_state_with_pc
>> (xlate_ctx, cfi_insn);
>> + break;
>> case DW_CFA_register:
>> err = sframe_xlate_do_register (xlate_ctx, cfi_insn);
>> break;
>> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.d b/
>> gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.d
>> new file mode 100644
>> index 00000000000..c81888b0021
>> --- /dev/null
>> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.d
>> @@ -0,0 +1,25 @@
>> +#as: --gsframe
>> +#objdump: --sframe=.sframe
>> +#name: SFrame cfi_negate_ra_state_with_pc test
>> +#warning: Warning: skipping SFrame FDE; \.cfi_negate_ra_state_with_pc
>> +
>> +## The support for .cfi_negate_ra_state_with_pc is currently pending
>> on SFrame
>> +## v3 (currently in development). The unimplemented support is
>> reported to the
>> +## user as a warning. Then the handler returns an error that will
>> cause no
>> +## creation of a SFrame FDE later (hence "Num FDEs: 0").
>> +## Note: this test will be expected to fail when the support of
>> PAuth_LR in
>> +## SFrame will be added, so will have to be fixed.
>> +
>> +#...
>> +Contents of the SFrame section .sframe:
>> +
>> + Header :
>> +
>> + Version: SFRAME_VERSION_2
>> + Flags: NONE
>> + Num FDEs: 0
>> + Num FREs: 0
>> +
>> + Function Index :
>> +
>> +#pass
>> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.s b/
>> gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.s
>> new file mode 100644
>> index 00000000000..5fec6740047
>> --- /dev/null
>> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-aarch64-4.s
>> @@ -0,0 +1,23 @@
>> +## ARMv9.5 enhanced the existing PAuth feature with a new extensio
>> called
>> +## PAuth_LR. It aims at hardening the PAC in a signed return address.
>> When
>> +## signing the return address in LR, the PC is used as a diversifier, in
>> +## addition to the SP to generate the PAC code.
>> +## As for PAuth, when the pointers are mangled with PAuth_LR, the
>> stack trace
>> +## generator needs to know so it can mask off the PAC from the
>> pointer value to
>> +## recover the return address, and conversely, skip doing so if the
>> pointers are
>> +## not mangled.
>> +##
>> +## .cfi_negate_ra_state_with_pc CFI directive is used to convey this
>> information.
>> +##
>> +## SFrame has currently no support for this. The support is expected
>> in SFrame
>> +## v3. This testcase ensures that the directive is understood, and
>> outputs
>> +## a warning to the user before failing to generate the FDE.
>> + .cfi_startproc
>> + .long 0
>> + .cfi_def_cfa_offset 16
>> + .cfi_negate_ra_state_with_pc
>> + .long 0
>> + .cfi_offset 29, -16
>> + .cfi_offset 30, -8
>> + .long 0
>> + .cfi_endproc
>> diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp b/gas/
>> testsuite/gas/cfi-sframe/cfi-sframe.exp
>> index 1de2c9f8037..b119b9da73d 100644
>> --- a/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp
>> +++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp
>> @@ -98,5 +98,6 @@ if { [istarget "aarch64*-*-*"] &&
>> [gas_sframe_check] } then {
>> run_dump_test "cfi-sframe-aarch64-1"
>> run_dump_test "cfi-sframe-aarch64-2"
>> run_dump_test "cfi-sframe-aarch64-3"
>> + run_dump_test "cfi-sframe-aarch64-4"
>> run_dump_test "cfi-sframe-aarch64-pac-ab-key-1"
>> }
>
More information about the Binutils
mailing list