diff mbox

[v2] libgcc: AArch64: Check for correct signal insns on BE when unwinding

Message ID 1385548984-24298-1-git-send-email-matthew.leach@arm.com
State New
Headers show

Commit Message

Matthew Leach Nov. 27, 2013, 10:43 a.m. UTC
Hi,

When unwinding the stack, the unwind code checks for two opcodes that
denote a registrations of a signal handler. This is broken on BE as
the opcodes will be in the wrong byte-order as insns are always LE.

Add the correct checks when compiling for AArch64 big endian.

This patch fixes all glibc backtrace tests and causes no other
regressions on glibc.

Please note that I don't have commit access, if this is OK could
someone merge it for me?

Thanks,
Matt Leach

libgcc/
2013-11-26  Matthew Leach  <matthew.leach@arm.com>

	* config/aarch64/linux-unwind.h (aarch64_fallback_frame_state):
	Check for correct opcodes on BE.

Comments

Richard Earnshaw Nov. 28, 2013, 10:59 a.m. UTC | #1
On 27/11/13 10:43, Matthew Leach wrote:
> Hi,
> 
> When unwinding the stack, the unwind code checks for two opcodes that
> denote a registrations of a signal handler. This is broken on BE as
> the opcodes will be in the wrong byte-order as insns are always LE.
> 
> Add the correct checks when compiling for AArch64 big endian.
> 
> This patch fixes all glibc backtrace tests and causes no other
> regressions on glibc.
> 
> Please note that I don't have commit access, if this is OK could
> someone merge it for me?
> 
> Thanks,
> Matt Leach
> 
> libgcc/
> 2013-11-26  Matthew Leach  <matthew.leach@arm.com>
> 
> 	* config/aarch64/linux-unwind.h (aarch64_fallback_frame_state):
> 	Check for correct opcodes on BE.
> 

Thanks, I've put this in.

R.
diff mbox

Patch

diff --git a/libgcc/config/aarch64/linux-unwind.h b/libgcc/config/aarch64/linux-unwind.h
index fde4d14..8b0d7fe 100644
--- a/libgcc/config/aarch64/linux-unwind.h
+++ b/libgcc/config/aarch64/linux-unwind.h
@@ -25,6 +25,19 @@ 
 #include <signal.h>
 #include <sys/ucontext.h>
 
+
+/* Since insns are always stored LE, on a BE system the opcodes will
+   be loaded byte-reversed.  Therefore, define two sets of opcodes,
+   one for LE and one for BE.  */
+
+#if __AARCH64EB__
+#define MOVZ_X8_8B	0x681180d2
+#define SVC_0		0x010000d4
+#else
+#define MOVZ_X8_8B	0xd2801168
+#define SVC_0		0xd4000001
+#endif
+
 #define MD_FALLBACK_FRAME_STATE_FOR aarch64_fallback_frame_state
 
 static _Unwind_Reason_Code
@@ -55,7 +68,7 @@  aarch64_fallback_frame_state (struct _Unwind_Context *context,
      0xd2801168         movz x8, #0x8b
      0xd4000001         svc  0x0
    */
-  if (pc[0] != 0xd2801168 || pc[1] != 0xd4000001)
+  if (pc[0] != MOVZ_X8_8B || pc[1] != SVC_0)
     {
       return _URC_END_OF_STACK;
     }