BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / hp300 / stand / boot.c
CommitLineData
af359dea 1/*-
a8fd2d0d
KM
2 * Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
af359dea
C
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
a8fd2d0d 32 *
af359dea 33 * @(#)boot.c 7.4 (Berkeley) 5/5/91
a8fd2d0d
KM
34 */
35
af359dea
C
36#include <sys/param.h>
37#include <sys/reboot.h>
a8fd2d0d
KM
38#include <a.out.h>
39#include "saio.h"
a8fd2d0d
KM
40
41#ifndef INSECURE
b28b3a13 42#include "sys/stat.h"
a8fd2d0d
KM
43struct stat sb;
44#endif
af359dea 45 /* XXX -- see sys/reboot.h */
a8fd2d0d
KM
46#define B_MAKEDEV(a,u,p,t) \
47 (((a) << B_ADAPTORSHIFT) | ((u) << B_UNITSHIFT) | \
48 ((p) << B_PARTITIONSHIFT) | ((t) << B_TYPESHIFT))
49
50/*
51 * Boot program... arguments in `devtype' and `howto' determine
52 * whether boot stops to ask for system name and which device
53 * boot comes from.
54 */
55
56/* Types in `devtype' specifying major device */
57char devname[][2] = {
af359dea
C
58 '\0', '\0', /* 0 = ct */
59 '\0', '\0', /* 1 = fd */
60 'r', 'd', /* 2 = rd */
61 '\0', '\0', /* 3 = sw */
62 's', 'd', /* 4 = sd */
a8fd2d0d
KM
63};
64#define MAXTYPE (sizeof(devname) / sizeof(devname[0]))
65
a8fd2d0d
KM
66char line[100];
67
68int retry = 0;
69extern char *lowram;
70extern int noconsole;
71extern int howto, devtype;
72
73#define MSUS (0xfffffedc)
74
75char rom2mdev[] = {
76 0, /* 0 - none */
77 0, /* 1 - none */
78 0, /* 2 - none */
79 0, /* 3 - none */
80 0, /* 4 - none */
81 0, /* 5 - none */
82 0, /* 6 - none */
83 0, /* 7 - none */
84 0, /* 8 - none */
85 0, /* 9 - none */
86 0, /* 10 - none */
87 0, /* 11 - none */
88 0, /* 12 - none */
89 0, /* 13 - none */
90 4, /* 14 - SCSI disk */
91 0, /* 15 - none */
92 2, /* 16 - CS/80 device on HPIB */
93 2, /* 17 - CS/80 device on HPIB */
94 0, /* 18 - none */
95 0, /* 19 - none */
96 0, /* 20 - none */
97 0, /* 21 - none */
98 0, /* 22 - none */
99 0, /* 23 - none */
100 0, /* 24 - none */
101 0, /* 25 - none */
102 0, /* 26 - none */
103 0, /* 27 - none */
104 0, /* 28 - none */
105 0, /* 29 - none */
106 0, /* 30 - none */
107 0, /* 31 - none */
108};
109
110main()
111{
112 register type, part, unit, io;
113 register char *cp;
114
115 printf("\nBoot\n");
116#ifdef JUSTASK
117 howto = RB_ASKNAME|RB_SINGLE;
118#else
119 type = (devtype >> B_TYPESHIFT) & B_TYPEMASK;
120 unit = (devtype >> B_UNITSHIFT) & B_UNITMASK;
121 unit += 8 * ((devtype >> B_ADAPTORSHIFT) & B_ADAPTORMASK);
122 part = (devtype >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
123 if ((howto & RB_ASKNAME) == 0) {
124 if ((devtype & B_MAGICMASK) != B_DEVMAGIC) {
125 /*
126 * we have to map the ROM device type codes
127 * to Unix major device numbers.
128 */
129 type = rom2mdev[*(char *)MSUS & 0x1f];
130 devtype = (devtype &~ (B_TYPEMASK << B_TYPESHIFT))
131 | (type << B_TYPESHIFT);
132 }
133 if (type >= 0 && type <= MAXTYPE && devname[type][0]) {
134 cp = line;
135 *cp++ = devname[type][0];
136 *cp++ = devname[type][1];
137 *cp++ = '(';
138 if (unit >= 10)
139 *cp++ = unit / 10 + '0';
140 *cp++ = unit % 10 + '0';
141 *cp++ = ',';
142 *cp++ = part + '0';
143 *cp++ = ')';
144 strcpy(cp, UNIX);
145 } else
146 howto = RB_SINGLE|RB_ASKNAME;
147 }
148#endif
149 for (;;) {
150 if (!noconsole && (howto & RB_ASKNAME)) {
151 printf(": ");
152 gets(line);
153 } else
154 printf(": %s\n", line);
155 io = open(line, 0);
156 if (io >= 0) {
157#ifndef INSECURE
158 (void) fstat(io, &sb);
159 if (sb.st_uid || (sb.st_mode & 2)) {
160 printf("non-secure file, will not load\n");
161 howto = RB_SINGLE|RB_ASKNAME;
162 continue;
163 }
164#endif
165 if (howto & RB_ASKNAME) {
166 /*
167 * Build up devtype register to pass on to
168 * booted program.
169 */
170 cp = line;
171 for (type = 0; type <= MAXTYPE; type++)
172 if ((devname[type][0] == cp[0]) &&
173 (devname[type][1] == cp[1]))
174 break;
175 if (type <= MAXTYPE) {
176 cp += 3;
177 unit = *cp++ - '0';
178 if (*cp >= '0' && *cp <= '9')
179 unit = unit * 10 + *cp++ - '0';
180 cp++;
181 part = atol(cp);
182 devtype = B_MAKEDEV(unit >> 3, unit & 7, part, type);
183 }
184 }
185 devtype |= B_DEVMAGIC;
186 copyunix(howto, devtype, io);
187 close(io);
188 howto = RB_SINGLE|RB_ASKNAME;
189 }
190 bad:
191 if (++retry > 2)
192 howto = RB_SINGLE|RB_ASKNAME;
193 }
194}
195
196/*ARGSUSED*/
197copyunix(howto, devtype, io)
198 register howto; /* d7 contains boot flags */
199 register devtype; /* d6 contains boot device */
200 register io;
201{
202 struct exec x;
203 register int i;
204 register char *load; /* a5 contains load addr for unix */
205 register char *addr;
206
207 i = read(io, (char *)&x, sizeof x);
208 if (i != sizeof x ||
209 (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410))
210 _stop("Bad format\n");
211 printf("%d", x.a_text);
212 if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
213 goto shread;
214 load = addr = lowram;
215 if (read(io, (char *)addr, x.a_text) != x.a_text)
216 goto shread;
217 addr += x.a_text;
218 if (x.a_magic == 0413 || x.a_magic == 0410)
219 while ((int)addr & CLOFSET)
220 *addr++ = 0;
221 printf("+%d", x.a_data);
222 if (read(io, addr, x.a_data) != x.a_data)
223 goto shread;
224 addr += x.a_data;
225 printf("+%d", x.a_bss);
226 x.a_bss += 128*512; /* slop */
227 for (i = 0; i < x.a_bss; i++)
228 *addr++ = 0;
229 x.a_entry += (int)lowram;
230 printf(" start 0x%x\n", x.a_entry);
231#ifdef __GNUC__
232 asm(" movl %0,d7" : : "m" (howto));
233 asm(" movl %0,d6" : : "m" (devtype));
234 asm(" movl %0,a5" : : "a" (load));
235#endif
236 (*((int (*)()) x.a_entry))();
237 exit();
238shread:
239 _stop("Short read\n");
240}