aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/arch/arm64/exception_asm.S
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload/arch/arm64/exception_asm.S')
-rw-r--r--payloads/libpayload/arch/arm64/exception_asm.S61
1 files changed, 25 insertions, 36 deletions
diff --git a/payloads/libpayload/arch/arm64/exception_asm.S b/payloads/libpayload/arch/arm64/exception_asm.S
index c68ba5a7c6..8e69ddad86 100644
--- a/payloads/libpayload/arch/arm64/exception_asm.S
+++ b/payloads/libpayload/arch/arm64/exception_asm.S
@@ -35,11 +35,13 @@
* Move exception id into x1
* Branch to exception_handler
*/
-.macro eentry id
- stp x30, xzr, [sp, #-16]!
- bl exception_prologue
- mov x1, \id
- bl exception_handler
+.macro eentry lbl id
+ .align 7
+\lbl:
+ stp x30, xzr, [sp, #-16]!
+ bl exception_prologue
+ mov x1, \id
+ bl exception_handler
.endm
/* Exception table has 16 entries and each of 128 bytes
@@ -51,37 +53,22 @@
.global exception_table
exception_table:
- .align 7
-sync_el0:
- eentry #0
-
- .align 7
-irq_el0:
- eentry #0
-
- .align 7
-fiq_el0:
- eentry #0
-
- .align 7
-serror_el0:
- eentry #0
-
- .align 7
-sync_elx:
- eentry #1
-
- .align 7
-irq_elx:
- eentry #2
-
- .align 7
-fiq_elx:
- eentry #3
-
- .align 7
-serror_elx:
- eentry #4
+eentry sync_sp0,#0
+eentry irq_sp0,#1
+eentry fiq_sp0,#2
+eentry serror_sp0,#3
+eentry sync_spx,#4
+eentry irq_spx,#5
+eentry fiq_spx,#6
+eentry serror_spx,#7
+eentry sync_elx_64,#8
+eentry irq_elx_64,#9
+eentry fiq_elx_64,#10
+eentry serror_elx_64,#11
+eentry sync_elx_32,#12
+eentry irq_elx_32,#13
+eentry fiq_elx_32,#14
+eentry serror_elx_32,#15
exception_prologue:
/* Save all registers x0-x29 */
@@ -119,6 +106,8 @@ exception_handler:
/* Pop return address saved on stack */
ldp x0, x1, [sp], #16
+ msr elr_el3, x0
+ msr esr_el3, x1
/* Pop exception reason saved on stack, followed by regs x0-x30 */
ldp x0, x1, [sp], #16
ldp x2, x3, [sp], #16