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