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