aboutsummaryrefslogtreecommitdiff
path: root/aarch64/common/arm_builtins.h
diff options
context:
space:
mode:
Diffstat (limited to 'aarch64/common/arm_builtins.h')
-rw-r--r--aarch64/common/arm_builtins.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/aarch64/common/arm_builtins.h b/aarch64/common/arm_builtins.h
index 4e4417e..40326ef 100644
--- a/aarch64/common/arm_builtins.h
+++ b/aarch64/common/arm_builtins.h
@@ -3,7 +3,18 @@
#define __exception_return(_x0) asm volatile ("eret\n")
#define __set_exception_return(_elr) \
- asm volatile("msr elr_el1, %[elr]\n"::[elr] "r" (_elr))
+ asm volatile("mrs x7, currentel\n" \
+ "cmp x7, #0x4\n" \
+ "b.eq setelrel1\n" \
+ "cmp x7, #0x8\n" \
+ "b.eq setelrel2\n" \
+ "setelrel3: msr elr_el3, %[elr]\n" \
+ "b setelrdone\n" \
+ "setelrel2: msr elr_el2, %[elr]\n" \
+ "b setelrdone\n" \
+ "setelrel1: msr elr_el1, %[elr]\n" \
+ "setelrdone:\n":: [elr] "r" (_elr) : "r7")
+
#define __get_exception_return(_addr) \
asm volatile("mrs x0, currentel\n" \
"cmp x0, #0x4\n" \
@@ -16,6 +27,7 @@
"b elrdone\n" \
"elrel1: mrs %0, elr_el1\n" \
"elrdone:\n" : "=r" (_addr))
+
#define __get_exception_address(_addr) \
asm volatile("mrs x0, currentel\n" \
"cmp x0, #0x4\n" \