1 /* 2 * Copyright (c) 1982, 1986 Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 * 7 * @(#)swapgeneric.c 7.5 (Berkeley) 05/07/91 8 */ 9 10 #include "sys/param.h" 11 #include "sys/conf.h" 12 #include "sys/buf.h" 13 #include "sys/systm.h" 14 #include "sys/reboot.h" 15 16 #include "../dev/device.h" 17 18 /* 19 * Generic configuration; all in one 20 */ 21 dev_t rootdev = NODEV; 22 dev_t argdev = NODEV; 23 dev_t dumpdev = NODEV; 24 int nswap; 25 struct swdevt swdevt[] = { 26 { -1, 1, 0 }, 27 { 0, 0, 0 }, 28 }; 29 int dmmin, dmmax, dmtext; 30 31 extern struct driver rddriver; 32 extern struct driver sddriver; 33 extern struct hp_ctlr hp_cinit[]; 34 extern struct hp_device hp_dinit[]; 35 36 struct genericconf { 37 caddr_t gc_driver; 38 char *gc_name; 39 dev_t gc_root; 40 } genericconf[] = { 41 { (caddr_t)&rddriver, "rd", makedev(2, 0), }, 42 { (caddr_t)&sddriver, "sd", makedev(4, 0), }, 43 { 0 }, 44 }; 45 46 setconf() 47 { 48 register struct hp_ctlr *hc; 49 register struct hp_device *hd; 50 register struct genericconf *gc; 51 register char *cp; 52 int unit, swaponroot = 0; 53 54 if (rootdev != NODEV) 55 goto doswap; 56 unit = 0; 57 if (boothowto & RB_ASKNAME) { 58 char name[128]; 59 retry: 60 printf("root device? "); 61 gets(name); 62 for (gc = genericconf; gc->gc_driver; gc++) 63 if (gc->gc_name[0] == name[0] && 64 gc->gc_name[1] == name[1]) 65 goto gotit; 66 printf("use one of:"); 67 for (gc = genericconf; gc->gc_driver; gc++) 68 printf(" %s%%d", gc->gc_name); 69 printf("\n"); 70 goto retry; 71 gotit: 72 if (*++cp < '0' || *cp > '9') { 73 printf("bad/missing unit number\n"); 74 goto retry; 75 } 76 while (*cp >= '0' && *cp <= '9') 77 unit = 10 * unit + *cp++ - '0'; 78 if (*cp == '*') 79 swaponroot++; 80 goto found; 81 } 82 for (gc = genericconf; gc->gc_driver; gc++) { 83 for (hd = hp_dinit; hd->hp_driver; hd++) { 84 if (hd->hp_alive == 0) 85 continue; 86 if (hd->hp_unit == 0 && hd->hp_driver == 87 (struct driver *)gc->gc_driver) { 88 printf("root on %s0\n", hd->hp_driver->d_name); 89 goto found; 90 } 91 } 92 } 93 printf("no suitable root\n"); 94 asm("stop #0x2700"); 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 112 lp = cp; 113 for (;;) { 114 cnputc(c = cngetc()); 115 switch (c) { 116 case '\n': 117 case '\r': 118 *lp++ = '\0'; 119 return; 120 case '\b': 121 case '\177': 122 if (lp > cp) { 123 lp--; 124 cnputc(' '); 125 cnputc('\b'); 126 } 127 continue; 128 case '#': 129 lp--; 130 if (lp < cp) 131 lp = cp; 132 continue; 133 case '@': 134 case 'u'&037: 135 lp = cp; 136 cnputc('\n'); 137 continue; 138 default: 139 *lp++ = c; 140 } 141 } 142 } 143