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:
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 $< $@