1 /* swapgeneric.c 1.5 86/11/25 */ 2 3 #include "../machine/pte.h" 4 5 #include "param.h" 6 #include "conf.h" 7 #include "buf.h" 8 #include "vm.h" 9 #include "systm.h" 10 #include "reboot.h" 11 12 /* 13 * Generic configuration; all in one 14 */ 15 dev_t rootdev = 0; 16 dev_t argdev = 1; 17 dev_t dumpdev = 1; 18 int nswap; 19 struct swdevt swdevt[] = { 20 { 1, 0, 4*4096 }, 21 { 0, 1, 0 }, 22 }; 23 long dumplo; 24 int dmmin, dmmax, dmtext; 25 26 extern struct driver wddriver; 27 28 struct genericconf { 29 caddr_t gc_driver; 30 char *gc_name; 31 dev_t gc_root; 32 } genericconf[] = { 33 { (caddr_t)&wddriver, "wd", makedev(1, 0), }, 34 { 0 }, 35 }; 36 37 setconf() 38 { 39 #ifdef notdef 40 register struct genericconf *gc; 41 int unit, swaponroot = 0; 42 43 if (rootdev != NODEV) 44 goto doswap; 45 if (boothowto & RB_ASKNAME) { 46 char name[128]; 47 retry: 48 printf("root device? "); 49 gets(name); 50 for (gc = genericconf; gc->gc_driver; gc++) 51 if (gc->gc_name[0] == name[0] && 52 gc->gc_name[1] == name[1]) 53 goto gotit; 54 goto bad; 55 gotit: 56 if (name[3] == '*') { 57 name[3] = name[4]; 58 swaponroot++; 59 } 60 if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) { 61 unit = name[2] - '0'; 62 goto found; 63 } 64 printf("bad/missing unit number\n"); 65 bad: 66 printf("use dk%%d\n"); 67 goto retry; 68 } 69 unit = 0; 70 for (gc = genericconf; gc->gc_driver; gc++) { 71 for (ui = vbdinit; ui->ui_driver; ui++) { 72 if (ui->ui_alive == 0) 73 continue; 74 if (ui->ui_unit == 0 && ui->ui_driver == 75 (struct vba_driver *)gc->gc_driver) { 76 printf("root on %s0\n", 77 ui->ui_driver->ud_dname); 78 goto found; 79 } 80 } 81 } 82 printf("no suitable root\n"); 83 asm("halt"); 84 found: 85 gc->gc_root = makedev(major(gc->gc_root), unit*8); 86 rootdev = gc->gc_root; 87 doswap: 88 swdevt[0].sw_dev = argdev = dumpdev = 89 makedev(major(rootdev), minor(rootdev)+1); 90 /* swap size and dumplo set during autoconfigure */ 91 if (swaponroot) 92 rootdev = dumpdev; 93 #endif 94 } 95 96 gets(cp) 97 char *cp; 98 { 99 register char *lp; 100 register c; 101 102 lp = cp; 103 for (;;) { 104 printf("%c", c = cngetc()&0177); 105 switch (c) { 106 case '\n': 107 case '\r': 108 *lp++ = '\0'; 109 return; 110 case '\b': 111 case '\177': 112 if (lp > cp) { 113 printf(" \b"); 114 lp--; 115 } 116 continue; 117 case '#': 118 lp--; 119 if (lp < cp) 120 lp = cp; 121 continue; 122 case '@': 123 case 'u'&037: 124 lp = cp; 125 printf("%c", '\n'); 126 continue; 127 default: 128 *lp++ = c; 129 } 130 } 131 } 132