9os

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

commit 77c09e4eaef88497dc848858e95bb2f1d56bc249
parent a5df40904fa93a84f3709232f4615b504abed9ea
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date:   Fri, 26 Oct 2018 13:48:24 +0100

[arm64] Rework exception handling

Change-Id: I89c973c526172bef20d6f3d8f4dfe05ed26f52ac
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Co-authored-by: Roberto Vargas <roberto.vargas@arm.com>

Diffstat:
March/arm64/arch.s | 120+++++++++++++++++++++++++++++++++++++++++--------------------------------------
March/arm64/crt-none.s | 4+---
March/arm64/rom-none.c | 2+-
Minclude/rcode.h | 38+++++++++++++++++++-------------------
4 files changed, 84 insertions(+), 80 deletions(-)

diff --git a/arch/arm64/arch.s b/arch/arm64/arch.s @@ -97,42 +97,51 @@ halt: wfe b halt -dopanic: - msr spsel,#1 -exception: - 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]! - - mrs x0,S3_6_C4_C0_3 /* ELR_R */ - stp x0,x30,[sp,#-16]! - - mrs x1,S3_6_C5_C2_6 /* ESR_R */ - mrs x0,S3_6_C4_C0_6 /* SPSR_R */ - stp x1,x0,[sp,#-16]! - msr spsel,#0 mov x1,sp msr spsel,#1 mrs x0,S3_6_C6_C0_6 /* FAR_R */ - stp x1,x0,[sp,#-16]! + stp x1,x0,[sp,#16*17] mov x0,sp /* x0 = trapframe */ msr spsel,#0 - stp xzr,xzr,[sp,#-16]! + stp xzr,xzr,[sp,#16*18] mov x29,sp + +dopanic: +exception: + msr spsel,#1 + mov x15,sp + stp x0,x1,[sp,#-16*(18-0)] + stp x2,x3,[sp,#-16*(18-1)] + stp x4,x5,[sp,#-16*(18-2)] + stp x6,x7,[sp,#-16*(18-3)] + stp x8,x9,[sp,#-16*(18-4)] + stp x10,x11,[sp,#-16*(18-5)] + stp x12,x13,[sp,#-16*(18-6)] + stp x14,x15,[sp,#-16*(18-7)] + stp x16,x17,[sp,#-16*(18-8)] + stp x18,x19,[sp,#-16*(18-9)] + stp x20,x21,[sp,#-16*(18-10)] + stp x22,x23,[sp,#-16*(18-11)] + stp x24,x25,[sp,#-16*(18-12)] + stp x26,x27,[sp,#-16*(18-13)] + stp x28,x29,[sp,#-16*(18-14)] + + mrs x9,S3_6_C4_C0_3 /* ELR_R */ + stp x9,x30,[sp,#-16*(18-15)] + + mrs x9,S3_6_C4_C0_6 /* SPSR_R */ + mrs x10,S3_6_C5_C2_6 /* ESR_R */ + stp x9,x10,[sp,#-16*(18-16)] + + mov x9,sp + mrs x10,S3_6_C6_C0_6 /* FAR_R */ + stp x9,x10,[sp,#-16*(18-17)] + + sub sp,sp,#16*18 + mov x0,sp + mov x29,#0 bl trap adr x0,outsync b panic @@ -141,38 +150,35 @@ exception: outsync: .asciz "out of sync" - .text swtch: - ldp x2,x1,[x0],#16 - mov sp,x2 - msr spsel,#1 - mov sp,x0 + ldp x9,x10,[x0,#16*17] + msr S3_6_C6_C0_6,x10 /* FAR_R */ + add sp,x9,#16*18 + + ldp x9,x10,[x0,#16*16] + msr S3_6_C4_C0_6,x9 /* SPSR_R */ + msr S3_6_C5_C2_6,x10 /* ESR_R */ + + ldp x9,x30,[x0,#16*15] + msr S3_6_C4_C0_3,x9 /* ELR_R */ + + ldp x28,x29,[x0,#16*14] + ldp x26,x27,[x0,#16*13] + ldp x24,x25,[x0,#16*12] + ldp x22,x23,[x0,#16*11] + ldp x20,x21,[x0,#16*10] + ldp x18,x19,[x0,#16*9] + ldp x16,x17,[x0,#16*8] + ldp x14,x15,[x0,#16*7] + ldp x12,x13,[x0,#16*6] + ldp x10,x11,[x0,#16*5] + ldp x8,x9,[x0,#16*4] + ldp x6,x7,[x0,#16*3] + ldp x4,x5,[x0,#16*2] + ldp x2,x3,[x0,#16*1] + ldp x0,x1,[x0,#16*0] - msr S3_6_C6_C0_6,x1 /* FAR_R */ - - ldp x1,x0,[sp],#16 - msr S3_6_C5_C2_6,x1 /* ESR_R */ - msr S3_6_C4_C0_6,x0 /* SPSR_R */ - - ldp x0,x30,[sp],#16 - msr S3_6_C4_C0_3,x0 /* ELR_R */ - - ldp x29,x28,[sp],#16 - ldp x27,x26,[sp],#16 - ldp x25,x24,[sp],#16 - ldp x23,x22,[sp],#16 - ldp x21,x20,[sp],#16 - ldp x19,x18,[sp],#16 - ldp x17,x16,[sp],#16 - ldp x15,x14,[sp],#16 - ldp x13,x12,[sp],#16 - ldp x11,x10,[sp],#16 - ldp x9,x8,[sp],#16 - ldp x7,x6,[sp],#16 - ldp x5,x4,[sp],#16 - ldp x3,x2,[sp],#16 - ldp x1,x0,[sp],#16 eret .align 11 diff --git a/arch/arm64/crt-none.s b/arch/arm64/crt-none.s @@ -18,17 +18,15 @@ getpc: msr S3_6_C12_C0_6,x0 /* VBAR_R */ isb - msr spsel,#0 ldr x0,=SRAMADDR mov x1,#SRAMSIZE /* Stack grows down towards BSS */ add x0,x0,x1 mov sp,x0 - stp xzr,xzr,[sp,#-16]! - mov x29,sp mov x0,x19 ldr x1,=SRAMADDR mov x2,#SRAMSIZE + mov x29,#0 bl main adr x0,outsync b panic diff --git a/arch/arm64/rom-none.c b/arch/arm64/rom-none.c @@ -34,7 +34,7 @@ main(void *text, void *ram, size_t ramsiz) enaint(); isb(); - fp->sp = bp + (ramsiz - 16); + fp->sp = bp + (ramsiz - sizeof(*fp)); fp->elr = rd_rvbar_el3(); fp->spsr = 0xf << 6 | 0xd; diff --git a/include/rcode.h b/include/rcode.h @@ -89,29 +89,29 @@ struct rowidx { }; struct trapframe { - void *sp; - unsigned long long far; - - unsigned long long esr, spsr; + unsigned long long x0, x1; + unsigned long long x2, x3; + unsigned long long x4, x5; + unsigned long long x6, x7; + unsigned long long x8, x9; + unsigned long long x10, x11; + unsigned long long x12, x13; + unsigned long long x14, x15; + unsigned long long x16, x17; + unsigned long long x18, x19; + unsigned long long x20, x21; + unsigned long long x22, x23; + unsigned long long x24, x25; + unsigned long long x26, x27; + unsigned long long x28, x29; void *elr; unsigned long long x30; - unsigned long long x29,x28; - unsigned long long x27,x26; - unsigned long long x25,x24; - unsigned long long x23,x22; - unsigned long long x21,x20; - unsigned long long x19,x18; - unsigned long long x17,x16; - unsigned long long x15,x14; - unsigned long long x13,x12; - unsigned long long x11,x10; - unsigned long long x9, x8; - unsigned long long x7, x6; - unsigned long long x5, x4; - unsigned long long x3, x2; - unsigned long long x1, x0; + unsigned long long spsr, esr; + + void *sp; + unsigned long long far; }; struct rmucmd {