|
|
1.1 root 1: /* boot.c 7.2 89/05/24 */
2:
3: #include "machine/mtpr.h"
4:
5: #include "param.h"
6: #include "inode.h"
7: #include "fs.h"
8: #include "vm.h"
9: #include "saio.h"
10: #include "reboot.h"
11:
12: #include <a.out.h>
13:
14: /*
15: * Boot program... arguments passed in r10 and r11 determine
16: * whether boot stops to ask for system name and which device
17: * boot comes from.
18: */
19:
20: /*#define DEV_DFLT 1 /* vd/dk */
21: #define DEV_DFLT 2 /* hd */
22:
23: char line[100];
24:
25: extern unsigned opendev;
26: extern unsigned bootdev;
27:
28: main()
29: {
30: register char *cp; /* skip r12 */
31: register u_int howto, devtype; /* howto=r11, devtype=r10 */
32: int io = 0, retry, type;
33:
34: #ifdef lint
35: howto = 0; devtype = 0;
36: #endif
37: if ((devtype & B_MAGICMASK) != B_DEVMAGIC)
38: devtype = DEV_DFLT << B_TYPESHIFT; /* unit, partition 0 */
39: bootdev = devtype;
40: #ifdef JUSTASK
41: howto = RB_ASKNAME|RB_SINGLE;
42: #else
43: if ((howto & RB_ASKNAME) == 0) {
44: type = (devtype >> B_TYPESHIFT) & B_TYPEMASK;
45: if ((unsigned)type < ndevs && devsw[type].dv_name)
46: strcpy(line, UNIX);
47: else
48: howto |= RB_SINGLE|RB_ASKNAME;
49: }
50: #endif
51: for (retry = 0;;) {
52: if (io >= 0)
53: printf("\nBoot");
54: if (howto & RB_ASKNAME) {
55: printf(": ");
56: gets(line);
57: if (line[0] == 0) {
58: strcpy(line, UNIX);
59: printf(": %s\n", line);
60: }
61: } else
62: printf(": %s\n", line);
63: io = open(line, 0);
64: if (io >= 0) {
65: copyunix(howto, opendev, io);
66: close(io);
67: howto |= RB_SINGLE|RB_ASKNAME;
68: }
69: if (++retry > 2)
70: howto |= RB_SINGLE|RB_ASKNAME;
71: }
72: }
73:
74: /*ARGSUSED*/
75: copyunix(howto, devtype, io)
76: register io, howto, devtype; /* NOTE ORDER */
77: {
78: register int esym; /* must be r9 */
79: register int i;
80: register char *addr;
81: struct exec x;
82:
83: if (read(io, (char *)&x, sizeof(x)) != sizeof(x) || N_BADMAG(x)) {
84: printf("bad magic #\n");
85: return;
86: }
87: printf("%ld", x.a_text);
88: if (x.a_magic == ZMAGIC && lseek(io, 0x400, 0) == -1)
89: goto shread;
90: if (read(io, (char *)RELOC, x.a_text) != x.a_text)
91: goto shread;
92: addr = (char *)(x.a_text + RELOC);
93: if (x.a_magic == ZMAGIC || x.a_magic == NMAGIC)
94: while ((int)addr & CLOFSET)
95: *addr++ = 0;
96: printf("+%ld", x.a_data);
97: if (read(io, addr, x.a_data) != x.a_data)
98: goto shread;
99: addr += x.a_data;
100: printf("+%ld", x.a_bss);
101: if (howto & RB_KDB && x.a_syms) {
102: for (i = 0; i < x.a_bss; i++)
103: *addr++ = 0;
104: *(int *)addr = x.a_syms; /* symbol table size */
105: addr += sizeof (int);
106: printf("[+%ld", x.a_syms);
107: if (read(io, addr, x.a_syms) != x.a_syms)
108: goto shread;
109: addr += x.a_syms;
110: if (read(io, addr, sizeof (int)) != sizeof (int))
111: goto shread;
112: i = *(int *)addr - sizeof (int); /* string table size */
113: addr += sizeof (int);
114: printf("+%d]", i);
115: if (read(io, addr, i) != i)
116: goto shread;
117: addr += i;
118: esym = roundup((int)addr, sizeof (int));
119: x.a_bss = 0;
120: } else
121: howto &= ~RB_KDB;
122: x.a_bss += 32*1024; /* slop */
123: for (i = 0; i < x.a_bss; i++)
124: *addr++ = 0;
125: x.a_entry &= 0x1fffffff;
126: printf(" start 0x%lx\n", x.a_entry);
127: mtpr(PADC, 0); /* Purge data cache */
128: mtpr(PACC, 0); /* Purge code cache */
129: mtpr(DCR, 1); /* Enable data cache */
130: (*((int (*)()) x.a_entry))();
131: return;
132: shread:
133: printf("short read\n");
134: return;
135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.