xref: /original-bsd/sys/pmax/pmax/swapgeneric.c (revision 3705696b)
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.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)swapgeneric.c	8.1 (Berkeley) 06/16/93
11  */
12 
13 #include <sys/param.h>
14 #include <sys/conf.h>
15 #include <sys/buf.h>
16 #include <sys/systm.h>
17 #include <sys/reboot.h>
18 
19 #include <pmax/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 	{ NODEV,	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 	char *root_swap;
52 
53 	/*
54 	 * If we are running on the in memory, mini-root; then we just need
55 	 * to set the swap device.
56 	 */
57 	if (boothowto & RB_MINIROOT)
58 		root_swap = "swap";
59 	else {
60 		if (rootdev != NODEV) {
61 			swdevt[0].sw_dev = argdev = dumpdev =
62 				makedev(major(rootdev), minor(rootdev)+1);
63 			return;
64 		}
65 		root_swap = "root";
66 	}
67 	unit = 0;
68 	if (boothowto & RB_ASKNAME) {
69 		char name[128];
70 retry:
71 		printf("%s device? ", root_swap);
72 		gets(name);
73 		for (gc = genericconf; gc->gc_driver; gc++)
74 		    for (cp = name, gp = gc->gc_name; *cp == *gp; cp++)
75 			if (*++gp == 0)
76 				goto gotit;
77 		printf("use one of:");
78 		for (gc = genericconf; gc->gc_driver; gc++)
79 			printf(" %s%%d", gc->gc_name);
80 		printf("\n");
81 		goto retry;
82 gotit:
83 		if (*++cp < '0' || *cp > '9') {
84 			printf("bad/missing unit number\n");
85 			goto retry;
86 		}
87 		while (*cp >= '0' && *cp <= '9')
88 			unit = 10 * unit + *cp++ - '0';
89 		if (*cp == '*')
90 			swaponroot++;
91 		goto found;
92 	}
93 	for (gc = genericconf; gc->gc_driver; gc++) {
94 		for (dp = scsi_dinit; dp->sd_driver; dp++) {
95 			if (dp->sd_alive == 0)
96 				continue;
97 			if (dp->sd_unit == unit &&
98 			    dp->sd_driver == (struct driver *)gc->gc_driver) {
99 				printf("root on %s%d%c\n",
100 					dp->sd_driver->d_name, unit,
101 					"ab"[swaponroot]);
102 				goto found;
103 			}
104 		}
105 	}
106 	printf("no suitable %s\n", root_swap);
107 	goto retry;
108 found:
109 	if (boothowto & RB_MINIROOT) {
110 		swdevt[0].sw_dev = argdev = dumpdev =
111 			makedev(major(gc->gc_root), unit*8+1);
112 	} else {
113 		rootdev = makedev(major(gc->gc_root), unit*8);
114 		swdevt[0].sw_dev = argdev = dumpdev =
115 			makedev(major(rootdev), minor(rootdev)+1);
116 		/* swap size and dumplo set during autoconfigure */
117 		if (swaponroot)
118 			rootdev = dumpdev;
119 	}
120 }
121 
122 gets(cp)
123 	char *cp;
124 {
125 	register char *lp;
126 	register c;
127 	int s;
128 
129 	lp = cp;
130 	s = spltty();
131 	for (;;) {
132 		cnputc(c = cngetc());
133 		switch (c) {
134 		case '\r':
135 			cnputc('\n');
136 			*lp++ = '\0';
137 			break;
138 		case '\n':
139 			cnputc('\r');
140 			*lp++ = '\0';
141 			break;
142 		case '\b':
143 		case '\177':
144 			if (lp > cp) {
145 				lp--;
146 				cnputc(' ');
147 				cnputc('\b');
148 			}
149 			continue;
150 		case '#':
151 			lp--;
152 			if (lp < cp)
153 				lp = cp;
154 			continue;
155 		case '@':
156 		case 'u'&037:
157 			lp = cp;
158 			cnputc('\n');
159 			continue;
160 		default:
161 			*lp++ = c;
162 			continue;
163 		}
164 		break;
165 	}
166 	splx(s);
167 }
168