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