commit 8daf3f3bbd5f2f0949eb308fbaf9f4b01b98d4b9
parent 79ac708e61b0e12d51916dea4f548b3968fb6e39
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Sun, 14 Oct 2018 14:45:56 +0100
[arm64] Split out exception handling to arch.s
Change-Id: I58fde4219adc9deaa81f803e69767c8e1d4a7640
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
2 files changed, 68 insertions(+), 67 deletions(-)
diff --git a/arch/arm64/arch.s b/arch/arm64/arch.s
@@ -9,8 +9,7 @@ DAIF_DBG = 4
.globl read_id_aa64rmfr0_r,write_id_aa64rmfr0_r
.globl read_rcr_r,write_rcr_r,read_rdscr_r,write_rdscr_r
.globl read_sctlr_rwrite_sctlr_r,
- .globl read_rvbar_el3
- .globl swtch
+ .globl read_rvbar_el3,vectbl,swtch
.align 2
panic:
@@ -109,6 +108,73 @@ read_rvbar_el3:
mrs x0,rvbar_el3
ret
+_badtrap:
+ adr x0,unexpected
+ b panic
+
+_synchdl:
+ stp x1,x0,[sp,#-16]!
+ stp x3,x2,[sp,#-16]!
+ stp x5,x4,[sp,#-16]!
+ stp x7,x6,[sp,#-16]!
+ stp x9,x8,[sp,#-16]!
+ stp x11,x10,[sp,#-16]!
+ stp x13,x12,[sp,#-16]!
+ stp x15,x14,[sp,#-16]!
+ stp x17,x16,[sp,#-16]!
+ stp x19,x18,[sp,#-16]!
+ stp x21,x20,[sp,#-16]!
+ stp x23,x22,[sp,#-16]!
+ stp x25,x24,[sp,#-16]!
+ stp x27,x26,[sp,#-16]!
+ stp x29,x28,[sp,#-16]!
+ stp xzr,x30,[sp,#-16]! /* SP = 0, only useful in panic() */
+
+ mrs x1,S3_6_C4_C0_6 /* SPSR_R */
+ mrs x0,S3_6_C4_C0_3 /* ELR_R */
+ stp x1,x0,[sp,#-16]!
+
+ mrs x1,S3_6_C6_C0_6 /* FAR_R */
+ mrs x0,S3_6_C5_C2_6 /* ESR_R */
+ stp x1,x0,[sp,#-16]!
+
+ mov x0,sp
+ bl synchdl
+ adr x0,outsync
+ b panic
+
+outsync:
+ .asciz "out of sync"
+
+unexpected:
+ .asciz "unexpected exception"
+
+ .align 11
+vectbl:
+ /* Current EL with SP0 */
+ b _badtrap; nop /* Sync */
+ b _badtrap; nop /* IRQ/vIRQ */
+ b _badtrap; nop /* FIQ/vFIQ */
+ b _badtrap; nop /* SError/VSError */
+
+ /* Current EL with SPx */
+ b _badtrap; nop /* Sync */
+ b _badtrap; nop /* IRQ/vIRQ */
+ b _badtrap; nop /* FIQ/vFIQ */
+ b _badtrap; nop /* SError/VSError */
+
+ /* Lower EL using AArch64 */
+ b _synchdl; nop /* Sync */
+ b _badtrap; nop /* IRQ/vIRQ */
+ b _badtrap; nop /* FIQ/vFIQ */
+ b _badtrap; nop /* SError/VSError */
+
+ /* Lower EL using AArch32 */
+ b _synchdl; nop /* Sync */
+ b _badtrap; nop /* IRQ/vIRQ */
+ b _badtrap; nop /* FIQ/vFIQ */
+ b _badtrap; nop /* SError/VSError */
+
swtch:
mov sp,x0
ldp x1,x0,[sp],#16
diff --git a/arch/arm64/crt-none.s b/arch/arm64/crt-none.s
@@ -30,70 +30,5 @@ _start:
adr x0,outsync
b panic
-_badtrap:
- adr x0,unexpected
- b panic
-
-/* Top level arm64 Sync exception handler */
-_synchdl:
- stp x1,x0,[sp,#-16]!
- stp x3,x2,[sp,#-16]!
- stp x5,x4,[sp,#-16]!
- stp x7,x6,[sp,#-16]!
- stp x9,x8,[sp,#-16]!
- stp x11,x10,[sp,#-16]!
- stp x13,x12,[sp,#-16]!
- stp x15,x14,[sp,#-16]!
- stp x17,x16,[sp,#-16]!
- stp x19,x18,[sp,#-16]!
- stp x21,x20,[sp,#-16]!
- stp x23,x22,[sp,#-16]!
- stp x25,x24,[sp,#-16]!
- stp x27,x26,[sp,#-16]!
- stp x29,x28,[sp,#-16]!
- stp xzr,x30,[sp,#-16]! /* SP = 0, only useful in panic() */
-
- mrs x1,S3_6_C4_C0_6 /* SPSR_R */
- mrs x0,S3_6_C4_C0_3 /* ELR_R */
- stp x1,x0,[sp,#-16]!
-
- mrs x1,S3_6_C6_C0_6 /* FAR_R */
- mrs x0,S3_6_C5_C2_6 /* ESR_R */
- stp x1,x0,[sp,#-16]!
-
- mov x0,sp
- bl synchdl
- adr x0,outsync
- b panic
-
outsync:
.asciz "out of sync"
-
-unexpected:
- .asciz "unexpected exception"
-
- .align 11
-vectbl:
- /* Current EL with SP0 */
- b _badtrap; nop /* Sync */
- b _badtrap; nop /* IRQ/vIRQ */
- b _badtrap; nop /* FIQ/vFIQ */
- b _badtrap; nop /* SError/VSError */
-
- /* Current EL with SPx */
- b _badtrap; nop /* Sync */
- b _badtrap; nop /* IRQ/vIRQ */
- b _badtrap; nop /* FIQ/vFIQ */
- b _badtrap; nop /* SError/VSError */
-
- /* Lower EL using AArch64 */
- b _synchdl; nop /* Sync */
- b _badtrap; nop /* IRQ/vIRQ */
- b _badtrap; nop /* FIQ/vFIQ */
- b _badtrap; nop /* SError/VSError */
-
- /* Lower EL using AArch32 */
- b _synchdl; nop /* Sync */
- b _badtrap; nop /* IRQ/vIRQ */
- b _badtrap; nop /* FIQ/vFIQ */
- b _badtrap; nop /* SError/VSError */