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