aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinath Parvathaneni <srinath.parvathaneni@arm.com>2023-01-23 11:13:18 +0000
committerSrinath Parvathaneni <srinath.parvathaneni@arm.com>2023-01-23 11:16:26 +0000
commit55a2d8096a799c682922b03bef7c0d4e4c1c8d7b (patch)
treeb24a2615e7f89c7ca433fa2b63d295b5e1e962be
parent273874e925a544d96b8a9999d4c870c1f5191eeb (diff)
downloadgcc-55a2d8096a799c682922b03bef7c0d4e4c1c8d7b.zip
gcc-55a2d8096a799c682922b03bef7c0d4e4c1c8d7b.tar.gz
gcc-55a2d8096a799c682922b03bef7c0d4e4c1c8d7b.tar.bz2
arm: Add support for new frame unwinding instruction "0xb5".
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 libgcc/ChangeLog: 2022-11-09 Srinath Parvathaneni <srinath.parvathaneni@arm.com> * config/arm/pr-support.c (__gnu_unwind_execute): Decode opcode "0xb5".
-rw-r--r--libgcc/config/arm/pr-support.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/libgcc/config/arm/pr-support.c b/libgcc/config/arm/pr-support.c
index abacfb6..9c9d4ee 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,6 +262,14 @@ __gnu_unwind_execute (_Unwind_Context * context, __gnu_unwind_state * uws)
continue;
}
+ /* Use current VSP as modifier in PAC validation. */
+ if (op == 0xb5)
+ {
+ _Unwind_VRS_Get (context, _UVRSC_CORE, R_SP, _UVRSD_UINT32, &sp);
+ set_pac_sp = 1;
+ continue;
+ }
+
if ((op & 0xfc) == 0xb4) /* Obsolete FPA. */
return _URC_FAILURE;