1 /*
2  * Copyright (c) 1992 OMRON Corporation.
3  * Copyright (c) 1982, 1986, 1992, 1993
4  *	The Regents of the University of California.  All rights reserved.
5  *
6  * %sccs.include.redist.c%
7  *
8  * from: hp300/hp300/swapgeneric.c	7.8 (Berkeley) 10/11/92
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 <luna68k/dev/device.h>
20 
21 /*
22  * Generic configuration;  all in one
23  */
24 
25 dev_t	rootdev = NODEV;
26 dev_t	argdev  = NODEV;
27 dev_t	dumpdev = NODEV;
28 
29 int	nswap;
30 
31 struct	swdevt swdevt[] = {
32 	{ -1,	1,	0 },
33 	{ NODEV,0,	0 },
34 };
35 
36 int	dmmin, dmmax, dmtext;
37 
38 extern	struct driver sddriver;
39 extern struct hp_ctlr hp_cinit[];
40 extern struct hp_device hp_dinit[];
41 
42 struct	genericconf {
43 	caddr_t	gc_driver;
44 	char	*gc_name;
45 	dev_t	gc_root;
46 } genericconf[] = {
47 	{ (caddr_t)&sddriver,	"sd",	makedev(4, 0) },
48 	{ 0 },
49 };
50 
51 setconf()
52 {
53 	register struct hp_ctlr *hc;
54 	register struct hp_device *hd;
55 	register struct genericconf *gc;
56 	register char *cp;
57 	int unit, part, swaponroot = 0;
58 
59 	if (rootdev != NODEV)
60 		goto doswap;
61 	unit = 0;
62 	part = 0;
63 	if (boothowto & RB_ASKNAME) {
64 		char name[128];
65 retry:
66 		printf("root device? ");
67 		gets(name);
68 		for (gc = genericconf; gc->gc_driver; gc++)
69 			if (gc->gc_name[0] == name[0] &&
70 			    gc->gc_name[1] == name[1])
71 				goto gotit;
72 		printf("use one of:");
73 		for (gc = genericconf; gc->gc_driver; gc++)
74 			printf(" %s%%d", gc->gc_name);
75 		printf("\n");
76 		goto retry;
77 gotit:
78 		cp = &name[2];
79 		if (*cp < '0' || *cp > '9') {
80 			printf("bad/missing unit number\n");
81 			goto retry;
82 		}
83 		while (*cp >= '0' && *cp <= '9')
84 			unit = 10 * unit + *cp++ - '0';
85 		if (*cp < 'a' || *cp > 'h') {
86 			printf("bad/missing partiiton number\n");
87 			goto retry;
88 		}
89 		part = *cp++ - 'a';
90 /*
91 		if (*cp == '*')
92 			swaponroot++;
93  */
94 		goto found;
95 	}
96 
97 	for (gc = genericconf; gc->gc_driver; gc++) {
98 		for (hd = hp_dinit; hd->hp_driver; hd++) {
99 			if (hd->hp_alive == 0)
100 				continue;
101 			if (hd->hp_unit == 0 && hd->hp_driver ==
102 			    (struct driver *)gc->gc_driver) {
103 				printf("root on %s0\n", hd->hp_driver->d_name);
104 				goto found;
105 			}
106 		}
107 	}
108 	printf("no suitable root\n");
109 	asm("stop #0x2700");
110 found:
111 	gc->gc_root = makedev(major(gc->gc_root), (unit * 8) + part );
112 	rootdev = gc->gc_root;
113 /*
114 	printf("using root device: %s%d%c\n", gc->gc_name, unit, 'a' + part);
115  */
116 doswap:
117 	swdevt[0].sw_dev = argdev = dumpdev =
118 	    makedev(major(rootdev), (minor(rootdev) & ~0x7) + 1);
119 /*
120 	printf("using swap device: %s%d%c\n",
121 	       gc->gc_name, unit, 'a' + (minor(swdevt[0].sw_dev) & 0x7));
122  */
123 	/* swap size and dumplo set during autoconfigure */
124 	if (swaponroot)
125 		rootdev = dumpdev;
126 }
127 
128 gets(cp)
129 	char *cp;
130 {
131 	register char *lp;
132 	register c;
133 
134 	lp = cp;
135 	for (;;) {
136 		cnputc(c = cngetc());
137 		switch (c) {
138 		case '\n':
139 		case '\r':
140 			*lp++ = '\0';
141 			return;
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 		}
163 	}
164 }
165