xref: /original-bsd/sys/hp300/hp300/swapgeneric.c (revision dd262573)
1 /*
2  * Copyright (c) 1982, 1986 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)swapgeneric.c	7.3 (Berkeley) 12/16/90
8  */
9 
10 #include "../include/pte.h"
11 
12 #include "sys/param.h"
13 #include "sys/conf.h"
14 #include "sys/buf.h"
15 #include "sys/systm.h"
16 #include "sys/reboot.h"
17 
18 #include "../dev/device.h"
19 
20 /*
21  * Generic configuration;  all in one
22  */
23 dev_t	rootdev = NODEV;
24 dev_t	argdev = NODEV;
25 dev_t	dumpdev = NODEV;
26 int	nswap;
27 struct	swdevt swdevt[] = {
28 	{ -1,	1,	0 },
29 	{ 0,	0,	0 },
30 };
31 long	dumplo;
32 int	dmmin, dmmax, dmtext;
33 
34 extern	struct driver rddriver;
35 extern	struct driver sddriver;
36 extern struct hp_ctlr hp_cinit[];
37 extern struct hp_device hp_dinit[];
38 
39 struct	genericconf {
40 	caddr_t	gc_driver;
41 	char	*gc_name;
42 	dev_t	gc_root;
43 } genericconf[] = {
44 	{ (caddr_t)&rddriver,	"rd",	makedev(2, 0),	},
45 	{ (caddr_t)&sddriver,	"sd",	makedev(4, 0),	},
46 	{ 0 },
47 };
48 
49 setconf()
50 {
51 	register struct hp_ctlr *hc;
52 	register struct hp_device *hd;
53 	register struct genericconf *gc;
54 	register char *cp;
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 			if (gc->gc_name[0] == name[0] &&
67 			    gc->gc_name[1] == name[1])
68 				goto gotit;
69 		printf("use one of:");
70 		for (gc = genericconf; gc->gc_driver; gc++)
71 			printf(" %s%%d", gc->gc_name);
72 		printf("\n");
73 		goto retry;
74 gotit:
75 		if (*++cp < '0' || *cp > '9') {
76 			printf("bad/missing unit number\n");
77 			goto retry;
78 		}
79 		while (*cp >= '0' && *cp <= '9')
80 			unit = 10 * unit + *cp++ - '0';
81 		if (*cp == '*')
82 			swaponroot++;
83 		goto found;
84 	}
85 	for (gc = genericconf; gc->gc_driver; gc++) {
86 		for (hd = hp_dinit; hd->hp_driver; hd++) {
87 			if (hd->hp_alive == 0)
88 				continue;
89 			if (hd->hp_unit == 0 && hd->hp_driver ==
90 			    (struct driver *)gc->gc_driver) {
91 				printf("root on %s0\n", hd->hp_driver->d_name);
92 				goto found;
93 			}
94 		}
95 	}
96 	printf("no suitable root\n");
97 	asm("stop #0x2700");
98 found:
99 	gc->gc_root = makedev(major(gc->gc_root), unit*8);
100 	rootdev = gc->gc_root;
101 doswap:
102 	swdevt[0].sw_dev = argdev = dumpdev =
103 	    makedev(major(rootdev), minor(rootdev)+1);
104 	/* swap size and dumplo set during autoconfigure */
105 	if (swaponroot)
106 		rootdev = dumpdev;
107 }
108 
109 gets(cp)
110 	char *cp;
111 {
112 	register char *lp;
113 	register c;
114 
115 	lp = cp;
116 	for (;;) {
117 		cnputc(c = cngetc());
118 		switch (c) {
119 		case '\n':
120 		case '\r':
121 			*lp++ = '\0';
122 			return;
123 		case '\b':
124 		case '\177':
125 			if (lp > cp) {
126 				lp--;
127 				cnputc(' ');
128 				cnputc('\b');
129 			}
130 			continue;
131 		case '#':
132 			lp--;
133 			if (lp < cp)
134 				lp = cp;
135 			continue;
136 		case '@':
137 		case 'u'&037:
138 			lp = cp;
139 			cnputc('\n');
140 			continue;
141 		default:
142 			*lp++ = c;
143 		}
144 	}
145 }
146