diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-13 19:20:21 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-13 19:20:21 +0200 |
commit | a3b5e3994f7f2897ab1b5bb20b91224d145c1fc1 (patch) | |
tree | ceea2105303a45715bb44151be9b9420aad179bb /sys/src/9/bcm64/main.c | |
parent | 3b36daa2bb8c0f4169455baf829b9695b520c5fc (diff) |
bcm64: implement reboot support
Diffstat (limited to 'sys/src/9/bcm64/main.c')
-rw-r--r-- | sys/src/9/bcm64/main.c | 75 |
1 files changed, 61 insertions, 14 deletions
diff --git a/sys/src/9/bcm64/main.c b/sys/src/9/bcm64/main.c index f82ca0f61..eab88466b 100644 --- a/sys/src/9/bcm64/main.c +++ b/sys/src/9/bcm64/main.c @@ -8,12 +8,12 @@ #include "io.h" #include "init.h" #include "sysreg.h" +#include "reboot.h" #include <pool.h> #include <libsec.h> Conf conf; -ulong memsize = GiB; /* * starting place for first process @@ -122,7 +122,7 @@ userinit(void) pg = newpage(1, 0, UTZERO); pg->txtflush = ~0; segpage(s, pg); - k = kmap(s->map[0]->pages[0]); + k = kmap(pg); memmove((void*)VA(k), initcode, sizeof initcode); kunmap(k); @@ -133,7 +133,7 @@ void confinit(void) { int i, userpcnt; - ulong kpages; + ulong kpages, memsize = 0; uintptr pa; char *p; @@ -149,12 +149,10 @@ confinit(void) else userpcnt = 0; - if((p = getconf("*maxmem")) != nil){ + if(p = getconf("*maxmem")) memsize = strtoul(p, 0, 0) - PHYSDRAM; - if (memsize < 16*MB) /* sanity */ - memsize = 16*MB; - } - + if (memsize < 16*MB) /* sanity */ + memsize = 16*MB; getramsize(&conf.mem[0]); if(conf.mem[0].limit == 0){ conf.mem[0].base = PHYSDRAM; @@ -247,7 +245,7 @@ mpinit(void) for(i = 1; i < conf.nmach; i++) MACHP(i)->machno = i; - cachedwbinv(); + coherence(); for(i = 1; i < conf.nmach; i++) ((uintptr*)SPINTABLE)[i] = PADDR(_start); @@ -257,6 +255,9 @@ mpinit(void) delay(100); sev(); synccycles(); + + for(i = 0; i < MAXMACH; i++) + ((uintptr*)SPINTABLE)[i] = 0; } void @@ -276,12 +277,11 @@ main(void) schedinit(); return; } + quotefmtinstall(); bootargsinit(); confinit(); xinit(); printinit(); - fmtinstall('H', encodefmt); - quotefmtinstall(); uartconsinit(); screeninit(); print("\nPlan 9\n"); @@ -308,17 +308,64 @@ main(void) schedinit(); } +static void +rebootjump(void *entry, void *code, ulong size) +{ + void (*f)(void*, void*, ulong); + + intrsoff(); + intrcpushutdown(); + + /* redo identity map */ + mmuidmap((uintptr*)L1); + + /* setup reboot trampoline function */ + f = (void*)REBOOTADDR; + memmove(f, rebootcode, sizeof(rebootcode)); + cachedwbinvse(f, sizeof(rebootcode)); + cacheiinvse(f, sizeof(rebootcode)); + + (*f)(entry, code, size); + + for(;;); +} + void exit(int) { cpushutdown(); - for(;;); + splfhi(); + if(m->machno == 0) + archreboot(); + rebootjump(0, 0, 0); } void -reboot(void*, void*, ulong) +reboot(void *entry, void *code, ulong size) { - error(Egreg); + writeconf(); + while(m->machno != 0){ + procwired(up, 0); + sched(); + } + + cpushutdown(); + delay(2000); + + splfhi(); + + /* turn off buffered serial console */ + serialoq = nil; + + /* shutdown devices */ + chandevshutdown(); + + /* stop the clock (and watchdog if any) */ + clockshutdown(); + wdogoff(); + + /* off we go - never to return */ + rebootjump(entry, code, size); } /* |