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.le...@arm.com> * 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 +#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; } -- 1.7.9.5