commit f87bc87046e6dba1417672ad9dd76fffb17e1f61 parent 9a0aa90fb05959f2322665896e03e01f1c2e15ca Author: Roberto E. Vargas Caballero <k0ga@shike2.com> Date: Fri, 11 Sep 2020 21:44:09 +0200 kernel: Separate arch part and generic part This code comes from old rcode firmware, and it was designed to run only in arm processors. This is a constraint that is not valid anymore. Change-Id: I338c987e93141eec359ab920c3bd9611efdb59f6 Diffstat:
19 files changed, 112 insertions(+), 236 deletions(-)
diff --git a/include/9os/9os.h b/include/9os/9os.h @@ -190,8 +190,6 @@ extern Task *gettask(Proc *, int); extern void sched(void); /* globals */ -extern Proc proctab[]; -extern Win wintab[]; extern unsigned in_debug; extern jmp_buf dbgrecover; extern const char *const regnames[]; diff --git a/include/9os/kernel.h b/include/9os/kernel.h @@ -1,6 +0,0 @@ -#include <stddef.h> - -struct context; - -extern struct context *framep; -extern const char *const regnames[]; diff --git a/src/kernel/.gitignore b/src/kernel/.gitignore @@ -1,3 +0,0 @@ -rmu.c -ecstr.c -rmctab.c diff --git a/src/kernel/Makefile b/src/kernel/Makefile @@ -4,9 +4,7 @@ include $(PROJECTDIR)/scripts/rules.mk OBJS =\ dlang.o\ - ecstr.o\ panic.o\ - svc.o\ sched.o\ dev/builtin.o\ @@ -26,9 +24,5 @@ dev/builtin.o: dev $(DIRS): FORCE +@cd $@ && $(MAKE) -ecstr.c: ec.h - mkecstr ec.h - clean: - rm -f ecstr.c $(FORALL) diff --git a/src/kernel/arch/hosted/Makefile b/src/kernel/arch/hosted/Makefile @@ -4,20 +4,21 @@ include $(PROJECTDIR)/scripts/rules.mk CRT = $(LIBDIR)/crt.o -ROMOBJS = arch.o \ - lock.o \ - kernel.o \ - $(CRT) \ - $(SRCDIR)/kernel/builtin.o \ +OBJS =\ + arch.o \ + lock.o \ + kernel.o \ + $(CRT) \ + $(SRCDIR)/kernel/builtin.o \ -TARGET = $(BINDIR)/kernel.elf +TARGET = $(BINDIR)/9os.elf all: $(TARGET) $(BINDIR)/blkfile $(DIRS): FORCE cd $@ && $(MAKE) -$(BINDIR)/kernel.elf: $(ROMOBJS) $(LIBDEP) +$(BINDIR)/9os.elf: $(OBJS) $(LIBDEP) $(LD) $(PROJ_LDFLAGS) $(ROMOBJS) $(PROJ_LDLIBS) -o $@ $(BINDIR)/blkfile: diff --git a/src/kernel/arch/hosted/kernel.c b/src/kernel/arch/hosted/kernel.c @@ -4,7 +4,6 @@ #include <libk.h> #include <9os/9os.h> -#include <9os/kernel.h> #include "hosted.h" diff --git a/src/kernel/arch/native/Makefile b/src/kernel/arch/native/Makefile @@ -5,7 +5,7 @@ include $(PROJECTDIR)/scripts/rules.mk DIRS=arm64 all: - +@cd $(MODE) && $(MAKE) + +@cd $(ARCH) && $(MAKE) clean: $(FORALL) diff --git a/src/kernel/arch/native/arm64/Makefile b/src/kernel/arch/native/arm64/Makefile @@ -2,20 +2,25 @@ PROJECTDIR = ../../../../.. include $(PROJECTDIR)/scripts/rules.mk -KERNELOBJS =\ - kernel-crt.o \ +OBJS =\ + svc.o \ + ecstr.o \ + crt.o \ kernel.o \ arch.o \ debug_lock.o \ sysreg.o \ - $(SRCDIR)/romfw/builtin.o \ cache.o \ + $(SRCDIR)/kernel/builtin.o \ -TARGET = $(BINDIR)/kernel.bin +TARGET = $(BINDIR)/9os.bin all: $(TARGET) -kernel.o.o: sysreg.h version.h +ecstr.c: ec.h + mkecstr ec.h + +kernel.o: sysreg.h version.h cache.o: sysreg.h sysreg.h: sysreg.lst @@ -27,9 +32,10 @@ sysreg.s: sysreg.lst version.h: mkver -$(BINDIR)/romfw.elf: $(ROMOBJS) $(LIBDEP) - $(LD) $(PROJ_LDFLAGS) $(LINKSCRIPT) $(ROMOBJS) $(PROJ_LDLIBS) -o $@ +$(BINDIR)/9os.elf: $(OBJS) $(LIBDEP) + $(LD) $(PROJ_LDFLAGS) $(LINKSCRIPT) $(OBJS) $(PROJ_LDLIBS) -o $@ clean: - rm -f $(TARGET:.bin=.elf) + rm -f ecstr.c + rm -f $(TARGET) rm -f sysreg.h sysreg.s version.h diff --git a/src/kernel/arch/native/arm64/arch.s b/src/kernel/arch/native/arm64/arch.s @@ -1,7 +1,7 @@ .file "arch.s" .text - .globl panic,dohalt,intr,dopanic + .globl panic,halt,intr,swtch,getcontext .globl barrier,vectbl,doswtch,inm8,inm16,inm32 .globl outm8,outm16,outm32 .globl invdcachesetway,invicache,vectbl,doswtch @@ -69,12 +69,45 @@ outm32: str w0,[x1] ret -dohalt: +halt: msr daifset,#15 wfe - b dohalt + b halt + +getcontext: + stp x0,x1,[x0,#-16*(19-0)] + stp x2,x3,[x0,#-16*(19-1)] + stp x4,x5,[x0,#-16*(19-2)] + stp x6,x7,[x0,#-16*(19-3)] + stp x8,x9,[x0,#-16*(19-4)] + stp x10,x11,[x0,#-16*(19-5)] + stp x12,x13,[x0,#-16*(19-6)] + stp x14,x15,[x0,#-16*(19-7)] + stp x16,x17,[x0,#-16*(19-8)] + stp x18,x19,[x0,#-16*(19-9)] + stp x20,x21,[x0,#-16*(19-10)] + stp x22,x23,[x0,#-16*(19-11)] + stp x24,x25,[x0,#-16*(19-12)] + stp x26,x27,[x0,#-16*(19-13)] + stp x28,x29,[x0,#-16*(19-14)] + + mrs x9,ELR_EL3 + stp x9,x30,[x0,#-16*(19-15)] + + mrs x9,SPSR_EL3 + mrs x10,ESR_EL3 + stp x9,x10,[x0,#-16*(19-16)] + + mov x9,sp + mrs x10,FAR_EL3 + stp x9,x10,[x0,#-16*(19-17)] + + mrs x9,scr_el3 + mov x10,#0 /* unused */ + stp x9,x10,[x0,#-16*(19-18)] + + ret -dopanic: exception: msr spsel,#1 stp x0,x1,[sp,#-16*(19-0)] @@ -120,7 +153,7 @@ outsync: .asciz "out of sync" .text -doswtch: +swtch: ldp x9,x10,[x0,#16*18] msr SCR_EL3,x9 diff --git a/src/kernel/arch/native/arm64/crt-kernel.s b/src/kernel/arch/native/arm64/crt.s diff --git a/src/kernel/ec.h b/src/kernel/arch/native/arm64/ec.h diff --git a/src/kernel/arch/native/arm64/kernel.c b/src/kernel/arch/native/arm64/kernel.c @@ -5,13 +5,11 @@ #include <libk.h> #include <limits.h> #include <9os/9os.h> -#include <9os/kernel.h> #include "version.h" #include "sysreg.h" #include "arch.h" -#define ENVSIZ 512 #define STACKSIZ 1792 #define HEAPSIZ 1792 @@ -23,16 +21,13 @@ typedef struct mach Mach; -char **_environ; -struct trapframe trapframe, *framep; - struct mach { void *sp; size_t stacksiz; - void *env; - size_t envsiz; }; +Context ctx; + void * alloc(size_t size) { @@ -59,19 +54,14 @@ alloc(size_t size) static void imach(Mach *mp, void *stackp) { - framep = &trapframe; - memset(framep, 0, sizeof(*framep)); + memset(&ctx, 0, sizeof(ctx)); mp->sp = stackp; mp->stacksiz = STACKSIZ; - mp->env = stackp + ENVSIZ; - mp->envsiz = ENVSIZ; - _environ = mp->env; - - framep->r[SP] = (unsigned long long)mp->sp; - framep->r[ELR] = 0x4022000; - framep->r[SPSR] = 0xf << 6 | 0xd; + ctx.r[SP] = (unsigned long long) mp->sp; + ctx.r[ELR] = 0x4022000; + ctx.r[SPSR] = 0xf << 6 | 0xd; invicache(); invdcache(); @@ -81,11 +71,9 @@ static void info(Mach *mp) { dbg(kout, - "romfw: version %s\n" - "env = %p, envsiz = 0x%zx\n" + "9os: version %s\n" "sp = %p, stacksiz = 0x%zx\n", - 9OSVERSION, - mp->env, mp->envsiz, + OSVERSION, mp->sp, mp->stacksiz); } @@ -108,26 +96,24 @@ namespace(void) if ((kerr = open("#c/raw", O_WRITE)) < 0) panic("open:#c/raw write"); - if (bind("#c", "/dev/cons") < 0) { + if (bind("#c", "/dev/cons") < 0) panic("bind:/dev/cons"); - if (bind("#t0", "/dev/uart0") < 0) { + if (bind("#t0", "/dev/uart0") < 0) panic("bind:/dev/uart0"); - if (bind("#t1", "/dev/uart3") < 0) { + if (bind("#t1", "/dev/uart3") < 0) panic("bind:/dev/uart3"); - if ((fd = open("/dev/cons/ctl", O_WRITE)) < 0) { + if ((fd = open("/dev/cons/ctl", O_WRITE)) < 0) panic("open:/dev/cons/ctl write"); - if (write(fd, setin, sizeof(setin)) < 0) { + if (write(fd, setin, sizeof(setin)) < 0) panic("write:setin"); - if (write(fd, setout, sizeof(setout)) < 0) { + if (write(fd, setout, sizeof(setout)) < 0) panic("write:setout"); - if (close(fd) < 0) { + if (close(fd) < 0) panic("close:/dev/cons/ctl"); - if (mount("#F", "/fip", "/blobs/fip.bin") < 0) { + if (mount("#F", "/fip", "/blobs/fip.bin") < 0) panic("mount:/fip"); - - return; } void @@ -154,5 +140,5 @@ main(void *stackp) info(&mach); debug(); loadfip(); - swtch(framep); + swtch(&ctx); } diff --git a/src/kernel/mkecstr b/src/kernel/arch/native/arm64/mkecstr diff --git a/src/kernel/arch/native/arm64/mkver b/src/kernel/arch/native/arm64/mkver @@ -4,6 +4,6 @@ set -e trap 'rm -f $$.tmp' EXIT HUP INT QUIT TERM git show-ref HEAD | -awk '{printf("#define 9OSVERSION \"%s\"\n", +awk '{printf("#define OSVERSION \"%s\"\n", substr($1, 1, 8)) }' > $$.tmp && mv $$.tmp version.h diff --git a/src/kernel/arch/native/arm64/svc.c b/src/kernel/arch/native/arm64/svc.c @@ -0,0 +1,33 @@ +#include <setjmp.h> +#include <stdint.h> + +#include <libk.h> +#include <9os/9os.h> + +#include "ec.h" + +void +trap(Context *ctx) +{ + enum ecvals ec; + const char *msg; + int numsvc; + + dbg(kerr, "exception handler\n"); + ec = (ctx->r[ESR] >> 26) & 0x3f; + + if (ec != SVC) { + msg = (ec < NR_EC_VALS) ? ecstr[ec] : "unknown reason"; + panic(msg); + } + + numsvc = ctx->r[ESR] & 0xff; + + svc(numsvc); + swtch(ctx); +} + +void +svc(int numsvc) +{ +} diff --git a/src/kernel/dev/dev.c b/src/kernel/dev/dev.c @@ -3,7 +3,6 @@ #include <string.h> #include <9os/9os.h> -#include <9os/kernel.h> #include <9os/io.h> #include "dev.h" diff --git a/src/kernel/dlang.c b/src/kernel/dlang.c @@ -8,9 +8,7 @@ #include <libk.h> #include <9os/9os.h> -#include <9os/kernel.h> -#include "ec.h" #include "dlang.h" #define PREFIX "> " @@ -72,18 +70,6 @@ estrtoull(char *str, int base) return val; } -/* Get reg struct for named reg */ -static unsigned long long * -get_named_reg(char *name, Context *ctx) -{ - int i; - - for (i = 0; i < NR_REGS; i++) - if (strcmp(name, regnames[i]) == 0) - return &ctx->r[i]; - return NULL; -} - /* Get cmd struct for named cmd */ static const struct cmd * get_cmd(char *name) @@ -98,61 +84,6 @@ get_cmd(char *name) } static int -do_set(const struct cmd *cmd, struct args *args) -{ - unsigned long long *reg = NULL; - unsigned long long setval = 0; - - reg = get_named_reg(args->argv[1], framep); - if (reg == NULL) - error("set: %s: not found", args->argv[1]); - - setval = estrtoull(args->argv[2], 0); - *reg = setval; - return 0; -} - -static int -do_get(const struct cmd *cmd, struct args *args) -{ - unsigned long long *reg = NULL; - - reg = get_named_reg(args->argv[1], framep); - if (reg == NULL) - error("get: %s: not found", args->argv[1]); - - kprint(kout, "%llx\n", *reg); - return 0; -} - -static int -do_dump(const struct cmd *cmd, struct args *args) -{ - dumpregs(framep, kout); - return 0; -} - -static int -do_trap(const struct cmd *cmd, struct args *args) -{ - trap(framep); - return 0; -} - -static int -do_svc(const struct cmd *cmd, struct args *args) -{ - unsigned num; - - num = estrtoull(args->argv[1], 0); - - framep->r[ESR] = (unsigned long long) SVC << 26; - framep->r[ESR] |= num; - trap(framep); - return 0; -} - -static int do_exit(const struct cmd *cmd, struct args *args) { args->status = 0; @@ -353,41 +284,6 @@ debug(void) */ static const struct cmd cmds[] = { { - .name = "set", - .eval = do_set, - .min = 3, - .max = 3, - .helpmsg = "Set a register: set <reg> <value>", - }, - { - .name = "get", - .eval = do_get, - .min = 2, - .max = 2, - .helpmsg = "Get a register: get <reg>", - }, - { - .name = "dump", - .eval = do_dump, - .min = 1, - .max = 1, - .helpmsg = "Dump trapframe: dump", - }, - { - .name = "trap", - .eval = do_trap, - .min = 1, - .max = 1, - .helpmsg = "Call trap handler: trap", - }, - { - .name = "svc", - .eval = do_svc, - .min = 3, - .max = 3, - .helpmsg = "Call SVC handler: svc imm", - }, - { .name = "exit", .eval = do_exit, .min = 1, diff --git a/src/kernel/panic.c b/src/kernel/panic.c @@ -1,6 +1,5 @@ #include <libk.h> #include <9os/9os.h> -#include <9os/kernel.h> const char *const regnames[] = { [X0] = "x0", diff --git a/src/kernel/svc.c b/src/kernel/svc.c @@ -1,59 +0,0 @@ -#include <setjmp.h> -#include <stdint.h> - -#include <libk.h> -#include <9os/9os.h> -#include <9os/kernel.h> - -#include "ec.h" - -void -halt(void) -{ - if (in_debug) - longjmp(dbgrecover, 1); - dohalt(); -} - -void -swtch(Context *ctx) -{ - if (in_debug) - longjmp(dbgrecover, 1); - doswtch(ctx); -} - -void -trap(Context *ctx) -{ - enum ecvals ec; - const char *msg; - int numsvc; - - dbg(kerr, "exception handler\n"); - ec = (ctx->r[ESR] >> 26) & 0x3f; - - if (ec != SVC) { - msg = (ec < NR_EC_VALS) ? ecstr[ec] : "unknown reason"; - panic(msg); - } - - numsvc = ctx->r[ESR] & 0xff; - framep = ctx; - - svc(numsvc); - swtch(ctx); -} - -void -badcmd(int error) -{ - framep->r[X0] = error; - swtch(framep); -} - -void -svc(int numsvc) -{ - framep->r[X0] = -1; -}