xref: /original-bsd/sys/vax/vax/swapgeneric.c (revision 9c5e301d)
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.10 (Berkeley) 12/16/90
7  */
8 
9 #include "mba.h"
10 
11 #include "../include/pte.h"
12 
13 #include "sys/param.h"
14 #include "sys/conf.h"
15 #include "sys/buf.h"
16 #include "sys/vm.h"
17 #include "sys/systm.h"
18 #include "sys/reboot.h"
19 
20 #include "cons.h"
21 #include "../include/mtpr.h"
22 #include "../mba/mbareg.h"
23 #include "../mba/mbavar.h"
24 #include "../uba/ubareg.h"
25 #include "../uba/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 extern	struct uba_driver kdbdriver;
48 
49 struct	genericconf {
50 	caddr_t	gc_driver;
51 	char	*gc_name;
52 	dev_t	gc_root;
53 } genericconf[] = {
54 	{ (caddr_t)&hpdriver,	"hp",	makedev(0, 0),	},
55 	{ (caddr_t)&scdriver,	"up",	makedev(2, 0),	},
56 	{ (caddr_t)&udadriver,	"ra",	makedev(9, 0),	},
57 	{ (caddr_t)&idcdriver,	"rb",	makedev(11, 0),	},
58 	{ (caddr_t)&hldriver,	"rl",	makedev(14, 0),	},
59 	{ (caddr_t)&hkdriver,	"hk",	makedev(3, 0),	},
60 	{ (caddr_t)&hkdriver,	"rk",	makedev(3, 0),	},
61 	{ (caddr_t)&kdbdriver,	"kra",	makedev(16, 0), },
62 	{ 0 },
63 };
64 
65 setconf()
66 {
67 #if NMBA > 0
68 	register struct mba_device *mi;
69 #endif
70 	register struct uba_device *ui;
71 	register struct genericconf *gc;
72 	register char *cp, *gp;
73 	int unit, swaponroot = 0;
74 
75 	if (rootdev != NODEV)
76 		goto doswap;
77 	unit = 0;
78 	if (boothowto & RB_ASKNAME) {
79 		char name[128];
80 retry:
81 		printf("root device? ");
82 		gets(name);
83 		for (gc = genericconf; gc->gc_driver; gc++)
84 		    for (cp = name, gp = gc->gc_name; *cp == *gp; cp++)
85 			if (*++gp == 0)
86 				goto gotit;
87 		printf(
88 		  "use hp%%d, up%%d, ra%%d, rb%%d, rl%%d, hk%%d or kra%%d\n");
89 		goto retry;
90 gotit:
91 		if (*++cp < '0' || *cp > '9') {
92 			printf("bad/missing unit number\n");
93 			goto retry;
94 		}
95 		while (*cp >= '0' && *cp <= '9')
96 			unit = 10 * unit + *cp++ - '0';
97 		if (*cp == '*')
98 			swaponroot++;
99 		goto found;
100 	}
101 	for (gc = genericconf; gc->gc_driver; gc++) {
102 #if NMBA > 0
103 		for (mi = mbdinit; mi->mi_driver; mi++) {
104 			if (mi->mi_alive == 0)
105 				continue;
106 			if (mi->mi_unit == unit && mi->mi_driver ==
107 			    (struct mba_driver *)gc->gc_driver) {
108 				printf("root on %s%d\n",
109 				    mi->mi_driver->md_dname, unit);
110 				goto found;
111 			}
112 		}
113 #endif
114 		for (ui = ubdinit; ui->ui_driver; ui++) {
115 			if (ui->ui_alive == 0)
116 				continue;
117 			if (ui->ui_unit == unit && ui->ui_driver ==
118 			    (struct uba_driver *)gc->gc_driver) {
119 				printf("root on %s%d\n",
120 				    ui->ui_driver->ud_dname, unit);
121 				goto found;
122 			}
123 		}
124 	}
125 	printf("no suitable root\n");
126 	asm("halt");
127 found:
128 	gc->gc_root = makedev(major(gc->gc_root), unit*8);
129 	rootdev = gc->gc_root;
130 doswap:
131 	swdevt[0].sw_dev = argdev = dumpdev =
132 	    makedev(major(rootdev), minor(rootdev)+1);
133 	/* swap size and dumplo set during autoconfigure */
134 	if (swaponroot)
135 		rootdev = dumpdev;
136 }
137 
138 gets(cp)
139 	char *cp;
140 {
141 	register char *lp;
142 	register c;
143 
144 	lp = cp;
145 	for (;;) {
146 		cnputc(c = cngetc());
147 		switch (c) {
148 		case '\n':
149 		case '\r':
150 			*lp++ = '\0';
151 			return;
152 		case '\b':
153 		case '#':
154 		case '\177':
155 			lp--;
156 			if (lp < cp)
157 				lp = cp;
158 			continue;
159 		case '@':
160 		case 'u'&037:
161 			lp = cp;
162 			cnputc('\n');
163 			continue;
164 		default:
165 			*lp++ = c;
166 		}
167 	}
168 }
169