From cceeb9a978fefd34dd6c3cc0dfc594e9eef1e14a Mon Sep 17 00:00:00 2001 From: Matthew Leach Date: Thu, 28 Nov 2013 10:59:38 +0000 Subject: [PATCH] linux-unwind.h (aarch64_fallback_frame_state): Check for correct opcodes on BE. 2013-11-26 Matthew Leach * config/aarch64/linux-unwind.h (aarch64_fallback_frame_state): Check for correct opcodes on BE. From-SVN: r205479 --- libgcc/ChangeLog | 5 +++++ libgcc/config/aarch64/linux-unwind.h | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 586372a3b6d..0107350d914 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,8 @@ +2013-11-26 Matthew Leach + + * config/aarch64/linux-unwind.h (aarch64_fallback_frame_state): Check + for correct opcodes on BE. + 2013-11-27 Uros Bizjak * soft-fp/op-4.h: Update from glibc. diff --git a/libgcc/config/aarch64/linux-unwind.h b/libgcc/config/aarch64/linux-unwind.h index fde4d1495e7..8b0d7fe39e1 100644 --- a/libgcc/config/aarch64/linux-unwind.h +++ b/libgcc/config/aarch64/linux-unwind.h @@ -25,6 +25,19 @@ #include #include + +/* 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; }