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