xref: /original-bsd/sys/vax/vax/swapgeneric.c (revision c43e4352)
1 /*	swapgeneric.c	6.1	83/08/05	*/
2 
3 #include "mba.h"
4 
5 #include "../machine/pte.h"
6 
7 #include "../h/param.h"
8 #include "../h/conf.h"
9 #include "../h/buf.h"
10 #include "../h/vm.h"
11 #include "../h/systm.h"
12 #include "../h/reboot.h"
13 
14 #include "../vax/cons.h"
15 #include "../vax/mtpr.h"
16 #include "../vaxmba/mbareg.h"
17 #include "../vaxmba/mbavar.h"
18 #include "../vaxuba/ubareg.h"
19 #include "../vaxuba/ubavar.h"
20 
21 /*
22  * Generic configuration;  all in one
23  */
24 dev_t	rootdev, argdev, dumpdev;
25 int	nswap;
26 struct	swdevt swdevt[] = {
27 	{ -1,	1,	0 },
28 	{ 0,	0,	0 },
29 };
30 long	dumplo;
31 int	dmmin, dmmax, dmtext;
32 
33 extern	struct mba_driver hpdriver;
34 extern	struct uba_driver scdriver;
35 extern	struct uba_driver hkdriver;
36 extern	struct uba_driver idcdriver;
37 extern	struct uba_driver hldriver;
38 extern	struct uba_driver udadriver;
39 
40 struct	genericconf {
41 	caddr_t	gc_driver;
42 	char	*gc_name;
43 	dev_t	gc_root;
44 } genericconf[] = {
45 	{ (caddr_t)&hpdriver,	"hp",	makedev(0, 0),	},
46 	{ (caddr_t)&scdriver,	"up",	makedev(2, 0),	},
47 	{ (caddr_t)&udadriver,	"ra",	makedev(9, 0),	},
48 	{ (caddr_t)&idcdriver,	"rb",	makedev(11, 0),	},
49 	{ (caddr_t)&hldriver,	"rl",	makedev(14, 0),	},
50 	{ (caddr_t)&hkdriver,	"hk",	makedev(3, 0),	},
51 	{ 0 },
52 };
53 
54 setconf()
55 {
56 	register struct mba_device *mi;
57 	register struct uba_device *ui;
58 	register struct genericconf *gc;
59 	int unit, swaponroot = 0;
60 
61 	if (boothowto & RB_ASKNAME) {
62 		char name[128];
63 retry:
64 		printf("root device? ");
65 		gets(name);
66 		for (gc = genericconf; gc->gc_driver; gc++)
67 			if (gc->gc_name[0] == name[0] &&
68 			    gc->gc_name[1] == name[1])
69 				goto gotit;
70 		goto bad;
71 gotit:
72 		if (name[3] == '*') {
73 			name[3] = name[4];
74 			swaponroot++;
75 		}
76 		if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) {
77 			unit = name[2] - '0';
78 			goto found;
79 		}
80 		printf("bad/missing unit number\n");
81 bad:
82 		printf("use hp%%d, up%%d, ra%%d, rb%%d, rl%%d or hk%%d\n");
83 		goto retry;
84 	}
85 	unit = 0;
86 	for (gc = genericconf; gc->gc_driver; gc++) {
87 		for (mi = mbdinit; mi->mi_driver; mi++) {
88 			if (mi->mi_alive == 0)
89 				continue;
90 			if (mi->mi_unit == 0 && mi->mi_driver ==
91 			    (struct mba_driver *)gc->gc_driver) {
92 				printf("root on %s0\n",
93 				    mi->mi_driver->md_dname);
94 				goto found;
95 			}
96 		}
97 		for (ui = ubdinit; ui->ui_driver; ui++) {
98 			if (ui->ui_alive == 0)
99 				continue;
100 			if (ui->ui_unit == 0 && ui->ui_driver ==
101 			    (struct uba_driver *)gc->gc_driver) {
102 				printf("root on %s0\n",
103 				    ui->ui_driver->ud_dname);
104 				goto found;
105 			}
106 		}
107 	}
108 	printf("no suitable root\n");
109 	asm("halt");
110 found:
111 	gc->gc_root = makedev(major(gc->gc_root), unit*8);
112 	rootdev = gc->gc_root;
113 	swdevt[0].sw_dev = argdev = dumpdev =
114 	    makedev(major(rootdev), minor(rootdev)+1);
115 	/* swap size and dumplo set during autoconfigure */
116 	if (swaponroot)
117 		rootdev = dumpdev;
118 }
119 
120 getchar()
121 {
122 	register c;
123 
124 	while ((mfpr(RXCS)&RXCS_DONE) == 0)
125 		;
126 	c = mfpr(RXDB)&0177;
127 	if (c == '\r')
128 		c = '\n';
129 	cnputc(c);
130 	return (c);
131 }
132 
133 gets(cp)
134 	char *cp;
135 {
136 	register char *lp;
137 	register c;
138 
139 	lp = cp;
140 	for (;;) {
141 		c = getchar() & 0177;
142 		switch (c) {
143 		case '\n':
144 		case '\r':
145 			*lp++ = '\0';
146 			return;
147 		case '\b':
148 		case '#':
149 			lp--;
150 			if (lp < cp)
151 				lp = cp;
152 			continue;
153 		case '@':
154 		case 'u'&037:
155 			lp = cp;
156 			cnputc('\n');
157 			continue;
158 		default:
159 			*lp++ = c;
160 		}
161 	}
162 }
163