9os

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

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:
March/arm64/arch.s | 18+++++++++++++++---
March/arm64/crt-none.s | 3++-
March/arm64/panic.c | 2+-
March/arm64/rom.c | 15++++++++-------
Minclude/rcode.h | 5+++--
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;