1 /*
2  * Copyright (c) 1992 Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Ralph Campbell, and Kazumasa Utashiro of Software Research
7  * Associates, Inc.
8  *
9  * %sccs.include.redist.c%
10  *
11  *	@(#)swapgeneric.c	7.2 (Berkeley) 12/17/92
12  */
13 
14 #include <machine/fix_machine_type.h>
15 
16 #include <sysparam.h>
17 #include <sysconf.h>
18 #include <sysbuf.h>
19 #include <syssystm.h>
20 #include <sysreboot.h>
21 
22 #ifdef CPU_DOUBLE
23 #include <news3400/iop/iopvar.h>
24 #else /* CPU_DOUBLE */
25 #include <news3400/hbdev/hbvar.h>
26 # define	iop	hb
27 
28 # define	idinit	hdinit
29 
30 # define	im_driver	hm_driver
31 # define	im_ctlr		hm_ctlr
32 # define	im_alive	hm_alive
33 # define	im_addr		hm_addr
34 # define	im_intr		hm_intr
35 # define	im_scnum	hm_scnum
36 # define	im_hd		hm_hd
37 # define	im_hbinfo	hm_hbinfo
38 # define	im_tab		hm_tab
39 
40 # define	ii_driver	hi_driver
41 # define	ii_unit		hi_unit
42 # define	ii_ctlr		hi_ctlr
43 # define	ii_slave	hi_slave
44 # define	ii_addr		hi_addr
45 # define	ii_intr		hi_intr
46 # define	ii_dk		hi_dk
47 # define	ii_flags	hi_flags
48 # define	ii_alive	hi_alive
49 # define	ii_type		hi_type
50 # define	ii_forw		hi_forw
51 # define	ii_mi		hi_mi
52 # define	ii_hd		hi_hd
53 
54 # define	id_probe	hd_probe
55 # define	id_slave	hd_slave
56 # define	id_attach	hd_attach
57 # define	id_dgo		hd_dgo
58 # define	id_dname	hd_dname
59 # define	id_dinfo	hd_dinfo
60 # define	id_mname	hd_mname
61 # define	id_minfo	hd_minfo
62 #endif /* CPU_DOUBLE */
63 
64 # include "sd.h"
65 # include "hd.h"
66 # include "fd.h"
67 # include "od.h"
68 
69 /*
70  * Generic configuration;  all in one
71  */
72 dev_t	rootdev = NODEV;
73 dev_t	argdev = NODEV;
74 dev_t	dumpdev = NODEV;
75 int	nswap;
76 struct	swdevt swdevt[] = {
77 	{ -1,	1,	0 },
78 	{ 0,	0,	0 },
79 };
80 int	dmmin, dmmax, dmtext;
81 
82 # if NSDC > 0
83 extern	struct iop/**/_driver sdcdriver;
84 # endif
85 # if NHC > 0
86 extern	struct iop/**/_driver hcdriver;
87 # endif
88 # if NFC > 0
89 extern	struct iop/**/_driver fcdriver;
90 # endif
91 # if NOC > 0
92 extern	struct iop/**/_driver ocdriver;
93 # endif
94 
95 struct	genericconf {
96 	caddr_t	gc_driver;
97 	char	*gc_name;
98 	dev_t	gc_root;
99 } genericconf[] = {
100 # if NSDC > 0
101 	{ (caddr_t)&sdcdriver,	"sd",	makedev(0, 0),	},
102 # endif
103 # if NHC > 0
104 	{ (caddr_t)&hcdriver,	"hd",	makedev(0, 0),	},
105 # endif
106 # if NFC > 0
107 	{ (caddr_t)&fcdriver,	"fh",	makedev(1, 0),	},
108 	{ (caddr_t)&fcdriver,	"fd",	makedev(1, 1),	},
109 # endif
110 # if NOC > 0
111 	{ (caddr_t)&ocdriver,	"od",	makedev(10, 0),	},
112 # endif
113 	{ 0 },
114 };
115 
116 setconf()
117 {
118 	register struct scsi_device *dp;
119 	register struct genericconf *gc;
120 	register char *cp, *gp;
121 	int unit, swaponroot = 0;
122 
123 	if (rootdev != NODEV)
124 		goto doswap;
125 	unit = 0;
126 	if (boothowto & RB_ASKNAME) {
127 		char name[128];
128 retry:
129 		printf("root device? ");
130 		gets(name);
131 		for (gc = genericconf; gc->gc_driver; gc++)
132 		    for (cp = name, gp = gc->gc_name; *cp == *gp; cp++)
133 			if (*++gp == 0)
134 				goto gotit;
135 		printf("use one of:");
136 		for (gc = genericconf; gc->gc_driver; gc++)
137 			printf(" %s%%d", gc->gc_name);
138 		printf("\n");
139 		goto retry;
140 gotit:
141 		if (*++cp < '0' || *cp > '9') {
142 			printf("bad/missing unit number\n");
143 			goto retry;
144 		}
145 		while (*cp >= '0' && *cp <= '9')
146 			unit = 10 * unit + *cp++ - '0';
147 		if (*cp == '*')
148 			swaponroot++;
149 		goto found;
150 	}
151 	for (gc = genericconf; gc->gc_driver; gc++) {
152 		for (dp = scsi_dinit; dp->sd_driver; dp++) {
153 			if (dp->sd_alive == 0)
154 				continue;
155 			if (dp->sd_unit == unit &&
156 			    dp->sd_driver == (struct driver *)gc->gc_driver) {
157 				printf("root on %s%d%c\n",
158 					dp->sd_driver->d_name, unit,
159 					"ab"[swaponroot]);
160 				goto found;
161 			}
162 		}
163 	}
164 	printf("no suitable root\n");
165 	goto retry;
166 found:
167 	gc->gc_root = makedev(major(gc->gc_root), unit*8);
168 	rootdev = gc->gc_root;
169 doswap:
170 	swdevt[0].sw_dev = argdev = dumpdev =
171 	    makedev(major(rootdev), minor(rootdev)+1);
172 	/* swap size and dumplo set during autoconfigure */
173 	if (swaponroot)
174 		rootdev = dumpdev;
175 }
176 
177 gets(cp)
178 	char *cp;
179 {
180 	register char *lp;
181 	register c;
182 	int s;
183 
184 	lp = cp;
185 	s = spltty();
186 	for (;;) {
187 		cnputc(c = cngetc());
188 		switch (c) {
189 		case '\r':
190 			cnputc('\n');
191 			*lp++ = '\0';
192 			break;
193 		case '\n':
194 			cnputc('\r');
195 			*lp++ = '\0';
196 			break;
197 		case '\b':
198 		case '\177':
199 			if (lp > cp) {
200 				lp--;
201 				cnputc(' ');
202 				cnputc('\b');
203 			}
204 			continue;
205 		case '#':
206 			lp--;
207 			if (lp < cp)
208 				lp = cp;
209 			continue;
210 		case '@':
211 		case 'u'&037:
212 			lp = cp;
213 			cnputc('\n');
214 			continue;
215 		default:
216 			*lp++ = c;
217 			continue;
218 		}
219 		break;
220 	}
221 	splx(s);
222 }
223