summaryrefslogtreecommitdiff
path: root/libgcc/config
diff options
context:
space:
mode:
authorMatthew Leach <matthew.leach@arm.com>2013-11-28 10:59:38 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2013-11-28 10:59:38 +0000
commitcceeb9a978fefd34dd6c3cc0dfc594e9eef1e14a (patch)
tree85f01629835f234fd552da8db3b4e653d414b57e /libgcc/config
parent506cb36189212c2237b9c2e617a57edda3ecd736 (diff)
downloadgcc-cceeb9a978fefd34dd6c3cc0dfc594e9eef1e14a.tar.gz
linux-unwind.h (aarch64_fallback_frame_state): Check for correct opcodes on BE.
2013-11-26 Matthew Leach <matthew.leach@arm.com> * config/aarch64/linux-unwind.h (aarch64_fallback_frame_state): Check for correct opcodes on BE. From-SVN: r205479
Diffstat (limited to 'libgcc/config')
-rw-r--r--libgcc/config/aarch64/linux-unwind.h15
1 files changed, 14 insertions, 1 deletions
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 <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;
}