BSD 4_1c_2 development
[unix-history] / a / sys / stand / bootrl.c
CommitLineData
77415a98
C
1/* bootrl.c 4.3 83/02/20 */
2
3#include "../h/param.h"
4#include "../h/inode.h"
5#include "../h/fs.h"
6#include "../h/vm.h"
7#include <a.out.h>
8#include "saio.h"
9#include "../h/reboot.h"
10
11char bootprog[] = "rl(0,0)boot";
12
13/*
14 * Boot program... arguments passed in r10 and r11
15 * are passed through to the full boot program.
16 */
17
18main()
19{
20 register howto, devtype; /* howto=r11, devtype=r10 */
21 int io;
22
23#ifdef lint
24 howto = 0; devtype = 0;
25#endif
26 printf("loading %s", bootprog);
27 io = open(bootprog, 0);
28 if (io >= 0)
29 copyunix(howto, devtype, io);
30 printf("boot failed");
31 _exit();
32}
33
34/*ARGSUSED*/
35copyunix(howto, devtype, io)
36 register howto, devtype, io; /* howto=r11, devtype=r10 */
37{
38 struct exec x;
39 register int i;
40 char *addr;
41
42 i = read(io, (char *)&x, sizeof x);
43 if (i != sizeof x ||
44 (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410))
45 _stop("Bad format\n");
46 if ((x.a_magic == 0413 || x.a_magic == 0410) &&
47 lseek(io, 0x400, 0) == -1)
48 goto shread;
49 if (read(io, (char *)0, x.a_text) != x.a_text)
50 goto shread;
51 addr = (char *)x.a_text;
52 if (x.a_magic == 0413 || x.a_magic == 0410)
53 while ((int)addr & CLOFSET)
54 *addr++ = 0;
55 if (read(io, addr, x.a_data) != x.a_data)
56 goto shread;
57 addr += x.a_data;
58 x.a_bss += 128*512; /* slop */
59 for (i = 0; i < x.a_bss; i++)
60 *addr++ = 0;
61 x.a_entry &= 0x7fffffff;
62 (*((int (*)()) x.a_entry))();
63 _exit();
64shread:
65 _stop("Short read\n");
66}