This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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?

Matt Leach

2013-11-26  Matthew Leach  <>

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

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
+#define MOVZ_X8_8B	0xd2801168
+#define SVC_0		0xd4000001
 #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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]