xref: /csrg-svn/sys/tahoe/stand/boot.c (revision 25865)
1*25865Ssam /*	boot.c	1.1	86/01/12	*/
2*25865Ssam /*	boot.c	6.1	83/07/29	*/
3*25865Ssam 
4*25865Ssam #include "../machine/mtpr.h"
5*25865Ssam 
6*25865Ssam #include "param.h"
7*25865Ssam #include "inode.h"
8*25865Ssam #include "fs.h"
9*25865Ssam #include "vm.h"
10*25865Ssam #include "saio.h"
11*25865Ssam #include "reboot.h"
12*25865Ssam 
13*25865Ssam #include <a.out.h>
14*25865Ssam 
15*25865Ssam /*
16*25865Ssam  * Boot program... arguments passed in r10 and r11 determine
17*25865Ssam  * whether boot stops to ask for system name and which device
18*25865Ssam  * boot comes from.
19*25865Ssam  */
20*25865Ssam 
21*25865Ssam /*	r11 = 0 -> automatic boot, load file '/vmunix' */
22*25865Ssam /*	r11 = 1 -> ask user for file to load */
23*25865Ssam 
24*25865Ssam /* Types in r10 specifying major device */
25*25865Ssam char	devname[][3] = {
26*25865Ssam 	'f','s','d',	/* 0 = fsd */
27*25865Ssam 	's','m','d',	/* 1 = smd or cmd */
28*25865Ssam 	'x','f','d',	/* 2 = xfd */
29*25865Ssam 	'x','s','d',	/* 2 = xsd */
30*25865Ssam 	'c','y','p',	/* 3 = cypher tape */
31*25865Ssam };
32*25865Ssam 
33*25865Ssam #ifdef FSD
34*25865Ssam char line[100] = "fsd(0,0)vmunix";
35*25865Ssam #endif
36*25865Ssam #ifdef SMD
37*25865Ssam char line[100] = "smd(0,0)vmunix";
38*25865Ssam #endif
39*25865Ssam #ifdef XFD
40*25865Ssam char line[100] = "xfd(0,0)vmunix";
41*25865Ssam #endif
42*25865Ssam #ifdef XSD
43*25865Ssam char line[100] = "xsd(0,0)vmunix";
44*25865Ssam #endif
45*25865Ssam #ifdef JUSTASK
46*25865Ssam char line[100];
47*25865Ssam #endif
48*25865Ssam 
49*25865Ssam int	retry = 0;
50*25865Ssam 
51*25865Ssam main()
52*25865Ssam {
53*25865Ssam 	register dummy;		/* skip r12 */
54*25865Ssam 	register howto, devtype;	/* howto=r11, devtype=r10 */
55*25865Ssam 	int io;
56*25865Ssam 
57*25865Ssam #ifdef lint
58*25865Ssam 	howto = 0; devtype = 0;
59*25865Ssam #endif
60*25865Ssam 	printf("\nBoot\n");
61*25865Ssam #ifdef JUSTASK
62*25865Ssam 	howto = RB_ASKNAME|RB_SINGLE;
63*25865Ssam #endif
64*25865Ssam 	for (;;) {
65*25865Ssam 		if (howto & RB_ASKNAME) {
66*25865Ssam 			printf(": ");
67*25865Ssam 			gets(line);
68*25865Ssam 		} else
69*25865Ssam 			printf(": %s\n", line);
70*25865Ssam 		io = open(line, 0);
71*25865Ssam 		if (io >= 0)
72*25865Ssam 			copyunix(howto, io);
73*25865Ssam 		if (++retry > 2)
74*25865Ssam 			howto |= RB_SINGLE|RB_ASKNAME;
75*25865Ssam 	}
76*25865Ssam }
77*25865Ssam 
78*25865Ssam /*ARGSUSED*/
79*25865Ssam copyunix(howto, io)
80*25865Ssam 	register io, howto;
81*25865Ssam {
82*25865Ssam 	struct exec x;
83*25865Ssam 	register int i;
84*25865Ssam 	char *addr;
85*25865Ssam 
86*25865Ssam 	i = read(io, (char *)&x, sizeof x);
87*25865Ssam 	if (i != sizeof x ||
88*25865Ssam 	    (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410))
89*25865Ssam 		_stop("Bad format\n");
90*25865Ssam 	printf("%d", x.a_text);
91*25865Ssam 	if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
92*25865Ssam 		goto shread;
93*25865Ssam 	if (read(io, (char *)0x800, x.a_text) != x.a_text)
94*25865Ssam 		goto shread;
95*25865Ssam 	addr = (char *)(x.a_text + 0x800);
96*25865Ssam 	if (x.a_magic == 0413 || x.a_magic == 0410)
97*25865Ssam 		while ((int)addr & CLOFSET)
98*25865Ssam 			*addr++ = 0;
99*25865Ssam 	printf("+%d", x.a_data);
100*25865Ssam 	if (read(io, addr, x.a_data) != x.a_data)
101*25865Ssam 		goto shread;
102*25865Ssam 	addr += x.a_data;
103*25865Ssam 	printf("+%d", x.a_bss);
104*25865Ssam 	x.a_bss += 32*1024;	/* slop */
105*25865Ssam 	for (i = 0; i < x.a_bss; i++)
106*25865Ssam 		*addr++ = 0;
107*25865Ssam 	x.a_entry &= 0x1fffffff;
108*25865Ssam 	printf(" start 0x%x\n", x.a_entry);
109*25865Ssam 	mtpr(PADC, 0);		/* Purge data cache */
110*25865Ssam 	mtpr(PACC, 0);		/* Purge code cache */
111*25865Ssam 	if ((howto & RB_DCOFF) == 0)
112*25865Ssam 		mtpr(DCR, 1);	/* Enable data cache */
113*25865Ssam 	(*((int (*)()) x.a_entry))();
114*25865Ssam shread:
115*25865Ssam 	_stop("Short read\n");
116*25865Ssam }
117