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, and Kazumasa Utashiro of Software Research 7 * Associates, Inc. 8 * 9 * %sccs.include.redist.c% 10 * 11 * @(#)swapgeneric.c 7.2 (Berkeley) 12/17/92 12 */ 13 14 #include <machine/fix_machine_type.h> 15 16 #include <sysparam.h> 17 #include <sysconf.h> 18 #include <sysbuf.h> 19 #include <syssystm.h> 20 #include <sysreboot.h> 21 22 #ifdef CPU_DOUBLE 23 #include <news3400/iop/iopvar.h> 24 #else /* CPU_DOUBLE */ 25 #include <news3400/hbdev/hbvar.h> 26 # define iop hb 27 28 # define idinit hdinit 29 30 # define im_driver hm_driver 31 # define im_ctlr hm_ctlr 32 # define im_alive hm_alive 33 # define im_addr hm_addr 34 # define im_intr hm_intr 35 # define im_scnum hm_scnum 36 # define im_hd hm_hd 37 # define im_hbinfo hm_hbinfo 38 # define im_tab hm_tab 39 40 # define ii_driver hi_driver 41 # define ii_unit hi_unit 42 # define ii_ctlr hi_ctlr 43 # define ii_slave hi_slave 44 # define ii_addr hi_addr 45 # define ii_intr hi_intr 46 # define ii_dk hi_dk 47 # define ii_flags hi_flags 48 # define ii_alive hi_alive 49 # define ii_type hi_type 50 # define ii_forw hi_forw 51 # define ii_mi hi_mi 52 # define ii_hd hi_hd 53 54 # define id_probe hd_probe 55 # define id_slave hd_slave 56 # define id_attach hd_attach 57 # define id_dgo hd_dgo 58 # define id_dname hd_dname 59 # define id_dinfo hd_dinfo 60 # define id_mname hd_mname 61 # define id_minfo hd_minfo 62 #endif /* CPU_DOUBLE */ 63 64 # include "sd.h" 65 # include "hd.h" 66 # include "fd.h" 67 # include "od.h" 68 69 /* 70 * Generic configuration; all in one 71 */ 72 dev_t rootdev = NODEV; 73 dev_t argdev = NODEV; 74 dev_t dumpdev = NODEV; 75 int nswap; 76 struct swdevt swdevt[] = { 77 { -1, 1, 0 }, 78 { 0, 0, 0 }, 79 }; 80 int dmmin, dmmax, dmtext; 81 82 # if NSDC > 0 83 extern struct iop/**/_driver sdcdriver; 84 # endif 85 # if NHC > 0 86 extern struct iop/**/_driver hcdriver; 87 # endif 88 # if NFC > 0 89 extern struct iop/**/_driver fcdriver; 90 # endif 91 # if NOC > 0 92 extern struct iop/**/_driver ocdriver; 93 # endif 94 95 struct genericconf { 96 caddr_t gc_driver; 97 char *gc_name; 98 dev_t gc_root; 99 } genericconf[] = { 100 # if NSDC > 0 101 { (caddr_t)&sdcdriver, "sd", makedev(0, 0), }, 102 # endif 103 # if NHC > 0 104 { (caddr_t)&hcdriver, "hd", makedev(0, 0), }, 105 # endif 106 # if NFC > 0 107 { (caddr_t)&fcdriver, "fh", makedev(1, 0), }, 108 { (caddr_t)&fcdriver, "fd", makedev(1, 1), }, 109 # endif 110 # if NOC > 0 111 { (caddr_t)&ocdriver, "od", makedev(10, 0), }, 112 # endif 113 { 0 }, 114 }; 115 116 setconf() 117 { 118 register struct scsi_device *dp; 119 register struct genericconf *gc; 120 register char *cp, *gp; 121 int unit, swaponroot = 0; 122 123 if (rootdev != NODEV) 124 goto doswap; 125 unit = 0; 126 if (boothowto & RB_ASKNAME) { 127 char name[128]; 128 retry: 129 printf("root device? "); 130 gets(name); 131 for (gc = genericconf; gc->gc_driver; gc++) 132 for (cp = name, gp = gc->gc_name; *cp == *gp; cp++) 133 if (*++gp == 0) 134 goto gotit; 135 printf("use one of:"); 136 for (gc = genericconf; gc->gc_driver; gc++) 137 printf(" %s%%d", gc->gc_name); 138 printf("\n"); 139 goto retry; 140 gotit: 141 if (*++cp < '0' || *cp > '9') { 142 printf("bad/missing unit number\n"); 143 goto retry; 144 } 145 while (*cp >= '0' && *cp <= '9') 146 unit = 10 * unit + *cp++ - '0'; 147 if (*cp == '*') 148 swaponroot++; 149 goto found; 150 } 151 for (gc = genericconf; gc->gc_driver; gc++) { 152 for (dp = scsi_dinit; dp->sd_driver; dp++) { 153 if (dp->sd_alive == 0) 154 continue; 155 if (dp->sd_unit == unit && 156 dp->sd_driver == (struct driver *)gc->gc_driver) { 157 printf("root on %s%d%c\n", 158 dp->sd_driver->d_name, unit, 159 "ab"[swaponroot]); 160 goto found; 161 } 162 } 163 } 164 printf("no suitable root\n"); 165 goto retry; 166 found: 167 gc->gc_root = makedev(major(gc->gc_root), unit*8); 168 rootdev = gc->gc_root; 169 doswap: 170 swdevt[0].sw_dev = argdev = dumpdev = 171 makedev(major(rootdev), minor(rootdev)+1); 172 /* swap size and dumplo set during autoconfigure */ 173 if (swaponroot) 174 rootdev = dumpdev; 175 } 176 177 gets(cp) 178 char *cp; 179 { 180 register char *lp; 181 register c; 182 int s; 183 184 lp = cp; 185 s = spltty(); 186 for (;;) { 187 cnputc(c = cngetc()); 188 switch (c) { 189 case '\r': 190 cnputc('\n'); 191 *lp++ = '\0'; 192 break; 193 case '\n': 194 cnputc('\r'); 195 *lp++ = '\0'; 196 break; 197 case '\b': 198 case '\177': 199 if (lp > cp) { 200 lp--; 201 cnputc(' '); 202 cnputc('\b'); 203 } 204 continue; 205 case '#': 206 lp--; 207 if (lp < cp) 208 lp = cp; 209 continue; 210 case '@': 211 case 'u'&037: 212 lp = cp; 213 cnputc('\n'); 214 continue; 215 default: 216 *lp++ = c; 217 continue; 218 } 219 break; 220 } 221 splx(s); 222 } 223