xref: /plan9/sys/src/9/rb/rebootcode.c (revision f43f8ee646e2cb29aea7fd7bb5fc7318a3f4921f)
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