xref: /original-bsd/sys/vax/vax/swapgeneric.c (revision f0fd5f8a)
1 /*	swapgeneric.c	4.5	82/12/17	*/
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 {
28 	-1,	1,
29 	0,	0,
30 };
31 long	dumplo;
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 udadriver;
38 
39 struct	genericconf {
40 	caddr_t	gc_driver;
41 	char	*gc_name;
42 	dev_t	gc_root;
43 	long	gc_nswap;
44 	long	gc_dumplo;
45 } genericconf[] = {
46    (caddr_t)&hpdriver,	"hp", makedev(0, 0), 33440, 33440 - 10*2048,
47    (caddr_t)&scdriver,	"up", makedev(2, 0), 33440, 33440 - 10*2048,
48    (caddr_t)&udadriver,	"ra", makedev(9, 0), 33440, 33440 - 10*2048,
49    (caddr_t)&idcdriver, "rb", makedev(11, 0),33440, 33440 - 10*2048,
50    (caddr_t)&idcdriver, "rl", makedev(11, 0), 4480, 0,
51    (caddr_t)&hkdriver,	"hk", makedev(3, 0), 10032, 10032 - 2*(2048+1024),
52    0,
53 };
54 
55 setconf()
56 {
57 	register struct mba_device *mi;
58 	register struct uba_device *ui;
59 	register struct genericconf *gc;
60 	int unit, swaponroot = 0;
61 
62 	if (boothowto & RB_ASKNAME) {
63 		char name[128];
64 retry:
65 		printf("root device? ");
66 		gets(name);
67 		for (gc = genericconf; gc->gc_driver; gc++)
68 			if (gc->gc_name[0] == name[0] &&
69 			    gc->gc_name[1] == name[1])
70 				goto gotit;
71 		goto bad;
72 gotit:
73 		if (name[3] == '*') {
74 			name[3] = name[4];
75 			swaponroot++;
76 		}
77 		if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) {
78 			unit = name[2] - '0';
79 			goto found;
80 		}
81 		printf("bad/missing unit number\n");
82 bad:
83 		printf("use hp%%d, up%%d, ra%%d, rb%%d, rl%%d or hk%%d\n");
84 		goto retry;
85 	}
86 	unit = 0;
87 	for (gc = genericconf; gc->gc_driver; gc++) {
88 		for (mi = mbdinit; mi->mi_driver; mi++) {
89 			if (mi->mi_alive == 0)
90 				continue;
91 			if (mi->mi_unit == 0 && mi->mi_driver ==
92 			    (struct mba_driver *)gc->gc_driver) {
93 				printf("root on %s0\n", 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 	nswap = gc->gc_nswap;
116 	dumplo = gc->gc_dumplo;
117 	if (swaponroot)
118 		rootdev = dumpdev;
119 }
120 
121 getchar()
122 {
123 	register c;
124 
125 	while((mfpr(RXCS)&RXCS_DONE) == 0)
126 		;
127 	c = mfpr(RXDB)&0177;
128 	if (c=='\r')
129 		c = '\n';
130 	cnputc(c);
131 	return(c);
132 }
133 
134 gets(cp)
135 	char *cp;
136 {
137 	register char *lp;
138 	register c;
139 
140 	lp = cp;
141 	for (;;) {
142 		c = getchar() & 0177;
143 		switch(c) {
144 		case '\n':
145 		case '\r':
146 			*lp++ = '\0';
147 			return;
148 		case '\b':
149 		case '#':
150 			lp--;
151 			if (lp < cp)
152 				lp = cp;
153 			continue;
154 		case '@':
155 		case 'u'&037:
156 			lp = cp;
157 			cnputc('\n');
158 			continue;
159 		default:
160 			*lp++ = c;
161 		}
162 	}
163 }
164