[ARM/FDPIC v6 13/24] [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture
authorChristophe Lyon <christophe.lyon@st.com>
Tue, 10 Sep 2019 07:58:44 +0000 (09:58 +0200)
committerChristophe Lyon <clyon@gcc.gnu.org>
Tue, 10 Sep 2019 07:58:44 +0000 (09:58 +0200)
Without this, when we are unwinding across a signal frame we can jump
to an even address which leads to an exception.

This is needed in __gnu_persnality_sigframe_fdpic() when restoring the
PC from the signal frame since the PC saved by the kernel has the LSB
bit set to zero.

2019-09-10  Christophe Lyon  <christophe.lyon@st.com>
Mickaël Guêné <mickael.guene@st.com>

libgcc/
* config/arm/unwind-arm.c (_Unwind_VRS_Set): Handle thumb-only
architecture.

Co-Authored-By: Mickaël Guêné <mickael.guene@st.com>
From-SVN: r275575

libgcc/ChangeLog
libgcc/config/arm/unwind-arm.c

index d6d73e9660b81271bb37ad5dc5dc29fd2ab068fc..d61374d6cfe6047ede0e9fec6af83684f67310a0 100644 (file)
@@ -1,7 +1,12 @@
 2019-09-10  Christophe Lyon  <christophe.lyon@st.com>
        Mickaël Guêné <mickael.guene@st.com>
 
-       libgcc/
+       * config/arm/unwind-arm.c (_Unwind_VRS_Set): Handle thumb-only
+       architecture.
+
+2019-09-10  Christophe Lyon  <christophe.lyon@st.com>
+       Mickaël Guêné <mickael.guene@st.com>
+
        * unwind-arm-common.inc (ARM_SET_R7_RT_SIGRETURN)
        (THUMB2_SET_R7_RT_SIGRETURN, FDPIC_LDR_R12_WITH_FUNCDESC)
        (FDPIC_LDR_R9_WITH_GOT, FDPIC_LDR_PC_WITH_RESTORER)
index 9ba73e72a2a76b8048ee456b762dbac7c13ae337..8313ee03e903b4f8a0873d4aa2e196624bc4ddd8 100644 (file)
@@ -199,6 +199,11 @@ _Unwind_VRS_Result _Unwind_VRS_Set (_Unwind_Context *context,
        return _UVRSR_FAILED;
 
       vrs->core.r[regno] = *(_uw *) valuep;
+#if defined(__thumb__)
+      /* Force LSB bit since we always run thumb code.  */
+      if (regno == R_PC)
+       vrs->core.r[regno] |= 1;
+#endif
       return _UVRSR_OK;
 
     case _UVRSC_VFP: