[gas] arm: Add support for new unwinder directive ".pacspval".
authorSrinath Parvathaneni <srinath.parvathaneni@arm.com>
Mon, 14 Nov 2022 15:13:17 +0000 (15:13 +0000)
committerSrinath Parvathaneni <srinath.parvathaneni@arm.com>
Mon, 14 Nov 2022 15:13:21 +0000 (15:13 +0000)
This patch adds the assembler support for the new unwinder
directive ".pacspval" and encodes this directives with opcode
"0xb5". This opcode indicates the unwinder to use effective
vsp as modifier for PAC validation.

gas/ChangeLog:

2022-11-07  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>

        * doc/c-arm.texi: Document directive.
        * config/tc-arm.c (s_arm_unwind_pacspval): Define function.
        (md_pseudo_table): Add entry for pacspval directive.
        * testsuite/gas/arm/ehabi-pacbti-m.d: New test.
        * testsuite/gas/arm/ehabi-pacbti-m.s: Likewise.

gas/config/tc-arm.c
gas/doc/c-arm.texi
gas/testsuite/gas/arm/ehabi-pacbti-m.d [new file with mode: 0644]
gas/testsuite/gas/arm/ehabi-pacbti-m.s [new file with mode: 0644]

index 8864286269301f418840a9cd7c3347016ef4db0b..8f0e8b08504be9efb750007a294e583cff6c15dc 100644 (file)
@@ -4929,6 +4929,22 @@ s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
   demand_empty_rest_of_line ();
 }
 
+/* Parse an unwind_pacspval directive.  */
+
+static void
+s_arm_unwind_pacspval (int ignored ATTRIBUTE_UNUSED)
+{
+  valueT op;
+
+  if (!unwind.proc_start)
+    as_bad (MISSING_FNSTART);
+
+  demand_empty_rest_of_line ();
+
+  op = 0xb5;
+  add_unwind_opcode (op, 1);
+}
+
 /* Parse an unwind_setfp directive.  */
 
 static void
@@ -5205,6 +5221,7 @@ const pseudo_typeS md_pseudo_table[] =
   { "vsave",           s_arm_unwind_save,      1 },
   { "movsp",           s_arm_unwind_movsp,     0 },
   { "pad",             s_arm_unwind_pad,       0 },
+  { "pacspval",                s_arm_unwind_pacspval,  0 },
   { "setfp",           s_arm_unwind_setfp,     0 },
   { "unwind_raw",      s_arm_unwind_raw,       0 },
   { "eabi_attribute",  s_arm_eabi_attribute,   0 },
index 0605d326a210afcc025f063c2cc2b3937eeda178..0f432724d4e2528bb7409d325685a7fd8c7a5fd6 100644 (file)
@@ -1086,6 +1086,12 @@ This directive writes 12-byte packed floating-point values to the
 output section.  These are not compatible with current ARM processors
 or ABIs.
 
+@anchor{arm_pacspval}
+@cindex @code{.pacspval} directive, ARM
+@item .pacspval
+Generate unwinder annotations to use effective vsp as modifier in PAC
+validation.
+
 @anchor{arm_pad}
 @cindex @code{.pad} directive, ARM
 @item .pad #@var{count}
diff --git a/gas/testsuite/gas/arm/ehabi-pacbti-m.d b/gas/testsuite/gas/arm/ehabi-pacbti-m.d
new file mode 100644 (file)
index 0000000..6039945
--- /dev/null
@@ -0,0 +1,15 @@
+# name: Unwind Stack Frame information for Armv8.1-M.Mainline PAC extension
+# source: ehabi-pacbti-m.s
+# as: -march=armv8.1-m.main+mve+pacbti
+# readelf: -u
+
+Unwind section '.ARM.exidx' at offset 0x5c contains 1 entry:
+
+0x0: @0x0
+  Compact model index: 1
+  0xb1 0x08 pop {r3}
+  0x80 0x08 pop {r7}
+  0xb4      pop {ra_auth_code}
+  0x84 0x00 pop {r14}
+  0xb1 0x0f pop {r0, r1, r2, r3}
+  0xb5      vsp as modifier for PAC validation
diff --git a/gas/testsuite/gas/arm/ehabi-pacbti-m.s b/gas/testsuite/gas/arm/ehabi-pacbti-m.s
new file mode 100644 (file)
index 0000000..1018548
--- /dev/null
@@ -0,0 +1,38 @@
+        .syntax unified
+        .thumb
+        .thumb_func
+       .fnstart
+       .cfi_startproc
+       .pacspval
+       pac     ip, lr, sp
+       .cfi_register 143, 12
+       push    {r0, r1, r2, r3}
+       .save {r0, r1, r2, r3}
+       .cfi_def_cfa_offset 16
+       .cfi_offset 0, -16
+       .cfi_offset 1, -12
+       .cfi_offset 2, -8
+       .cfi_offset 3, -4
+       push    {r3, r7, ip, lr}
+       .save {r3, r7, ra_auth_code, lr}
+       .cfi_def_cfa_offset 32
+       .cfi_offset 3, -32
+       .cfi_offset 7, -28
+       .cfi_offset 143, -24
+       .cfi_offset 14, -20
+       pop     {r3, r7, ip, lr}
+       .cfi_restore 14
+       .cfi_restore 143
+       .cfi_restore 7
+       .cfi_restore 3
+       .cfi_def_cfa_offset 0
+       add     sp, sp, #16
+       .cfi_restore 3
+       .cfi_restore 2
+       .cfi_restore 1
+       .cfi_restore 0
+       .cfi_def_cfa_offset -16
+       aut     ip, lr, sp
+       bx      lr
+       .cfi_endproc
+       .fnend