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