On 10/11/2022 10:37, Srinath Parvathaneni via Gcc-patches wrote:
Hi,

This patch adds support for Arm frame unwinding instruction "0xb5" [1]. When
an exception is taken and "0xb5" instruction is encounter during runtime
stack-unwinding, we use effective vsp as modifier in pointer authentication.
On completion of stack unwinding if "0xb5" instruction is not encountered
then CFA will be used as modifier in pointer authentication.

[1] https://github.com/ARM-software/abi-aa/releases/download/2022Q3/ehabi32.pdf

Regression tested on arm-none-eabi target and found no regressions.

Ok for master?

Regards,
Srinath.

gcc/ChangeLog:

2022-11-09  Srinath Parvathaneni  <srinath.parvathan...@arm.com>

         * libgcc/config/arm/pr-support.c (__gnu_unwind_execute): Decode opcode
        "0xb5".


###############     Attachment also inlined for ease of reply    ###############


diff --git a/libgcc/config/arm/pr-support.c b/libgcc/config/arm/pr-support.c
index 
e48854587c667a959aa66ccc4982231f63333ecc..73e4942a39b34a83c2da85def6b13e82ec501552
 100644
--- a/libgcc/config/arm/pr-support.c
+++ b/libgcc/config/arm/pr-support.c
@@ -107,7 +107,9 @@ __gnu_unwind_execute (_Unwind_Context * context, 
__gnu_unwind_state * uws)
    _uw op;
    int set_pc;
    int set_pac = 0;
+  int set_pac_sp = 0;
    _uw reg;
+  _uw sp;
set_pc = 0;
    for (;;)
@@ -124,10 +126,11 @@ __gnu_unwind_execute (_Unwind_Context * context, 
__gnu_unwind_state * uws)
  #if defined(TARGET_HAVE_PACBTI)
          if (set_pac)
            {
-             _uw sp;
              _uw lr;
              _uw pac;
-             _Unwind_VRS_Get (context, _UVRSC_CORE, R_SP, _UVRSD_UINT32, &sp);
+             if (!set_pac_sp)
+               _Unwind_VRS_Get (context, _UVRSC_CORE, R_SP, _UVRSD_UINT32,
+                                &sp);
              _Unwind_VRS_Get (context, _UVRSC_CORE, R_LR, _UVRSD_UINT32, &lr);
              _Unwind_VRS_Get (context, _UVRSC_PAC, R_IP,
                               _UVRSD_UINT32, &pac);
@@ -259,7 +262,19 @@ __gnu_unwind_execute (_Unwind_Context * context, 
__gnu_unwind_state * uws)
              continue;
            }
- if ((op & 0xfc) == 0xb4) /* Obsolete FPA. */
+         /* Use current VSP as modifier in PAC validation.  */
+         if (op == 0xb5)
+           {
+             if (set_pac)
+               _Unwind_VRS_Get (context, _UVRSC_CORE, R_SP, _UVRSD_UINT32,
+                                &sp);
+             else
+               return _URC_FAILURE;

I don't think you need to worry about the case when set_pac is false; in fact, I don't think you need to even test set_pac here. It's harmless if this opcode appears and then we never do the authentication, so just record the SP value at this point.

+             set_pac_sp = 1;
+             continue;
+           }
+
+         if ((op & 0xfd) == 0xb6)  /* Obsolete FPA.  */

No, this is logically impossible (0xfd is binary 1111_1101, while 0xb6 is binary 1011_110 and thus bit 2 will never be set after the mask). But you don't need to change the condition here at all, because we've already taken out the case you're worried about immediately above (and ended that block with a 'continue').

            return _URC_FAILURE;
 >             /* op & 0xf8 == 0xb8.  */




R.

Reply via email to