|
|
1.1 root 1: /* swapgeneric.c 6.1 83/08/05 */
2:
3: #include "mba.h"
4:
5: #include "../machine/pte.h"
6:
7: #include "../h/param.h"
8: #include "../h/conf.h"
9: #include "../h/buf.h"
10: #include "../h/vm.h"
11: #include "../h/systm.h"
12: #include "../h/reboot.h"
13:
14: #include "../vax/cons.h"
15: #include "../vax/mtpr.h"
16: #include "../vaxmba/mbareg.h"
17: #include "../vaxmba/mbavar.h"
18: #include "../vaxuba/ubareg.h"
19: #include "../vaxuba/ubavar.h"
20:
21: /*
22: * Generic configuration; all in one
23: */
24: dev_t rootdev, argdev, dumpdev;
25: int nswap;
26: struct swdevt swdevt[] = {
27: { -1, 1, 0 },
28: { 0, 0, 0 },
29: };
30: long dumplo;
31: int dmmin, dmmax, dmtext;
32:
33: extern struct mba_driver hpdriver;
34: extern struct uba_driver scdriver;
35: extern struct uba_driver hkdriver;
36: extern struct uba_driver idcdriver;
37: extern struct uba_driver hldriver;
38: extern struct uba_driver udadriver;
39:
40: struct genericconf {
41: caddr_t gc_driver;
42: char *gc_name;
43: dev_t gc_root;
44: } genericconf[] = {
45: { (caddr_t)&hpdriver, "hp", makedev(0, 0), },
46: { (caddr_t)&scdriver, "up", makedev(2, 0), },
47: { (caddr_t)&udadriver, "ra", makedev(9, 0), },
48: { (caddr_t)&idcdriver, "rb", makedev(11, 0), },
49: { (caddr_t)&hldriver, "rl", makedev(14, 0), },
50: { (caddr_t)&hkdriver, "hk", makedev(3, 0), },
51: { 0 },
52: };
53:
54: setconf()
55: {
56: register struct mba_device *mi;
57: register struct uba_device *ui;
58: register struct genericconf *gc;
59: int unit, swaponroot = 0;
60:
61: if (boothowto & RB_ASKNAME) {
62: char name[128];
63: retry:
64: printf("root device? ");
65: gets(name);
66: for (gc = genericconf; gc->gc_driver; gc++)
67: if (gc->gc_name[0] == name[0] &&
68: gc->gc_name[1] == name[1])
69: goto gotit;
70: goto bad;
71: gotit:
72: if (name[3] == '*') {
73: name[3] = name[4];
74: swaponroot++;
75: }
76: if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) {
77: unit = name[2] - '0';
78: goto found;
79: }
80: printf("bad/missing unit number\n");
81: bad:
82: printf("use hp%%d, up%%d, ra%%d, rb%%d, rl%%d or hk%%d\n");
83: goto retry;
84: }
85: unit = 0;
86: for (gc = genericconf; gc->gc_driver; gc++) {
87: for (mi = mbdinit; mi->mi_driver; mi++) {
88: if (mi->mi_alive == 0)
89: continue;
90: if (mi->mi_unit == 0 && mi->mi_driver ==
91: (struct mba_driver *)gc->gc_driver) {
92: printf("root on %s0\n",
93: mi->mi_driver->md_dname);
94: goto found;
95: }
96: }
97: for (ui = ubdinit; ui->ui_driver; ui++) {
98: if (ui->ui_alive == 0)
99: continue;
100: if (ui->ui_unit == 0 && ui->ui_driver ==
101: (struct uba_driver *)gc->gc_driver) {
102: printf("root on %s0\n",
103: ui->ui_driver->ud_dname);
104: goto found;
105: }
106: }
107: }
108: printf("no suitable root\n");
109: asm("halt");
110: found:
111: gc->gc_root = makedev(major(gc->gc_root), unit*8);
112: rootdev = gc->gc_root;
113: swdevt[0].sw_dev = argdev = dumpdev =
114: makedev(major(rootdev), minor(rootdev)+1);
115: /* swap size and dumplo set during autoconfigure */
116: if (swaponroot)
117: rootdev = dumpdev;
118: }
119:
120: getchar()
121: {
122: register c;
123:
124: while ((mfpr(RXCS)&RXCS_DONE) == 0)
125: ;
126: c = mfpr(RXDB)&0177;
127: if (c == '\r')
128: c = '\n';
129: cnputc(c);
130: return (c);
131: }
132:
133: gets(cp)
134: char *cp;
135: {
136: register char *lp;
137: register c;
138:
139: lp = cp;
140: for (;;) {
141: c = getchar() & 0177;
142: switch (c) {
143: case '\n':
144: case '\r':
145: *lp++ = '\0';
146: return;
147: case '\b':
148: case '#':
149: lp--;
150: if (lp < cp)
151: lp = cp;
152: continue;
153: case '@':
154: case 'u'&037:
155: lp = cp;
156: cnputc('\n');
157: continue;
158: default:
159: *lp++ = c;
160: }
161: }
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.