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