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