[binutils-gdb] aarch64 SFrame: skip with warning new CFI directive used with pauth_lr

Matthieu Longo mlongo@sourceware.org
Tue Jan 14 10:54:24 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=59449a2b21c94b0e1f6cedc278a1beebafaa5111

commit 59449a2b21c94b0e1f6cedc278a1beebafaa5111
Author: Matthieu Longo <matthieu.longo@arm.com>
Date:   Thu Nov 21 18:44:22 2024 +0000

    aarch64 SFrame: skip with warning new CFI directive used with pauth_lr
    
    Today, SFrame v2 specification does not describe how to encode the
    information corresponding to the PAuth_LR PAC signing method (it only
    supports PAuth PAC signing method).
    SFrame v3 specification should hopefully specify it.
    
    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.
    
    Approved-by: Indu Bhagat <indu.bhagat@oracle.com>

Diff:
---
 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(+)

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index 960c22e05f5..85d2f03a55c 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..3c21d5ce887
--- /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 extension 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-cvs mailing list