|
|
1.1 root 1: #include "../machine/pte.h"
2:
3: #include "../h/param.h"
4: #include "../h/conf.h"
5: #include "../h/buf.h"
6: #include "../h/vm.h"
7: #include "../h/systm.h"
8: #include "../h/reboot.h"
9:
10: #include "../tahoe/cp.h"
11: #include "../tahoe/mtpr.h"
12: #include "../vba/vbavar.h"
13:
14: /*
15: * Generic configuration; all in one
16: */
17: dev_t rootdev, argdev, dumpdev;
18: int nswap;
19: struct swdevt swdevt[] = {
20: { -1, 1, 0 },
21: { 0, 0, 0 },
22: };
23: long dumplo;
24: int dmmin, dmmax, dmtext;
25:
26: extern struct vba_driver vddriver;
27:
28: struct genericconf {
29: caddr_t gc_driver;
30: char *gc_name;
31: dev_t gc_root;
32: } genericconf[] = {
33: { (caddr_t)&vddriver, "fsd", makedev(1, 0), },
34: { (caddr_t)&vddriver, "smd", makedev(1, 0), },
35: { (caddr_t)&vddriver, "xfd", makedev(1, 0), },
36: { (caddr_t)&vddriver, "xsd", makedev(1, 0), },
37: { 0 },
38: };
39:
40: setconf()
41: {
42: register struct vba_device *ui;
43: register struct genericconf *gc;
44: int unit, swaponroot = 0;
45:
46: if (boothowto & RB_ASKNAME) {
47: char name[128];
48: retry:
49: printf("root device? ");
50: gets(name);
51: for (gc = genericconf; gc->gc_driver; gc++)
52: if (gc->gc_name[0] == name[0] &&
53: gc->gc_name[1] == name[1] &&
54: gc->gc_name[2] == name[2])
55: goto gotit;
56: goto bad;
57: gotit:
58: if (name[4] == '*') {
59: name[4] = name[5];
60: swaponroot++;
61: }
62: if (name[3] >= '0' && name[3] <= '7' && name[4] == 0) {
63: unit = name[3] - '0';
64: goto found;
65: }
66: printf("bad/missing unit number\n");
67: bad:
68: printf("use fsd%%d, smd%%d, xfd%%d, or xsd%%d\n");
69: goto retry;
70: }
71: unit = 0;
72: for (gc = genericconf; gc->gc_driver; gc++) {
73: for (ui = vbdinit; ui->ui_driver; ui++) {
74: if (ui->ui_alive == 0)
75: continue;
76: if (ui->ui_unit == 0 && ui->ui_driver ==
77: (struct vba_driver *)gc->gc_driver) {
78: printf("root on %s0\n",
79: ui->ui_driver->ud_dname);
80: goto found;
81: }
82: }
83: }
84: printf("no suitable root\n");
85: asm("halt");
86: found:
87: gc->gc_root = makedev(major(gc->gc_root), unit*8);
88: rootdev = gc->gc_root;
89: swdevt[0].sw_dev = argdev = dumpdev =
90: makedev(major(rootdev), minor(rootdev)+1);
91: /* swap size and dumplo set during autoconfigure */
92: if (swaponroot)
93: rootdev = dumpdev;
94: }
95:
96: getchar()
97: {
98: char c;
99: int timo;
100: extern struct cpdcb_i consin[];
101: extern struct cphdr *lasthdr;
102: #define cpin consin[CPCONS]
103:
104: timo = 10000;
105: uncache((char *)&lasthdr->cp_unit);
106: while ((lasthdr->cp_unit & CPTAKE)==0 && --timo )
107: uncache((char *)&lasthdr->cp_unit);
108: cpin.cp_hdr.cp_unit = CPCONS; /* Resets done bit */
109: cpin.cp_hdr.cp_comm = CPREAD;
110: cpin.cp_hdr.cp_count = 1;
111: mtpr(&cpin, CPMDCB);
112: while ((cpin.cp_hdr.cp_unit & CPDONE) == 0)
113: uncache (&cpin.cp_hdr.cp_unit);
114: uncache (&cpin.cpi_buf[0]);
115: c = cpin.cpi_buf[0] & 0x7f;
116: lasthdr = (struct cphdr *)&cpin;
117: if (c == '\r')
118: c = '\n';
119: printf("%c", c); /* takes care of interrupts & parity */
120: return (c);
121: }
122:
123: gets(cp)
124: char *cp;
125: {
126: register char *lp;
127: register c;
128:
129: lp = cp;
130: for (;;) {
131: c = getchar() & 0177;
132: switch (c) {
133: case '\n':
134: case '\r':
135: *lp++ = '\0';
136: return;
137: case '\b':
138: case '#':
139: lp--;
140: if (lp < cp)
141: lp = cp;
142: continue;
143: case '@':
144: case 'u'&037:
145: lp = cp;
146: printf("%c", '\n');
147: continue;
148: default:
149: *lp++ = c;
150: }
151: }
152: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.