]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - arch/arm/cpu/armv8/exceptions.S
Merge git://git.denx.de/u-boot-sunxi
[people/ms/u-boot.git] / arch / arm / cpu / armv8 / exceptions.S
index b91a1b662f47c3fce8e8049890f887d87475fed9..8c7c1d3eb80f6883595927e0509d5705be60799d 100644 (file)
@@ -7,18 +7,70 @@
 
 #include <asm-offsets.h>
 #include <config.h>
-#include <version.h>
 #include <asm/ptrace.h>
 #include <asm/macro.h>
 #include <linux/linkage.h>
 
+/*
+ * Exception vectors.
+ */
+       .align  11
+       .globl  vectors
+vectors:
+       .align  7               /* Current EL Synchronous Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_sync
+       b       exception_exit
+
+       .align  7               /* Current EL IRQ Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_irq
+       b       exception_exit
+
+       .align  7               /* Current EL FIQ Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_fiq
+       b       exception_exit
+
+       .align  7               /* Current EL Error Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_error
+       b       exception_exit
+
+       .align  7                /* Current EL Synchronous Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_sync
+       b       exception_exit
+
+       .align  7                /* Current EL IRQ Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_irq
+       b       exception_exit
+
+       .align  7                /* Current EL FIQ Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_fiq
+       b       exception_exit
+
+       .align  7                /* Current EL Error Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_error
+       b       exception_exit
+
 /*
  * Enter Exception.
  * This will save the processor state that is ELR/X0~X30
  * to the stack frame.
  */
-.macro exception_entry
-       stp     x29, x30, [sp, #-16]!
+_exception_entry:
        stp     x27, x28, [sp, #-16]!
        stp     x25, x26, [sp, #-16]!
        stp     x23, x24, [sp, #-16]!
 0:
        stp     x2, x0, [sp, #-16]!
        mov     x0, sp
-.endm
-
-/*
- * Exception vectors.
- */
-       .align  11
-       .globl  vectors
-vectors:
-       .align  7
-       b       _do_bad_sync    /* Current EL Synchronous Thread */
-
-       .align  7
-       b       _do_bad_irq     /* Current EL IRQ Thread */
-
-       .align  7
-       b       _do_bad_fiq     /* Current EL FIQ Thread */
-
-       .align  7
-       b       _do_bad_error   /* Current EL Error Thread */
-
-       .align  7
-       b       _do_sync        /* Current EL Synchronous Handler */
-
-       .align  7
-       b       _do_irq         /* Current EL IRQ Handler */
-
-       .align  7
-       b       _do_fiq         /* Current EL FIQ Handler */
-
-       .align  7
-       b       _do_error       /* Current EL Error Handler */
-
-
-_do_bad_sync:
-       exception_entry
-       bl      do_bad_sync
+       ret
 
-_do_bad_irq:
-       exception_entry
-       bl      do_bad_irq
-
-_do_bad_fiq:
-       exception_entry
-       bl      do_bad_fiq
-
-_do_bad_error:
-       exception_entry
-       bl      do_bad_error
-
-_do_sync:
-       exception_entry
-       bl      do_sync
-
-_do_irq:
-       exception_entry
-       bl      do_irq
-
-_do_fiq:
-       exception_entry
-       bl      do_fiq
 
-_do_error:
-       exception_entry
-       bl      do_error
+exception_exit:
+       ldp     x2, x0, [sp],#16
+       switch_el x11, 3f, 2f, 1f
+3:     msr     elr_el3, x2
+       b       0f
+2:     msr     elr_el2, x2
+       b       0f
+1:     msr     elr_el1, x2
+0:
+       ldp     x1, x2, [sp],#16
+       ldp     x3, x4, [sp],#16
+       ldp     x5, x6, [sp],#16
+       ldp     x7, x8, [sp],#16
+       ldp     x9, x10, [sp],#16
+       ldp     x11, x12, [sp],#16
+       ldp     x13, x14, [sp],#16
+       ldp     x15, x16, [sp],#16
+       ldp     x17, x18, [sp],#16
+       ldp     x19, x20, [sp],#16
+       ldp     x21, x22, [sp],#16
+       ldp     x23, x24, [sp],#16
+       ldp     x25, x26, [sp],#16
+       ldp     x27, x28, [sp],#16
+       ldp     x29, x30, [sp],#16
+       eret