1 /* 2 * Copyright (c) 1992 Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Ralph Campbell. 7 * 8 * %sccs.include.redist.c% 9 * 10 * @(#)swapgeneric.c 7.1 (Berkeley) 01/07/92 11 */ 12 13 #include "param.h" 14 #include "conf.h" 15 #include "buf.h" 16 #include "systm.h" 17 #include "reboot.h" 18 19 #include "../dev/device.h" 20 21 /* 22 * Generic configuration; all in one 23 */ 24 dev_t rootdev = NODEV; 25 dev_t argdev = NODEV; 26 dev_t dumpdev = NODEV; 27 int nswap; 28 struct swdevt swdevt[] = { 29 { -1, 1, 0 }, 30 { 0, 0, 0 }, 31 }; 32 int dmmin, dmmax, dmtext; 33 34 extern struct driver rzdriver; 35 36 struct genericconf { 37 caddr_t gc_driver; 38 char *gc_name; 39 dev_t gc_root; 40 } genericconf[] = { 41 { (caddr_t)&rzdriver, "rz", makedev(0, 0), }, 42 { 0 }, 43 }; 44 45 setconf() 46 { 47 register struct scsi_device *dp; 48 register struct genericconf *gc; 49 register char *cp, *gp; 50 int unit, swaponroot = 0; 51 52 if (rootdev != NODEV) 53 goto doswap; 54 unit = 0; 55 if (boothowto & RB_ASKNAME) { 56 char name[128]; 57 retry: 58 printf("root device? "); 59 gets(name); 60 for (gc = genericconf; gc->gc_driver; gc++) 61 for (cp = name, gp = gc->gc_name; *cp == *gp; cp++) 62 if (*++gp == 0) 63 goto gotit; 64 printf("use one of:"); 65 for (gc = genericconf; gc->gc_driver; gc++) 66 printf(" %s%%d", gc->gc_name); 67 printf("\n"); 68 goto retry; 69 gotit: 70 if (*++cp < '0' || *cp > '9') { 71 printf("bad/missing unit number\n"); 72 goto retry; 73 } 74 while (*cp >= '0' && *cp <= '9') 75 unit = 10 * unit + *cp++ - '0'; 76 if (*cp == '*') 77 swaponroot++; 78 goto found; 79 } 80 for (gc = genericconf; gc->gc_driver; gc++) { 81 for (dp = scsi_dinit; dp->sd_driver; dp++) { 82 if (dp->sd_alive == 0) 83 continue; 84 if (dp->sd_unit == unit && 85 dp->sd_driver == (struct driver *)gc->gc_driver) { 86 printf("root on %s%d%c\n", 87 dp->sd_driver->d_name, unit, 88 "ab"[swaponroot]); 89 goto found; 90 } 91 } 92 } 93 printf("no suitable root\n"); 94 goto retry; 95 found: 96 gc->gc_root = makedev(major(gc->gc_root), unit*8); 97 rootdev = gc->gc_root; 98 doswap: 99 swdevt[0].sw_dev = argdev = dumpdev = 100 makedev(major(rootdev), minor(rootdev)+1); 101 /* swap size and dumplo set during autoconfigure */ 102 if (swaponroot) 103 rootdev = dumpdev; 104 } 105 106 gets(cp) 107 char *cp; 108 { 109 register char *lp; 110 register c; 111 int s; 112 113 lp = cp; 114 s = spltty(); 115 for (;;) { 116 cnputc(c = cngetc()); 117 switch (c) { 118 case '\r': 119 cnputc('\n'); 120 *lp++ = '\0'; 121 break; 122 case '\n': 123 cnputc('\r'); 124 *lp++ = '\0'; 125 break; 126 case '\b': 127 case '\177': 128 if (lp > cp) { 129 lp--; 130 cnputc(' '); 131 cnputc('\b'); 132 } 133 continue; 134 case '#': 135 lp--; 136 if (lp < cp) 137 lp = cp; 138 continue; 139 case '@': 140 case 'u'&037: 141 lp = cp; 142 cnputc('\n'); 143 continue; 144 default: 145 *lp++ = c; 146 continue; 147 } 148 break; 149 } 150 splx(s); 151 } 152