commit 9ac0b97e7387e98440366b71e0f48fd9b454f7d2
parent aeeb098661f45e12a9c2d72e9e70c65bbc19b342
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Sun, 14 Oct 2018 16:08:10 +0100
[arm64] Use SP_EL3R for pushing/popping contexts
Change-Id: I7e3178630d208fa77e083eb4b770fe467bb598a7
Signed-off-by: Roberto Vargas <roberto.vargas@arm.com>
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
5 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/arch/arm64/arch.s b/arch/arm64/arch.s
@@ -100,8 +100,7 @@ panic:
stp x25,x24,[sp,#-16]!
stp x27,x26,[sp,#-16]!
stp x29,x28,[sp,#-16]!
- mov x1,sp
- stp x1,x30,[sp,#-16]!
+ stp xzr,x30,[sp,#-16]!
mrs x3,S3_6_C4_C0_6 /* SPSR_R */
mrs x2,S3_6_C4_C0_3 /* ELR_R */
@@ -111,6 +110,9 @@ panic:
mrs x2,S3_6_C5_C2_6 /* ESR_R */
stp x3,x2,[sp,#-16]!
+ mov x3,sp
+ stp xzr,x3,[sp,#-16]!
+
mov x1,sp
b cpanic
@@ -130,7 +132,7 @@ _synchdl:
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() */
+ stp xzr,x30,[sp,#-16]!
mrs x1,S3_6_C4_C0_6 /* SPSR_R */
mrs x0,S3_6_C4_C0_3 /* ELR_R */
@@ -140,13 +142,23 @@ _synchdl:
mrs x0,S3_6_C5_C2_6 /* ESR_R */
stp x1,x0,[sp,#-16]!
+ msr spsel,#0
mov x0,sp
+ msr spsel,#1
+ stp xzr,x0,[sp,#-16]! /* SP_EL0 */
+
+ mov x0,sp /* x0 = trapframe */
+ msr spsel,#0
bl synchdl
adr x0,outsync
b panic
swtch:
+ ldp xzr,x1,[x0],#16
+ mov sp,x1
+ msr spsel,#1
mov sp,x0
+
ldp x1,x0,[sp],#16
msr S3_6_C6_C0_6,x1 /* FAR_R */
msr S3_6_C5_C2_6,x0 /* ESR_R */
diff --git a/arch/arm64/crt-none.s b/arch/arm64/crt-none.s
@@ -5,7 +5,7 @@ SRAMSIZE = 4096
.text
.globl _start
_start:
- msr spsel,#1
+ msr spsel,#0
ldr x0,=SRAMADDR
mov x1,#(SRAMSIZE-16) /* Stack grows down towards BSS */
add x0,x0,x1
@@ -22,6 +22,7 @@ _start:
stp xzr,xzr,[x29] /* zero FP/LR to terminate backtrace */
ldr x0,=SRAMADDR
+ mov x1,#SRAMSIZE
bl main
adr x0,outsync
b panic
diff --git a/arch/arm64/panic.c b/arch/arm64/panic.c
@@ -40,7 +40,7 @@ dumpstack(struct trapframe *fp)
int *sp, i;
printk("stack dump:\n");
- sp = (int *) fp->sp;
+ sp = fp->sp;
for (i = 0; i < 16; i++)
printk("%x%c", *sp++, (i % 4 == 0) ? '\n' : ' ');
}
diff --git a/arch/arm64/rom.c b/arch/arm64/rom.c
@@ -40,20 +40,21 @@ badrmc(Rmucmd *cmd, int error)
}
void
-main(void *sram)
+main(void *sram, size_t sramsiz)
{
struct trapframe *fp;
- char *bp;
+ char *bp = sram;
size_t bsssiz;
- bsssiz = (sizeof(struct bssmap)+15) & ~15;
- memset(sram, 0, bsssiz);
-
- bp = (char *) sram + bsssiz;
- fp = (struct trapframe *) bp;
+ bsssiz = (sizeof(struct bssmap) + 15) & ~15;
+ fp = (struct trapframe *) (bp + bsssiz);
fp += NR_NESTED - 1;
+ wr_sp_r(fp);
+
+ memset(sram, 0, bsssiz);
memset(fp, 0, sizeof(*fp));
+ fp->sp = bp + sramsiz - 16;
fp->elr = rd_rvbar_el3();
fp->spsr = 0xf << 6 | 0xd;
diff --git a/include/rcode.h b/include/rcode.h
@@ -21,12 +21,13 @@ struct rowidx {
};
struct trapframe {
+ unsigned long long xzr1;
+ void *sp;
unsigned long long far;
unsigned long long esr;
unsigned long long spsr;
void *elr;
- void *sp;
- unsigned long long x30,x29,x28,x27;
+ unsigned long long xzr0,x30,x29,x28,x27;
unsigned long long x26,x25,x24,x23;
unsigned long long x22,x21,x20,x19;
unsigned long long x18,x17,x16,x15;