1 /* 2 * Copyright (c) 1992 OMRON Corporation. 3 * Copyright (c) 1982, 1986, 1992, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * %sccs.include.redist.c% 7 * 8 * from: hp300/hp300/swapgeneric.c 7.8 (Berkeley) 10/11/92 9 * 10 * @(#)swapgeneric.c 8.1 (Berkeley) 06/16/93 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 { NODEV,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, part, swaponroot = 0; 58 59 if (rootdev != NODEV) 60 goto doswap; 61 unit = 0; 62 part = 0; 63 if (boothowto & RB_ASKNAME) { 64 char name[128]; 65 retry: 66 printf("root device? "); 67 gets(name); 68 for (gc = genericconf; gc->gc_driver; gc++) 69 if (gc->gc_name[0] == name[0] && 70 gc->gc_name[1] == name[1]) 71 goto gotit; 72 printf("use one of:"); 73 for (gc = genericconf; gc->gc_driver; gc++) 74 printf(" %s%%d", gc->gc_name); 75 printf("\n"); 76 goto retry; 77 gotit: 78 cp = &name[2]; 79 if (*cp < '0' || *cp > '9') { 80 printf("bad/missing unit number\n"); 81 goto retry; 82 } 83 while (*cp >= '0' && *cp <= '9') 84 unit = 10 * unit + *cp++ - '0'; 85 if (*cp < 'a' || *cp > 'h') { 86 printf("bad/missing partiiton number\n"); 87 goto retry; 88 } 89 part = *cp++ - 'a'; 90 /* 91 if (*cp == '*') 92 swaponroot++; 93 */ 94 goto found; 95 } 96 97 for (gc = genericconf; gc->gc_driver; gc++) { 98 for (hd = hp_dinit; hd->hp_driver; hd++) { 99 if (hd->hp_alive == 0) 100 continue; 101 if (hd->hp_unit == 0 && hd->hp_driver == 102 (struct driver *)gc->gc_driver) { 103 printf("root on %s0\n", hd->hp_driver->d_name); 104 goto found; 105 } 106 } 107 } 108 printf("no suitable root\n"); 109 asm("stop #0x2700"); 110 found: 111 gc->gc_root = makedev(major(gc->gc_root), (unit * 8) + part ); 112 rootdev = gc->gc_root; 113 /* 114 printf("using root device: %s%d%c\n", gc->gc_name, unit, 'a' + part); 115 */ 116 doswap: 117 swdevt[0].sw_dev = argdev = dumpdev = 118 makedev(major(rootdev), (minor(rootdev) & ~0x7) + 1); 119 /* 120 printf("using swap device: %s%d%c\n", 121 gc->gc_name, unit, 'a' + (minor(swdevt[0].sw_dev) & 0x7)); 122 */ 123 /* swap size and dumplo set during autoconfigure */ 124 if (swaponroot) 125 rootdev = dumpdev; 126 } 127 128 gets(cp) 129 char *cp; 130 { 131 register char *lp; 132 register c; 133 134 lp = cp; 135 for (;;) { 136 cnputc(c = cngetc()); 137 switch (c) { 138 case '\n': 139 case '\r': 140 *lp++ = '\0'; 141 return; 142 case '\b': 143 case '\177': 144 if (lp > cp) { 145 lp--; 146 cnputc(' '); 147 cnputc('\b'); 148 } 149 continue; 150 case '#': 151 lp--; 152 if (lp < cp) 153 lp = cp; 154 continue; 155 case '@': 156 case 'u'&037: 157 lp = cp; 158 cnputc('\n'); 159 continue; 160 default: 161 *lp++ = c; 162 } 163 } 164 } 165