diff options
Diffstat (limited to 'aarch64/common/arm_builtins.h')
-rw-r--r-- | aarch64/common/arm_builtins.h | 14 |
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" \ |