|
|
1.1 ! root 1: #include "../machine/pte.h" ! 2: ! 3: #include "../h/param.h" ! 4: #include "../h/conf.h" ! 5: #include "../h/buf.h" ! 6: #include "../h/vm.h" ! 7: #include "../h/systm.h" ! 8: #include "../h/reboot.h" ! 9: ! 10: #include "../tahoe/cp.h" ! 11: #include "../tahoe/mtpr.h" ! 12: #include "../vba/vbavar.h" ! 13: ! 14: /* ! 15: * Generic configuration; all in one ! 16: */ ! 17: dev_t rootdev, argdev, dumpdev; ! 18: int nswap; ! 19: struct swdevt swdevt[] = { ! 20: { -1, 1, 0 }, ! 21: { 0, 0, 0 }, ! 22: }; ! 23: long dumplo; ! 24: int dmmin, dmmax, dmtext; ! 25: ! 26: extern struct vba_driver vddriver; ! 27: ! 28: struct genericconf { ! 29: caddr_t gc_driver; ! 30: char *gc_name; ! 31: dev_t gc_root; ! 32: } genericconf[] = { ! 33: { (caddr_t)&vddriver, "fsd", makedev(1, 0), }, ! 34: { (caddr_t)&vddriver, "smd", makedev(1, 0), }, ! 35: { (caddr_t)&vddriver, "xfd", makedev(1, 0), }, ! 36: { (caddr_t)&vddriver, "xsd", makedev(1, 0), }, ! 37: { 0 }, ! 38: }; ! 39: ! 40: setconf() ! 41: { ! 42: register struct vba_device *ui; ! 43: register struct genericconf *gc; ! 44: int unit, swaponroot = 0; ! 45: ! 46: if (boothowto & RB_ASKNAME) { ! 47: char name[128]; ! 48: retry: ! 49: printf("root device? "); ! 50: gets(name); ! 51: for (gc = genericconf; gc->gc_driver; gc++) ! 52: if (gc->gc_name[0] == name[0] && ! 53: gc->gc_name[1] == name[1] && ! 54: gc->gc_name[2] == name[2]) ! 55: goto gotit; ! 56: goto bad; ! 57: gotit: ! 58: if (name[4] == '*') { ! 59: name[4] = name[5]; ! 60: swaponroot++; ! 61: } ! 62: if (name[3] >= '0' && name[3] <= '7' && name[4] == 0) { ! 63: unit = name[3] - '0'; ! 64: goto found; ! 65: } ! 66: printf("bad/missing unit number\n"); ! 67: bad: ! 68: printf("use fsd%%d, smd%%d, xfd%%d, or xsd%%d\n"); ! 69: goto retry; ! 70: } ! 71: unit = 0; ! 72: for (gc = genericconf; gc->gc_driver; gc++) { ! 73: for (ui = vbdinit; ui->ui_driver; ui++) { ! 74: if (ui->ui_alive == 0) ! 75: continue; ! 76: if (ui->ui_unit == 0 && ui->ui_driver == ! 77: (struct vba_driver *)gc->gc_driver) { ! 78: printf("root on %s0\n", ! 79: ui->ui_driver->ud_dname); ! 80: goto found; ! 81: } ! 82: } ! 83: } ! 84: printf("no suitable root\n"); ! 85: asm("halt"); ! 86: found: ! 87: gc->gc_root = makedev(major(gc->gc_root), unit*8); ! 88: rootdev = gc->gc_root; ! 89: swdevt[0].sw_dev = argdev = dumpdev = ! 90: makedev(major(rootdev), minor(rootdev)+1); ! 91: /* swap size and dumplo set during autoconfigure */ ! 92: if (swaponroot) ! 93: rootdev = dumpdev; ! 94: } ! 95: ! 96: getchar() ! 97: { ! 98: char c; ! 99: int timo; ! 100: extern struct cpdcb_i consin[]; ! 101: extern struct cphdr *lasthdr; ! 102: #define cpin consin[CPCONS] ! 103: ! 104: timo = 10000; ! 105: uncache((char *)&lasthdr->cp_unit); ! 106: while ((lasthdr->cp_unit & CPTAKE)==0 && --timo ) ! 107: uncache((char *)&lasthdr->cp_unit); ! 108: cpin.cp_hdr.cp_unit = CPCONS; /* Resets done bit */ ! 109: cpin.cp_hdr.cp_comm = CPREAD; ! 110: cpin.cp_hdr.cp_count = 1; ! 111: mtpr(&cpin, CPMDCB); ! 112: while ((cpin.cp_hdr.cp_unit & CPDONE) == 0) ! 113: uncache (&cpin.cp_hdr.cp_unit); ! 114: uncache (&cpin.cpi_buf[0]); ! 115: c = cpin.cpi_buf[0] & 0x7f; ! 116: lasthdr = (struct cphdr *)&cpin; ! 117: if (c == '\r') ! 118: c = '\n'; ! 119: printf("%c", c); /* takes care of interrupts & parity */ ! 120: return (c); ! 121: } ! 122: ! 123: gets(cp) ! 124: char *cp; ! 125: { ! 126: register char *lp; ! 127: register c; ! 128: ! 129: lp = cp; ! 130: for (;;) { ! 131: c = getchar() & 0177; ! 132: switch (c) { ! 133: case '\n': ! 134: case '\r': ! 135: *lp++ = '\0'; ! 136: return; ! 137: case '\b': ! 138: case '#': ! 139: lp--; ! 140: if (lp < cp) ! 141: lp = cp; ! 142: continue; ! 143: case '@': ! 144: case 'u'&037: ! 145: lp = cp; ! 146: printf("%c", '\n'); ! 147: continue; ! 148: default: ! 149: *lp++ = c; ! 150: } ! 151: } ! 152: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.