9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
March/arm64/arch.s | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
March/arm64/crt-none.s | 65-----------------------------------------------------------------
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 */