xref: /csrg-svn/sys/luna68k/stand/boot.c (revision 57081)
1*57081Sakito /*
2*57081Sakito  * Copyright (c) 1992 OMRON Corporation.
3*57081Sakito  * Copyright (c) 1992 The Regents of the University of California.
4*57081Sakito  * All rights reserved.
5*57081Sakito  *
6*57081Sakito  * This code is derived from software contributed to Berkeley by
7*57081Sakito  * OMRON Corporation.
8*57081Sakito  *
9*57081Sakito  * %sccs.include.redist.c%
10*57081Sakito  *
11*57081Sakito  *	@(#)boot.c	7.1 (Berkeley) 12/13/92
12*57081Sakito  */
13*57081Sakito 
14*57081Sakito /*
15*57081Sakito  * boot.c -- boot program
16*57081Sakito  * by A.Fujita, MAR-01-1992
17*57081Sakito  */
18*57081Sakito 
19*57081Sakito #include <sys/param.h>
20*57081Sakito #include <sys/reboot.h>
21*57081Sakito #include <sys/exec.h>
22*57081Sakito #include <machine/stinger.h>
23*57081Sakito #include <luna68k/stand/saio.h>
24*57081Sakito #include <luna68k/stand/status.h>
25*57081Sakito 
26*57081Sakito extern struct KernInter	*kiff;
27*57081Sakito 
28*57081Sakito int howto;
29*57081Sakito int devtype = MAKEBOOTDEV(4, 0, 0, 6, 0);
30*57081Sakito 
31*57081Sakito char *copyunix();
32*57081Sakito 
33*57081Sakito struct exec header;
34*57081Sakito char default_file[] = "sd(0,0)vmunix";
35*57081Sakito 
36*57081Sakito char *how_to_info[] = {
37*57081Sakito "RB_ASKNAME	ask for file name to reboot from",
38*57081Sakito "RB_SINGLE	reboot to single user only",
39*57081Sakito "RB_NOSYNC	dont sync before reboot",
40*57081Sakito "RB_HALT	don't reboot, just halt",
41*57081Sakito "RB_INITNAME	name given for /etc/init (unused)",
42*57081Sakito "RB_DFLTROOT	use compiled-in rootdev",
43*57081Sakito "RB_KDB		give control to kernel debugger",
44*57081Sakito "RB_RDONLY	mount root fs read-only"
45*57081Sakito };
46*57081Sakito 
47*57081Sakito int
48*57081Sakito how_to_boot(argc, argv)
49*57081Sakito 	int   argc;
50*57081Sakito 	char *argv[];
51*57081Sakito {
52*57081Sakito 	int i, h = howto;
53*57081Sakito 
54*57081Sakito 	if (argc < 2) {
55*57081Sakito 		printf("howto: 0x%s\n\n", hexstr(howto, 2));
56*57081Sakito 
57*57081Sakito 		if (h == 0) {
58*57081Sakito 			printf("\t%s\n", "RB_AUTOBOOT	flags for system auto-booting itself");
59*57081Sakito 		} else {
60*57081Sakito 			for (i = 0; i < 8; i++, h >>= 1) {
61*57081Sakito 				if (h & 0x01) {
62*57081Sakito 					printf("\t%s\n", how_to_info[i]);
63*57081Sakito 				}
64*57081Sakito 			}
65*57081Sakito 		}
66*57081Sakito 
67*57081Sakito 		printf("\n");
68*57081Sakito 	}
69*57081Sakito }
70*57081Sakito 
71*57081Sakito int
72*57081Sakito boot(argc, argv)
73*57081Sakito 	int   argc;
74*57081Sakito 	char *argv[];
75*57081Sakito {
76*57081Sakito 	register int io;
77*57081Sakito 	char *line;
78*57081Sakito 
79*57081Sakito 	if (argc < 2)
80*57081Sakito 		line = default_file;
81*57081Sakito 	else
82*57081Sakito 		line = argv[1];
83*57081Sakito 
84*57081Sakito 	printf("Booting %s\n", line);
85*57081Sakito 
86*57081Sakito 	io = open(line, 0);
87*57081Sakito 	if (io >= 0) {
88*57081Sakito 		bootunix(howto, devtype, io);
89*57081Sakito 		close(io);
90*57081Sakito 	}
91*57081Sakito }
92*57081Sakito 
93*57081Sakito int
94*57081Sakito load(argc, argv)
95*57081Sakito 	int   argc;
96*57081Sakito 	char *argv[];
97*57081Sakito {
98*57081Sakito 	register int io;
99*57081Sakito 	char *line;
100*57081Sakito 
101*57081Sakito 	if (argc < 2)
102*57081Sakito 		line = default_file;
103*57081Sakito 	else
104*57081Sakito 		line = argv[1];
105*57081Sakito 
106*57081Sakito 	printf("loading %s\n", line);
107*57081Sakito 
108*57081Sakito 	io = open(line, 0);
109*57081Sakito 	if (io >= 0) {
110*57081Sakito 		copyunix(io);
111*57081Sakito 		printf("\n");
112*57081Sakito 		close(io);
113*57081Sakito 	}
114*57081Sakito }
115*57081Sakito 
116*57081Sakito int
117*57081Sakito bootunix(howto, devtype, io)
118*57081Sakito 	register howto;		/* d7 contains boot flags */
119*57081Sakito 	register devtype;	/* d6 contains boot device */
120*57081Sakito 	register io;
121*57081Sakito {
122*57081Sakito 	register char *load;	/* a5 contains load addr for unix */
123*57081Sakito 
124*57081Sakito 	load = copyunix(io);
125*57081Sakito 
126*57081Sakito 	printf(" start 0x%x\n", load);
127*57081Sakito 	asm("	movl %0,d7" : : "d" (howto));
128*57081Sakito 	asm("	movl %0,d6" : : "d" (devtype));
129*57081Sakito 	asm("	movl %0,a5" : : "a" (kiff));
130*57081Sakito 	(*((int (*)()) load))();
131*57081Sakito }
132*57081Sakito 
133*57081Sakito char *
134*57081Sakito copyunix(io)
135*57081Sakito 	register io;
136*57081Sakito {
137*57081Sakito 
138*57081Sakito 	register int i;
139*57081Sakito 	register char *load;	/* a5 contains load addr for unix */
140*57081Sakito 	register char *addr;
141*57081Sakito 
142*57081Sakito 	/*
143*57081Sakito 	 * Read a.out file header
144*57081Sakito 	 */
145*57081Sakito 
146*57081Sakito 	i = read(io, (char *)&header, sizeof(struct exec));
147*57081Sakito 	if (i != sizeof(struct exec) ||
148*57081Sakito 	    (header.a_magic != 0407 && header.a_magic != 0413 && header.a_magic != 0410)) {
149*57081Sakito 		printf("illegal magic number ... 0x%x\n");
150*57081Sakito 		printf("Bad format\n");
151*57081Sakito 		return(0);
152*57081Sakito 	}
153*57081Sakito 
154*57081Sakito 	load = addr = (char *) (header.a_entry & 0x00FFFFFF);
155*57081Sakito 
156*57081Sakito 	printf("%d", header.a_text);
157*57081Sakito 	if (header.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
158*57081Sakito 		goto shread;
159*57081Sakito 
160*57081Sakito 	/*
161*57081Sakito 	 * Load TEXT Segment
162*57081Sakito 	 */
163*57081Sakito 
164*57081Sakito 	if (read(io, (char *)addr, header.a_text) != header.a_text)
165*57081Sakito 		goto shread;
166*57081Sakito 	addr += header.a_text;
167*57081Sakito 	if (header.a_magic == 0413 || header.a_magic == 0410)
168*57081Sakito 		while ((int)addr & CLOFSET)
169*57081Sakito 			*addr++ = 0;
170*57081Sakito 
171*57081Sakito 	/*
172*57081Sakito 	 * Load DATA Segment
173*57081Sakito 	 */
174*57081Sakito 
175*57081Sakito 	printf("+%d", header.a_data);
176*57081Sakito 	if (read(io, addr, header.a_data) != header.a_data)
177*57081Sakito 		goto shread;
178*57081Sakito 
179*57081Sakito 	/*
180*57081Sakito 	 * Clear BSS Segment
181*57081Sakito 	 */
182*57081Sakito 
183*57081Sakito 	addr += header.a_data;
184*57081Sakito 	printf("+%d", header.a_bss);
185*57081Sakito 	header.a_bss += 128*512;	/* slop */
186*57081Sakito 	for (i = 0; i < header.a_bss; i++)
187*57081Sakito 		*addr++ = 0;
188*57081Sakito 
189*57081Sakito 	return(load);
190*57081Sakito 
191*57081Sakito shread:
192*57081Sakito 	printf("   Short read\n");
193*57081Sakito 	return(0);
194*57081Sakito }
195*57081Sakito 
196