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 } 163