1 /* 2 * mips reboot trampoline code 3 */ 4 #include "u.h" 5 #include "../port/lib.h" 6 #include "mem.h" 7 #include "dat.h" 8 #include "fns.h" 9 #include "io.h" 10 11 #define csr8r(r) (((ulong *)PHYSCONS)[r]) 12 #define csr8o(r, v) (((ulong *)PHYSCONS)[r] = (v)) 13 14 enum { /* i8250 registers */ 15 Thr = 0, /* Transmitter Holding (WO) */ 16 Lsr = 5, /* Line Status */ 17 }; 18 enum { /* Lsr */ 19 Thre = 0x20, /* Thr Empty */ 20 }; 21 22 void putc(int); 23 24 /* 25 * Copy the new kernel to its correct location in physical memory, 26 * flush caches, ignore TLBs (we're in KSEG0 space), and jump to 27 * the start of the kernel. 28 */ 29 void 30 main(ulong aentry, ulong acode, ulong asize) 31 { 32 void (*kernel)(void); 33 static ulong entry, code, size; 34 35 putc('B'); putc('o'); putc('o'); putc('t'); 36 /* copy args to heap before moving stack to before a.out header */ 37 entry = aentry; 38 code = acode; 39 size = asize; 40 setsp(entry-0x20-4); 41 42 memmove((void *)entry, (void *)code, size); 43 44 cleancache(); 45 coherence(); 46 47 /* 48 * jump to kernel entry point. 49 */ 50 putc(' '); 51 kernel = (void*)entry; 52 (*kernel)(); /* off we go - never to return */ 53 54 putc('?'); 55 putc('!'); 56 for(;;) 57 ; 58 } 59 60 void 61 putc(int c) 62 { 63 int i; 64 65 for(i = 0; !(csr8r(Lsr) & Thre) && i < 1000000; i++) 66 ; 67 csr8o(Thr, (uchar)c); 68 for(i = 0; !(csr8r(Lsr) & Thre) && i < 1000000; i++) 69 ; 70 } 71 72 long 73 syscall(Ureg*) 74 { 75 return -1; 76 } 77 78 void 79 trap(Ureg *) 80 { 81 } 82