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