]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
aarch64 DWARF: add new CFI directive for PAuth_LR
authorMatthieu Longo <matthieu.longo@arm.com>
Mon, 25 Nov 2024 12:17:56 +0000 (12:17 +0000)
committerMatthieu Longo <matthieu.longo@arm.com>
Tue, 14 Jan 2025 10:53:21 +0000 (10:53 +0000)
This patch adds a new CFI directive (cfi_negate_ra_state_with_pc) which
set an additional bit in the RA state to inform that RA was signed with
SP but also PC as an additional diversifier.

RA state | Description
0b00     | Return address not signed (default if no cfi_negate_ra_state*)
0b01     | Return address signed with SP (cfi_negate_ra_state)
0b10     | Invalid state
0b11     | Return address signed with SP+PC (cfi_negate_ra_state_with_pc)

Approved-by: Indu Bhagat <indu.bhagat@oracle.com>
Approved-by: Jan Beulich <jbeulich@suse.com>
bfd/elf-eh-frame.c
binutils/dwarf.c
gas/dw2gencfi.c
gas/scfidw2gen.c
include/dwarf2.def

index d903e27a676d46c7c1ebe8114030053c61cdd589..b6f5078bb331410e29d245d70c283b71065568a5 100644 (file)
@@ -359,6 +359,7 @@ skip_cfa_op (bfd_byte **iter, bfd_byte *end, unsigned int encoded_ptr_width)
     case DW_CFA_remember_state:
     case DW_CFA_restore_state:
     case DW_CFA_GNU_window_save:
+    case DW_CFA_AARCH64_negate_ra_state_with_pc:
       /* No arguments.  */
       return true;
 
index 626efb2eb9a522c688accfd8800ba479650092cd..8e004cea8396a39508a05aaf4c8c0d3fbdc453f7 100644 (file)
@@ -10408,6 +10408,11 @@ display_debug_frames (struct dwarf_section *section,
              fc->pc_begin += ofs;
              break;
 
+           case DW_CFA_AARCH64_negate_ra_state_with_pc:
+             if (! do_debug_frames_interp)
+               printf ("  DW_CFA_AARCH64_negate_ra_state_with_pc\n");
+             break;
+
            case DW_CFA_GNU_window_save:
              if (! do_debug_frames_interp)
                printf ("  %s\n", DW_CFA_GNU_window_save_name[is_aarch64]);
index fbeb697af09fc0cc619f506d325bcc93370504b1..012af0ff33e025dc07215faff0761dcdb5c1b65f 100644 (file)
@@ -714,6 +714,7 @@ const pseudo_typeS cfi_pseudo_table[] =
     { "cfi_restore_state", dot_cfi, DW_CFA_restore_state },
     { "cfi_window_save", dot_cfi, DW_CFA_GNU_window_save },
     { "cfi_negate_ra_state", dot_cfi, DW_CFA_AARCH64_negate_ra_state },
+    { "cfi_negate_ra_state_with_pc", dot_cfi, DW_CFA_AARCH64_negate_ra_state_with_pc },
     { "cfi_escape", dot_cfi_escape, 0 },
     { "cfi_signal_frame", dot_cfi, CFI_signal_frame },
     { "cfi_personality", dot_cfi_personality, 0 },
@@ -914,6 +915,10 @@ dot_cfi (int arg)
       cfi_add_CFA_insn (DW_CFA_GNU_window_save);
       break;
 
+    case DW_CFA_AARCH64_negate_ra_state_with_pc:
+      cfi_add_CFA_insn (DW_CFA_AARCH64_negate_ra_state_with_pc);
+      break;
+
     case CFI_signal_frame:
       frchain_now->frch_cfi_data->cur_fde_data->signal_frame = 1;
       break;
@@ -1754,6 +1759,10 @@ output_cfi_insn (struct cfi_insn_data *insn)
       out_one (DW_CFA_GNU_window_save);
       break;
 
+    case DW_CFA_AARCH64_negate_ra_state_with_pc:
+      out_one (DW_CFA_AARCH64_negate_ra_state_with_pc);
+      break;
+
     case CFI_escape:
       {
        struct cfi_escape_data *e;
@@ -2212,6 +2221,7 @@ cfi_change_reg_numbers (struct cfi_insn_data *insn, segT ccseg)
        case DW_CFA_remember_state:
        case DW_CFA_restore_state:
        case DW_CFA_GNU_window_save:
+       case DW_CFA_AARCH64_negate_ra_state_with_pc:
        case CFI_escape:
        case CFI_label:
          break;
@@ -2619,14 +2629,16 @@ const pseudo_typeS cfi_pseudo_table[] =
     { "cfi_remember_state", dot_cfi_dummy, 0 },
     { "cfi_restore_state", dot_cfi_dummy, 0 },
     { "cfi_window_save", dot_cfi_dummy, 0 },
+    { "cfi_negate_ra_state", dot_cfi_dummy, 0 },
+    { "cfi_negate_ra_state_with_pc", dot_cfi_dummy, 0 },
     { "cfi_escape", dot_cfi_dummy, 0 },
     { "cfi_signal_frame", dot_cfi_dummy, 0 },
     { "cfi_personality", dot_cfi_dummy, 0 },
     { "cfi_personality_id", dot_cfi_dummy, 0 },
     { "cfi_lsda", dot_cfi_dummy, 0 },
     { "cfi_val_encoded_addr", dot_cfi_dummy, 0 },
-    { "cfi_label", dot_cfi_dummy, 0 },
     { "cfi_inline_lsda", dot_cfi_dummy, 0 },
+    { "cfi_label", dot_cfi_dummy, 0 },
     { "cfi_val_offset", dot_cfi_dummy, 0 },
     { NULL, NULL, 0 }
   };
index 7463207e17090a64c81cadee4b92fa14a6ae05f2..9b3ad4b13e01e7c5ffc4c2e9de5b33a50cde5e3d 100644 (file)
@@ -113,6 +113,7 @@ const pseudo_typeS scfi_pseudo_table[] =
     { "cfi_restore_state", dot_scfi_ignore, 0 },
     { "cfi_window_save", dot_scfi_ignore, 0 },
     { "cfi_negate_ra_state", dot_scfi_ignore, 0 },
+    { "cfi_negate_ra_state_with_pc", dot_scfi_ignore, 0 },
     { "cfi_escape", dot_scfi_ignore, 0 },
     { "cfi_personality", dot_scfi_ignore, 0 },
     { "cfi_personality_id", dot_scfi_ignore, 0 },
index 63cb35560e7c4cda1934d8137031f0668392c729..6d6c0e0cc3917c3571ec098ffaa848ab5b381454 100644 (file)
@@ -785,6 +785,8 @@ DW_CFA (DW_CFA_hi_user, 0x3f)
 
 /* SGI/MIPS specific.  */
 DW_CFA (DW_CFA_MIPS_advance_loc8, 0x1d)
+/* AArch64 extensions.  */
+DW_CFA (DW_CFA_AARCH64_negate_ra_state_with_pc, 0x2c)
 /* GNU extensions.
    NOTE: DW_CFA_GNU_window_save is multiplexed on Sparc and AArch64.  */
 DW_CFA (DW_CFA_GNU_window_save, 0x2d)