1 /* 2 * Copyright (c) 1982, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 * 7 * @(#)swapgeneric.c 8.1 (Berkeley) 06/16/93 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 <hp/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 { NODEV, 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 cp = &name[1]; 73 if (*++cp < '0' || *cp > '9') { 74 printf("bad/missing unit number\n"); 75 goto retry; 76 } 77 while (*cp >= '0' && *cp <= '9') 78 unit = 10 * unit + *cp++ - '0'; 79 if (*cp == '*') 80 swaponroot++; 81 goto found; 82 } 83 for (gc = genericconf; gc->gc_driver; gc++) { 84 for (hd = hp_dinit; hd->hp_driver; hd++) { 85 if (hd->hp_alive == 0) 86 continue; 87 if (hd->hp_unit == 0 && hd->hp_driver == 88 (struct driver *)gc->gc_driver) { 89 printf("root on %s0\n", hd->hp_driver->d_name); 90 goto found; 91 } 92 } 93 } 94 printf("no suitable root\n"); 95 asm("stop #0x2700"); 96 found: 97 gc->gc_root = makedev(major(gc->gc_root), unit*8); 98 rootdev = gc->gc_root; 99 doswap: 100 swdevt[0].sw_dev = argdev = dumpdev = 101 makedev(major(rootdev), minor(rootdev)+1); 102 /* swap size and dumplo set during autoconfigure */ 103 if (swaponroot) 104 rootdev = dumpdev; 105 } 106 107 gets(cp) 108 char *cp; 109 { 110 register char *lp; 111 register c; 112 113 lp = cp; 114 for (;;) { 115 cnputc(c = (cngetc() & 0177)); 116 switch (c) { 117 case '\n': 118 case '\r': 119 *lp++ = '\0'; 120 return; 121 case '\b': 122 case '\177': 123 if (lp > cp) { 124 lp--; 125 cnputc(' '); 126 cnputc('\b'); 127 } 128 continue; 129 case '#': 130 lp--; 131 if (lp < cp) 132 lp = cp; 133 continue; 134 case '@': 135 case 'u'&037: 136 lp = cp; 137 cnputc('\n'); 138 continue; 139 default: 140 *lp++ = c; 141 } 142 } 143 } 144