1 /* 2 * Copyright (c) 1992, 1993 3 * The Regents of the University of California. 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 8.1 (Berkeley) 06/16/93 11 */ 12 13 #include <sys/param.h> 14 #include <sys/conf.h> 15 #include <sys/buf.h> 16 #include <sys/systm.h> 17 #include <sys/reboot.h> 18 19 #include <pmax/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 { NODEV, 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 char *root_swap; 52 53 /* 54 * If we are running on the in memory, mini-root; then we just need 55 * to set the swap device. 56 */ 57 if (boothowto & RB_MINIROOT) 58 root_swap = "swap"; 59 else { 60 if (rootdev != NODEV) { 61 swdevt[0].sw_dev = argdev = dumpdev = 62 makedev(major(rootdev), minor(rootdev)+1); 63 return; 64 } 65 root_swap = "root"; 66 } 67 unit = 0; 68 if (boothowto & RB_ASKNAME) { 69 char name[128]; 70 retry: 71 printf("%s device? ", root_swap); 72 gets(name); 73 for (gc = genericconf; gc->gc_driver; gc++) 74 for (cp = name, gp = gc->gc_name; *cp == *gp; cp++) 75 if (*++gp == 0) 76 goto gotit; 77 printf("use one of:"); 78 for (gc = genericconf; gc->gc_driver; gc++) 79 printf(" %s%%d", gc->gc_name); 80 printf("\n"); 81 goto retry; 82 gotit: 83 if (*++cp < '0' || *cp > '9') { 84 printf("bad/missing unit number\n"); 85 goto retry; 86 } 87 while (*cp >= '0' && *cp <= '9') 88 unit = 10 * unit + *cp++ - '0'; 89 if (*cp == '*') 90 swaponroot++; 91 goto found; 92 } 93 for (gc = genericconf; gc->gc_driver; gc++) { 94 for (dp = scsi_dinit; dp->sd_driver; dp++) { 95 if (dp->sd_alive == 0) 96 continue; 97 if (dp->sd_unit == unit && 98 dp->sd_driver == (struct driver *)gc->gc_driver) { 99 printf("root on %s%d%c\n", 100 dp->sd_driver->d_name, unit, 101 "ab"[swaponroot]); 102 goto found; 103 } 104 } 105 } 106 printf("no suitable %s\n", root_swap); 107 goto retry; 108 found: 109 if (boothowto & RB_MINIROOT) { 110 swdevt[0].sw_dev = argdev = dumpdev = 111 makedev(major(gc->gc_root), unit*8+1); 112 } else { 113 rootdev = makedev(major(gc->gc_root), unit*8); 114 swdevt[0].sw_dev = argdev = dumpdev = 115 makedev(major(rootdev), minor(rootdev)+1); 116 /* swap size and dumplo set during autoconfigure */ 117 if (swaponroot) 118 rootdev = dumpdev; 119 } 120 } 121 122 gets(cp) 123 char *cp; 124 { 125 register char *lp; 126 register c; 127 int s; 128 129 lp = cp; 130 s = spltty(); 131 for (;;) { 132 cnputc(c = cngetc()); 133 switch (c) { 134 case '\r': 135 cnputc('\n'); 136 *lp++ = '\0'; 137 break; 138 case '\n': 139 cnputc('\r'); 140 *lp++ = '\0'; 141 break; 142 case '\b': 143 case '\177': 144 if (lp > cp) { 145 lp--; 146 cnputc(' '); 147 cnputc('\b'); 148 } 149 continue; 150 case '#': 151 lp--; 152 if (lp < cp) 153 lp = cp; 154 continue; 155 case '@': 156 case 'u'&037: 157 lp = cp; 158 cnputc('\n'); 159 continue; 160 default: 161 *lp++ = c; 162 continue; 163 } 164 break; 165 } 166 splx(s); 167 } 168