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