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