BSD 4_3 release
[unix-history] / usr / src / sys / stand / bootra.c
CommitLineData
8ae0e4b4 1/*
0880b18e 2 * Copyright (c) 1982, 1986 Regents of the University of California.
8ae0e4b4
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
95f51977 6 * @(#)bootra.c 7.1 (Berkeley) 6/5/86
8ae0e4b4 7 */
b6c81d5e
RE
8
9#include "../h/param.h"
10#include "../h/inode.h"
11#include "../h/fs.h"
12#include "../h/vm.h"
13#include <a.out.h>
14#include "saio.h"
15#include "../h/reboot.h"
16
95f51977 17char bootprog[20] = "ra(0,0)boot";
b6c81d5e
RE
18
19/*
20 * Boot program... arguments passed in r10 and r11
21 * are passed through to the full boot program.
22 */
23
24main()
25{
24a62d66
MK
26 register unsigned howto, devtype; /* howto=r11, devtype=r10 */
27 int io, unit, partition;
28 register char *cp;
b6c81d5e
RE
29
30#ifdef lint
31 howto = 0; devtype = 0;
32#endif
24a62d66
MK
33 unit = (devtype >> B_UNITSHIFT) & B_UNITMASK;
34 unit += 8 * ((devtype >> B_ADAPTORSHIFT) & B_ADAPTORMASK);
35 partition = (devtype >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
36 cp = bootprog + 3;
37 if (unit >= 10)
38 *cp++ = unit / 10 + '0';
39 *cp++ = unit % 10 + '0';
40 *cp++ = ',';
41 if (partition >= 10)
42 *cp++ = partition / 10 + '0';
43 *cp++ = partition % 10 + '0';
44 bcopy((caddr_t) ")boot", cp, 6);
f834e141 45 printf("loading %s\n", bootprog);
b6c81d5e
RE
46 io = open(bootprog, 0);
47 if (io >= 0)
48 copyunix(howto, devtype, io);
f834e141 49 _stop("boot failed\n");
b6c81d5e
RE
50}
51
52/*ARGSUSED*/
53copyunix(howto, devtype, io)
54 register howto, devtype, io; /* howto=r11, devtype=r10 */
55{
56 struct exec x;
57 register int i;
58 char *addr;
59
60 i = read(io, (char *)&x, sizeof x);
61 if (i != sizeof x ||
62 (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410))
63 _stop("Bad format\n");
64 if ((x.a_magic == 0413 || x.a_magic == 0410) &&
65 lseek(io, 0x400, 0) == -1)
66 goto shread;
67 if (read(io, (char *)0, x.a_text) != x.a_text)
68 goto shread;
69 addr = (char *)x.a_text;
70 if (x.a_magic == 0413 || x.a_magic == 0410)
71 while ((int)addr & CLOFSET)
72 *addr++ = 0;
73 if (read(io, addr, x.a_data) != x.a_data)
74 goto shread;
75 addr += x.a_data;
76 x.a_bss += 128*512; /* slop */
77 for (i = 0; i < x.a_bss; i++)
78 *addr++ = 0;
79 x.a_entry &= 0x7fffffff;
80 (*((int (*)()) x.a_entry))();
f834e141 81 return;
b6c81d5e
RE
82shread:
83 _stop("Short read\n");
84}