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