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