xref: /original-bsd/sys/i386/i386/swapgeneric.c (revision cf2124ff)
1 /*-
2  * Copyright (c) 1990 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * William Jolitz.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)swapgeneric.c	5.6 (Berkeley) 10/11/92
11  */
12 
13 #include <machine/pte.h>
14 
15 #include <sys/param.h>
16 #include <sys/conf.h>
17 #include <sys/buf.h>
18 #include <sys/vm.h>
19 #include <sys/systm.h>
20 #include <sys/reboot.h>
21 
22 /*
23  * Generic configuration;  all in one
24  */
25 dev_t	rootdev = makedev(0,0);
26 dev_t	dumpdev = makedev(0,1);
27 int	nswap;
28 struct	swdevt swdevt[] = {
29 	{ 1,	0,	0 },
30 	{ 0,	1,	0 },
31 };
32 long	dumplo;
33 int	dmmin, dmmax, dmtext;
34 
35 extern	struct driver wddriver;
36 
37 struct	genericconf {
38 	caddr_t	gc_driver;
39 	char	*gc_name;
40 	dev_t	gc_root;
41 } genericconf[] = {
42 	{ (caddr_t)&wddriver,	"wd",	makedev(0, 0),	},
43 	{ 0 },
44 };
45 
46 setconf()
47 {
48 #ifdef notdef
49 	register struct genericconf *gc;
50 	int unit, swaponroot = 0;
51 
52 	if (rootdev != NODEV)
53 		goto doswap;
54 	if (boothowto & RB_ASKNAME) {
55 		char name[128];
56 retry:
57 		printf("root device? ");
58 		gets(name);
59 		for (gc = genericconf; gc->gc_driver; gc++)
60 			if (gc->gc_name[0] == name[0] &&
61 			    gc->gc_name[1] == name[1])
62 				goto gotit;
63 		goto bad;
64 gotit:
65 		if (name[3] == '*') {
66 			name[3] = name[4];
67 			swaponroot++;
68 		}
69 		if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) {
70 			unit = name[2] - '0';
71 			goto found;
72 		}
73 		printf("bad/missing unit number\n");
74 bad:
75 		printf("use dk%%d\n");
76 		goto retry;
77 	}
78 	unit = 0;
79 	for (gc = genericconf; gc->gc_driver; gc++) {
80 		for (ui = vbdinit; ui->ui_driver; ui++) {
81 			if (ui->ui_alive == 0)
82 				continue;
83 			if (ui->ui_unit == 0 && ui->ui_driver ==
84 			    (struct vba_driver *)gc->gc_driver) {
85 				printf("root on %s0\n",
86 				    ui->ui_driver->ud_dname);
87 				goto found;
88 			}
89 		}
90 	}
91 	printf("no suitable root\n");
92 	asm("halt");
93 found:
94 	gc->gc_root = makedev(major(gc->gc_root), unit*8);
95 	rootdev = gc->gc_root;
96 doswap:
97 	swdevt[0].sw_dev = argdev = dumpdev =
98 	    makedev(major(rootdev), minor(rootdev)+1);
99 	/* swap size and dumplo set during autoconfigure */
100 	if (swaponroot)
101 		rootdev = dumpdev;
102 #endif
103 }
104 
105 gets(cp)
106 	char *cp;
107 {
108 	register char *lp;
109 	register c;
110 
111 	lp = cp;
112 	for (;;) {
113 		printf("%c", c = cngetc()&0177);
114 		switch (c) {
115 		case '\n':
116 		case '\r':
117 			*lp++ = '\0';
118 			return;
119 		case '\b':
120 		case '\177':
121 			if (lp > cp) {
122 				printf(" \b");
123 				lp--;
124 			}
125 			continue;
126 		case '#':
127 			lp--;
128 			if (lp < cp)
129 				lp = cp;
130 			continue;
131 		case '@':
132 		case 'u'&037:
133 			lp = cp;
134 			printf("%c", '\n');
135 			continue;
136 		default:
137 			*lp++ = c;
138 		}
139 	}
140 }
141