9os

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

commit 3a0e764001395678347de53ab29fb03c9806e058
parent 93d37ba0cc4b80ffab7c4f167c5b1c0dcdd2a7c1
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date:   Fri, 12 Oct 2018 12:58:30 +0100

Merge "[arch/arm64] Rework main() and panic()"
Diffstat:
Aarch/arm64/.gitignore | 1+
March/arm64/Makefile | 6+++++-
March/arm64/arch.s | 55++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Aarch/arm64/cdeps.c | 13+++++++++++++
March/arm64/macros.s | 26+-------------------------
March/arm64/panic.c | 56++++++++++++++++++++++++++++++++++++++++----------------
March/arm64/ram-crt-none.s | 37+++++++++++++++++++++++--------------
March/arm64/rom-crt-none.s | 35++++++++++++++++++++++-------------
March/arm64/rom.c | 12++++++++----
Minclude/machine.h | 7+++++++
Mscripts/rules.mk | 14+++++++++-----
11 files changed, 183 insertions(+), 79 deletions(-)

diff --git a/arch/arm64/.gitignore b/arch/arm64/.gitignore @@ -0,0 +1 @@ +cdeps diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile @@ -10,7 +10,10 @@ LIBDEP = $(LIBDIR)/librmu.a $(LIBDIR)/libc.a all: $(TARGET) -rom-crt-$(SYS).o: macros.s +rom-crt-$(SYS).s ram-crt-$(SYS).s: cdeps + ./cdeps | ed -s $@ + +ram-crt-$(SYS).o rom-crt-$(SYS).o: macros.s $(BINDIR)/romfw.elf: $(ROMOBJS) $(LIBDEP) $(LD) $(RCODE_LDFLAGS) $(ROMOBJS) $(LIBS) -o $@ @@ -19,5 +22,6 @@ $(BINDIR)/ramfw.elf: $(RAMOBJS) $(LIBDEP) $(LD) $(RCODE_LDFLAGS) $(ROMOBJS) $(LIBS) -o $@ clean: + rm -f cdeps rm -f $(TARGET:.bin=.elf) rm -f $(TARGET:.bin=.tst) diff --git a/arch/arm64/arch.s b/arch/arm64/arch.s @@ -1,7 +1,11 @@ .file "arch.s" +DAIF_ABT = 2 +DAIF_DBG = 4 + .text - .globl panic,panic_helper + .globl panic,enaabt,disabt,enadbg,disdbg,wfi,wfe,swtch + .align 2 panic: stp x1,x0,[sp,#-16]! stp x3,x2,[sp,#-16]! @@ -31,3 +35,52 @@ panic: stp x1,x0,[sp,#-16]! mov x1,sp b cpanic + +enaabt: + msr daifclr,DAIF_ABT + ret + +disabt: + msr daifset,DAIF_ABT + ret + +enadbg: + msr daifclr,DAIF_DBG + ret + +disdbg: + msr daifset,DAIF_DBG + ret + +wfi: wfi + ret + +wfe: wfe + ret + +swtch: + ldp x1,x0,[sp],#16 + msr S3_6_C6_C0_6,x1 /* FAR_R */ + msr S3_6_C5_C2_6,x0 /* ESR_R */ + + ldp x1,x0,[sp],#16 + msr S3_6_C4_C0_6,x1 /* SPSR_R */ + msr S3_6_C4_C0_3,x0 /* ELR_R */ + + ldp xzr,x30,[sp],#16 + 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 diff --git a/arch/arm64/cdeps.c b/arch/arm64/cdeps.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +#include <machine.h> + +int +main(void) +{ + int siz = sizeof(struct trapframe); + + siz = (siz + 15) & ~15; + printf("/^FRAMESIZ/ s/=.*/=\t%d/\nw\n", siz); + return 0; +} diff --git a/arch/arm64/macros.s b/arch/arm64/macros.s @@ -37,29 +37,5 @@ mov x0,sp bl \target - - ldp x1,x0,[sp],#16 - msr S3_6_C6_C0_6,x1 /* FAR_R */ - msr S3_6_C5_C2_6,x0 /* ESR_R */ - - ldp x1,x0,[sp],#16 - msr S3_6_C4_C0_6,x1 /* SPSR_R */ - msr S3_6_C4_C0_3,x0 /* ELR_R */ - - ldp xzr,x30,[sp],#16 - 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 + b swtch .endm diff --git a/arch/arm64/panic.c b/arch/arm64/panic.c @@ -2,17 +2,9 @@ #include <machine.h> void -cpanic(const char *msg, struct trapframe *fp) +dumpregs(struct trapframe *fp) { - struct bssmap *bm = bss; - void **bp; - - if (bm->in_panic) - goto htl; - - bm->in_panic = 1; - printk("panic: %s\n" - "x0=%llx\tx1=%llx\tx2=%llx\tx3=%llx\n" + printk("x0=%llx\tx1=%llx\tx2=%llx\tx3=%llx\n" "x4=%llx\tx5=%llx\tx6=%llx\tx7=%llx\n" "x8=%llx\tx9=%llx\tx10=%llx\tx11=%llx\n" "x12=%llx\tx13=%llx\tx14=%llx\tx15=%llx\n" @@ -21,9 +13,7 @@ cpanic(const char *msg, struct trapframe *fp) "x24=%llx\tx25=%llx\tx26=%llx\tx27=%llx\n" "x28=%llx\tx29=%llx\tx30=%llx\telr=%llx\n" "spsr=%llx\tesr=%llx\tfar=%llx\n" - "sp=%llx\n" - "stack trace:\n", - msg, + "sp=%llx\n", fp->x0, fp->x1, fp->x2, fp->x3, fp->x4, fp->x5, fp->x6, fp->x7, fp->x8, fp->x9, fp->x10, fp->x11, @@ -33,10 +23,44 @@ cpanic(const char *msg, struct trapframe *fp) fp->x24, fp->x25, fp->x26, fp->x27, fp->x28, fp->x29, fp->x30, fp->elr, fp->spsr, fp->esr, fp->far, fp->sp); +} + +void +backtrace(struct trapframe *fp) +{ + void **bp; for (bp = (void **) fp->x29; *bp; bp = (void **) *bp) printk("%llx\n", bp[1]); -htl: - for (;;) - ; +} + +void +dumpstack(struct trapframe *fp) +{ + int *sp, i; + + printk("stack dump:\n"); + sp = (int *) fp->sp; + for (i = 0; i < 16; i++) + printk("%x%c", *sp++, (i % 4 == 0) ? '\n' : ' '); +} + +void +cpanic(const char *msg, struct trapframe *fp) +{ + /* + * check against 1 to be more robust + * against memory corruptions + */ + if (bss->in_panic != 1) { + bss->in_panic = 1; + printk("panic: %s\n", msg); + + dumpregs(fp); + backtrace(fp); + dumpstack(fp); + } + + for (disabt(); ; disabt()) + wfe(); } diff --git a/arch/arm64/ram-crt-none.s b/arch/arm64/ram-crt-none.s @@ -1,4 +1,4 @@ - .file "rom-crt-none.s" + .file "ram-crt-none.s" .include "macros.s" @@ -6,38 +6,47 @@ BSS = 0x2E00F000 BSSSIZ = 1024 PAGESIZ = 4096 +FRAMESIZ= 288 .text .globl _start _start: - adr x0,vectbl - msr S3_6_C12_C0_6,x0 /* VBAR_R */ - isb - - /* Stack grows down towards BSS */ msr spsel,#1 ldr x0,=BSS - mov x1,#(PAGESIZ-16) + mov x1,#(PAGESIZ-16) /* Stack grows down towards BSS */ add x0,x0,x1 - mov sp,x0 + mov sp,x0 mov x29,sp - stp xzr,xzr,[x29] /* zero FP/LR to terminate backtrace */ + adr x0,vectbl + msr S3_6_C12_C0_6,x0 /* VBAR_R */ + isb + bl enaabt + isb + + bl _uart_init + stp xzr,xzr,[x29] /* zero FP/LR to terminate backtrace */ ldr x0,=BSS mov x1,#0 mov x2,BSSSIZ bl memset - bl _uart_init + mov x0,#FRAMESIZ + mov x1,sp + sub x1,x1,x0 + mov sp,x1 mrs x0,rvbar_el3 - handler main - eret + bl main + ldr x0,=outsync + b panic + +outsync: + .asciz "out of sync" -/* Top level AArch32/AArch64 Sync exception handler */ +/* Top level arm64 Sync exception handler */ _synchdl: handler synchdl - eret .align 11 vectbl: diff --git a/arch/arm64/rom-crt-none.s b/arch/arm64/rom-crt-none.s @@ -6,38 +6,47 @@ BSS = 0x2E00F000 BSSSIZ = 1024 PAGESIZ = 4096 +FRAMESIZ= 288 .text .globl _start _start: - adr x0,vectbl - msr S3_6_C12_C0_6,x0 /* VBAR_R */ - isb - - /* Stack grows down towards BSS */ msr spsel,#1 ldr x0,=BSS - mov x1,#(PAGESIZ-16) + mov x1,#(PAGESIZ-16) /* Stack grows down towards BSS */ add x0,x0,x1 - mov sp,x0 + mov sp,x0 mov x29,sp - stp xzr,xzr,[x29] /* zero FP/LR to terminate backtrace */ + adr x0,vectbl + msr S3_6_C12_C0_6,x0 /* VBAR_R */ + isb + bl enaabt + isb + + bl _uart_init + stp xzr,xzr,[x29] /* zero FP/LR to terminate backtrace */ ldr x0,=BSS mov x1,#0 mov x2,BSSSIZ bl memset - bl _uart_init + mov x0,#FRAMESIZ + mov x1,sp + sub x1,x1,x0 + mov sp,x1 mrs x0,rvbar_el3 - handler main - eret + bl main + ldr x0,=outsync + b panic + +outsync: + .asciz "out of sync" -/* Top level AArch32/AArch64 Sync exception handler */ +/* Top level arm64 Sync exception handler */ _synchdl: handler synchdl - eret .align 11 vectbl: diff --git a/arch/arm64/rom.c b/arch/arm64/rom.c @@ -9,15 +9,19 @@ synchdl(struct trapframe *fp) dbg("sync handler\n"); } -int +void main(struct trapframe *fp) { unsigned long long rvbar_el3; rvbar_el3 = fp->x0; - /* Clear all regs to avoid leaking info to EL3h */ - memset(fp, 0, sizeof(*fp)); + memset(fp, 0, sizeof(*fp)); /* don't leak info to EL3h */ fp->elr = rvbar_el3; fp->spsr = 0xf << 6 | 0xd; - return 0; + + swtch(fp); + /* + * main is not expected to return. If it happens we will + * be out of sync and we will panic + */ } diff --git a/include/machine.h b/include/machine.h @@ -15,3 +15,10 @@ struct trapframe { }; extern void cpanic(const char *msg, struct trapframe *fp); +extern void enaabt(void); +extern void disabt(void); +extern void enadbg(void); +extern void disdbg(void); +extern void wfi(void); +extern void wfe(void); +extern void swtch(struct trapframe *fp); diff --git a/scripts/rules.mk b/scripts/rules.mk @@ -33,10 +33,19 @@ CC = $(CROSS_COMPILE)$(COMP) AS = $(CROSS_COMPILE)$(ASM) LD = $(CROSS_COMPILE)$(LINKER) OC = $(CROSS_COMPILE)$(OBJCOPY) +HOSTCC=$(COMP) + +.SUFFIXES: .elf .bin .tst .c.o: $(CC) $(RCODE_CFLAGS) -o $@ -c $< +.c: + $(HOSTCC) $(RCODE_CFLAGS) -o $@ $< + +.c.s: + $(CC) $(RCODE_CFLAGS) -o $@ -S $< + FORALL= +@set -e ;\ pwd=$$PWD; \ for i in $(DIRS); \ @@ -50,11 +59,6 @@ all: FORCE: -.SUFFIXES: .elf .bin .tst - -.c.s: - $(CC) $(RCODE_CFLAGS) -o $@ -S $< - .elf.bin: $(OC) -O binary $< $@