|
|
1.1 root 1: /* boot.c 4.1 11/9/80 */
2:
3: #include "../h/param.h"
4: #include "../h/ino.h"
5: #include "../h/inode.h"
6: #include "../h/filsys.h"
7: #include "../h/dir.h"
8: #include "../h/vm.h"
9: #include <a.out.h>
10: #include "saio.h"
11: #include <sys/reboot.h>
12:
13: /*
14: * Boot program... arguments passed in r10 and r11 determine
15: * whether boot stops to ask for system name and which device
16: * boot comes from.
17: */
18:
19: /* Types in r10 specifying major device */
20: char devname[][2] = {
21: 'h','p', /* 0 = hp */
22: 0,0, /* 1 = ht */
23: 'u','p', /* 2 = up */
24: 'r','k', /* 3 = rk */
25: };
26:
27: char line[100] = "xx(0,0)vmunix";
28:
29: main()
30: {
31: register howto, devtype; /* howto=r11, devtype=r10 */
32: int io, retry;
33:
34: printf("\nBoot\n");
35: #ifdef JUSTASK
36: howto = RB_ASKNAME|RB_SINGLE;
37: #else
38: if ((howto&RB_ASKNAME)==0) {
39: if (devtype>=0 && devtype<sizeof(devname)/2
40: && devname[devtype][0]) {
41: line[0] = devname[devtype][0];
42: line[1] = devname[devtype][1];
43: } else {
44: printf("DID YOU MEAN ``BOOT ANY?'' (Bad devtype (r10=%x))\n", devtype);
45: howto = RB_SINGLE|RB_ASKNAME;
46: }
47: }
48: #endif
49: retry = 0;
50: for (;;) {
51: if (howto & RB_ASKNAME) {
52: printf(": ");
53: gets(line);
54: } else
55: printf(": %s\n", line);
56: io = open(line, 0);
57: if (io >= 0)
58: copyunix(howto, io);
59: if (++retry > 2)
60: howto = RB_SINGLE|RB_ASKNAME;
61: }
62: }
63:
64: copyunix(howto, io)
65: register howto, io;
66: {
67: struct exec x;
68: register int i;
69: char *addr;
70:
71: i = read(io, (char *)&x, sizeof x);
72: if (i != sizeof x || x.a_magic != 0410)
73: _stop("Bad format\n");
74: printf("%d", x.a_text);
75: if (read(io, (char *)0, x.a_text) != x.a_text)
76: goto shread;
77: addr = (char *)x.a_text;
78: while ((int)addr & CLOFSET)
79: *addr++ = 0;
80: printf("+%d", x.a_data);
81: if (read(io, addr, x.a_data) != x.a_data)
82: goto shread;
83: addr += x.a_data;
84: printf("+%d", x.a_bss);
85: x.a_bss += 128*512; /* slop */
86: for (i = 0; i < x.a_bss; i++)
87: *addr++ = 0;
88: x.a_entry &= 0x7fffffff;
89: printf(" start 0x%x\n", x.a_entry);
90: (*((int (*)()) x.a_entry))();
91: _exit();
92: shread:
93: _stop("Short read\n");
94: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.