xref: /original-bsd/sys/tahoe/tahoe/swapgeneric.c (revision 53530174)
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