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