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.3 (Berkeley) 02/08/88 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 register char *cp; 69 int unit, swaponroot = 0; 70 71 if (rootdev != NODEV) 72 goto doswap; 73 if (boothowto & RB_ASKNAME) { 74 char name[128]; 75 retry: 76 printf("root device? "); 77 gets(name); 78 for (gc = genericconf; gc->gc_driver; gc++) 79 if (gc->gc_name[0] == name[0] && 80 gc->gc_name[1] == name[1]) 81 goto gotit; 82 printf("use hp%%d, up%%d, ra%%d, rb%%d, rl%%d or hk%%d\n"); 83 goto retry; 84 gotit: 85 cp = name + 2; 86 if (*cp < '0' || *cp > '9') { 87 printf("bad/missing unit number\n"); 88 goto retry; 89 } 90 unit = 0; 91 while (*cp >= '0' && *cp <= '9') 92 unit = 10 * unit + *cp++ - '0'; 93 if (*cp == '*') 94 swaponroot++; 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 gets(cp) 133 char *cp; 134 { 135 register char *lp; 136 register c; 137 138 lp = cp; 139 for (;;) { 140 cnputc(c = cngetc()); 141 switch (c) { 142 case '\n': 143 case '\r': 144 *lp++ = '\0'; 145 return; 146 case '\b': 147 case '#': 148 case '\177': 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