xref: /original-bsd/sys/hp300/hp300/swapgeneric.c (revision 3705696b)
1 /*
2  * Copyright (c) 1982, 1986, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)swapgeneric.c	8.1 (Berkeley) 06/16/93
8  */
9 
10 #include <sys/param.h>
11 #include <sys/conf.h>
12 #include <sys/buf.h>
13 #include <sys/systm.h>
14 #include <sys/reboot.h>
15 
16 #include <hp/dev/device.h>
17 
18 /*
19  * Generic configuration;  all in one
20  */
21 dev_t	rootdev = NODEV;
22 dev_t	argdev = NODEV;
23 dev_t	dumpdev = NODEV;
24 int	nswap;
25 struct	swdevt swdevt[] = {
26 	{ -1,	1,	0 },
27 	{ NODEV,	0,	0 },
28 };
29 int	dmmin, dmmax, dmtext;
30 
31 extern	struct driver rddriver;
32 extern	struct driver sddriver;
33 extern struct hp_ctlr hp_cinit[];
34 extern struct hp_device hp_dinit[];
35 
36 struct	genericconf {
37 	caddr_t	gc_driver;
38 	char	*gc_name;
39 	dev_t	gc_root;
40 } genericconf[] = {
41 	{ (caddr_t)&rddriver,	"rd",	makedev(2, 0),	},
42 	{ (caddr_t)&sddriver,	"sd",	makedev(4, 0),	},
43 	{ 0 },
44 };
45 
46 setconf()
47 {
48 	register struct hp_ctlr *hc;
49 	register struct hp_device *hd;
50 	register struct genericconf *gc;
51 	register char *cp;
52 	int unit, swaponroot = 0;
53 
54 	if (rootdev != NODEV)
55 		goto doswap;
56 	unit = 0;
57 	if (boothowto & RB_ASKNAME) {
58 		char name[128];
59 retry:
60 		printf("root device? ");
61 		gets(name);
62 		for (gc = genericconf; gc->gc_driver; gc++)
63 			if (gc->gc_name[0] == name[0] &&
64 			    gc->gc_name[1] == name[1])
65 				goto gotit;
66 		printf("use one of:");
67 		for (gc = genericconf; gc->gc_driver; gc++)
68 			printf(" %s%%d", gc->gc_name);
69 		printf("\n");
70 		goto retry;
71 gotit:
72 		cp = &name[1];
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 		goto found;
82 	}
83 	for (gc = genericconf; gc->gc_driver; gc++) {
84 		for (hd = hp_dinit; hd->hp_driver; hd++) {
85 			if (hd->hp_alive == 0)
86 				continue;
87 			if (hd->hp_unit == 0 && hd->hp_driver ==
88 			    (struct driver *)gc->gc_driver) {
89 				printf("root on %s0\n", hd->hp_driver->d_name);
90 				goto found;
91 			}
92 		}
93 	}
94 	printf("no suitable root\n");
95 	asm("stop #0x2700");
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 		cnputc(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 				lp--;
125 				cnputc(' ');
126 				cnputc('\b');
127 			}
128 			continue;
129 		case '#':
130 			lp--;
131 			if (lp < cp)
132 				lp = cp;
133 			continue;
134 		case '@':
135 		case 'u'&037:
136 			lp = cp;
137 			cnputc('\n');
138 			continue;
139 		default:
140 			*lp++ = c;
141 		}
142 	}
143 }
144