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