xref: /original-bsd/sys/pmax/pmax/swapgeneric.c (revision b5ed8b48)
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.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)swapgeneric.c	7.1 (Berkeley) 01/07/92
11  */
12 
13 #include "param.h"
14 #include "conf.h"
15 #include "buf.h"
16 #include "systm.h"
17 #include "reboot.h"
18 
19 #include "../dev/device.h"
20 
21 /*
22  * Generic configuration;  all in one
23  */
24 dev_t	rootdev = NODEV;
25 dev_t	argdev = NODEV;
26 dev_t	dumpdev = NODEV;
27 int	nswap;
28 struct	swdevt swdevt[] = {
29 	{ -1,	1,	0 },
30 	{ 0,	0,	0 },
31 };
32 int	dmmin, dmmax, dmtext;
33 
34 extern	struct driver rzdriver;
35 
36 struct	genericconf {
37 	caddr_t	gc_driver;
38 	char	*gc_name;
39 	dev_t	gc_root;
40 } genericconf[] = {
41 	{ (caddr_t)&rzdriver,	"rz",	makedev(0, 0),	},
42 	{ 0 },
43 };
44 
45 setconf()
46 {
47 	register struct scsi_device *dp;
48 	register struct genericconf *gc;
49 	register char *cp, *gp;
50 	int unit, swaponroot = 0;
51 
52 	if (rootdev != NODEV)
53 		goto doswap;
54 	unit = 0;
55 	if (boothowto & RB_ASKNAME) {
56 		char name[128];
57 retry:
58 		printf("root device? ");
59 		gets(name);
60 		for (gc = genericconf; gc->gc_driver; gc++)
61 		    for (cp = name, gp = gc->gc_name; *cp == *gp; cp++)
62 			if (*++gp == 0)
63 				goto gotit;
64 		printf("use one of:");
65 		for (gc = genericconf; gc->gc_driver; gc++)
66 			printf(" %s%%d", gc->gc_name);
67 		printf("\n");
68 		goto retry;
69 gotit:
70 		if (*++cp < '0' || *cp > '9') {
71 			printf("bad/missing unit number\n");
72 			goto retry;
73 		}
74 		while (*cp >= '0' && *cp <= '9')
75 			unit = 10 * unit + *cp++ - '0';
76 		if (*cp == '*')
77 			swaponroot++;
78 		goto found;
79 	}
80 	for (gc = genericconf; gc->gc_driver; gc++) {
81 		for (dp = scsi_dinit; dp->sd_driver; dp++) {
82 			if (dp->sd_alive == 0)
83 				continue;
84 			if (dp->sd_unit == unit &&
85 			    dp->sd_driver == (struct driver *)gc->gc_driver) {
86 				printf("root on %s%d%c\n",
87 					dp->sd_driver->d_name, unit,
88 					"ab"[swaponroot]);
89 				goto found;
90 			}
91 		}
92 	}
93 	printf("no suitable root\n");
94 	goto retry;
95 found:
96 	gc->gc_root = makedev(major(gc->gc_root), unit*8);
97 	rootdev = gc->gc_root;
98 doswap:
99 	swdevt[0].sw_dev = argdev = dumpdev =
100 	    makedev(major(rootdev), minor(rootdev)+1);
101 	/* swap size and dumplo set during autoconfigure */
102 	if (swaponroot)
103 		rootdev = dumpdev;
104 }
105 
106 gets(cp)
107 	char *cp;
108 {
109 	register char *lp;
110 	register c;
111 	int s;
112 
113 	lp = cp;
114 	s = spltty();
115 	for (;;) {
116 		cnputc(c = cngetc());
117 		switch (c) {
118 		case '\r':
119 			cnputc('\n');
120 			*lp++ = '\0';
121 			break;
122 		case '\n':
123 			cnputc('\r');
124 			*lp++ = '\0';
125 			break;
126 		case '\b':
127 		case '\177':
128 			if (lp > cp) {
129 				lp--;
130 				cnputc(' ');
131 				cnputc('\b');
132 			}
133 			continue;
134 		case '#':
135 			lp--;
136 			if (lp < cp)
137 				lp = cp;
138 			continue;
139 		case '@':
140 		case 'u'&037:
141 			lp = cp;
142 			cnputc('\n');
143 			continue;
144 		default:
145 			*lp++ = c;
146 			continue;
147 		}
148 		break;
149 	}
150 	splx(s);
151 }
152