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:
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 {