xref: /openbsd/sys/arch/luna88k/stand/boot/devopen.c (revision 8352e4cb)
1 /*	$OpenBSD: devopen.c,v 1.4 2023/01/10 17:10:57 miod Exp $	*/
2 /*	$NetBSD: devopen.c,v 1.3 2013/01/16 15:46:20 tsutsui Exp $	*/
3 
4 /*
5  * Copyright (c) 1992 OMRON Corporation.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * OMRON Corporation.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the University of
21  *	California, Berkeley and its contributors.
22  * 4. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *	@(#)conf.c	8.1 (Berkeley) 6/10/93
39  */
40 /*
41  * Copyright (c) 1992, 1993
42  *	The Regents of the University of California.  All rights reserved.
43  *
44  * This code is derived from software contributed to Berkeley by
45  * OMRON Corporation.
46  *
47  * Redistribution and use in source and binary forms, with or without
48  * modification, are permitted provided that the following conditions
49  * are met:
50  * 1. Redistributions of source code must retain the above copyright
51  *    notice, this list of conditions and the following disclaimer.
52  * 2. Redistributions in binary form must reproduce the above copyright
53  *    notice, this list of conditions and the following disclaimer in the
54  *    documentation and/or other materials provided with the distribution.
55  * 3. Neither the name of the University nor the names of its contributors
56  *    may be used to endorse or promote products derived from this software
57  *    without specific prior written permission.
58  *
59  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
60  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
62  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
63  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
64  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
65  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
66  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
67  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
68  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
69  * SUCH DAMAGE.
70  *
71  *	@(#)conf.c	8.1 (Berkeley) 6/10/93
72  */
73 
74 #include <sys/reboot.h>
75 #include <lib/libkern/libkern.h>
76 #include <luna88k/stand/boot/samachdep.h>
77 #include <machine/disklabel.h>
78 
79 #define MAXDEVNAME	16
80 
81 static int make_device(const char *, int *, int *, int *, char **);
82 
83 int
devopen(struct open_file * f,const char * fname,char ** file)84 devopen(struct open_file *f, const char *fname, char **file)
85 {
86 	int dev, unit, part;
87 	int error;
88 	struct devsw *dp;
89 	int i;
90 
91 	if (make_device(fname, &dev, &unit, &part, file) != 0)
92 		return ENXIO;
93 
94 #ifdef DEBUG
95 	printf("%s: %s(%d,%d):%s\n", __func__,
96 	    devsw[dev].dv_name, unit, part, *file);
97 #endif
98 	dp = &devsw[dev];
99 	error = (*dp->dv_open)(f, unit, part);
100 	if (error != 0) {
101 #ifdef DEBUG
102 		printf("%s: open %s(%d,%d):%s failed (%s)\n", __func__,
103 		    devsw[dev].dv_name, unit, part, *file, strerror(error));
104 #endif
105 		return error;
106 	}
107 
108 	for (i = 0; i < nfsys_disk; i++)
109 		file_system[i] = file_system_disk[i];
110 	nfsys = nfsys_disk;
111 
112 #ifdef SUPPORT_ETHERNET
113 	if (strcmp(dp->dv_name, "le") == 0) {
114 		/* XXX mixing local fs_ops on netboot could be troublesome */
115 		file_system[0] = file_system_nfs[0];
116 		nfsys = 1;
117 	}
118 #endif
119 
120 	f->f_dev = dp;
121 
122 	/* Save boot device information to pass to the kernel */
123 	bootdev = MAKEBOOTDEV(dev, 0, unit / 10, 6 - unit % 10, part);
124 
125 	return 0;
126 }
127 
128 int
make_device(const char * str,int * devp,int * unitp,int * partp,char ** fname)129 make_device(const char *str, int *devp, int *unitp, int *partp, char **fname)
130 {
131 	const char *cp;
132 	struct devsw *dp;
133 	int major, unit = 0, part = 0;
134 	int i;
135 	char devname[MAXDEVNAME + 1];
136 
137 	/*
138 	 * parse path strings
139 	 */
140 				/* find end of dev type name */
141 	for (cp = str, i = 0; *cp != '\0' && *cp != '(' && i < MAXDEVNAME; i++)
142 			devname[i] = *cp++;
143 	if (*cp != '(') {
144 		return (-1);
145 	}
146 	devname[i] = '\0';
147 				/* compare dev type name */
148 	for (dp = devsw; dp->dv_name; dp++)
149 		if (!strcmp(devname, dp->dv_name))
150 			break;
151 	cp++;
152 	if (dp->dv_name == NULL) {
153 		return (-1);
154 	}
155 	major = dp - devsw;
156 				/* get mixed controller and unit number */
157 	for (; *cp != ',' && *cp != ')'; cp++) {
158 		if (*cp == '\0')
159 			return -1;
160 		if (*cp >= '0' && *cp <= '9')
161 			unit = unit * 10 + *cp - '0';
162 	}
163 	if (unit < 0 || unit >= 20 || (unit % 10) > 7) {
164 #ifdef DEBUG
165 		printf("%s: invalid unit number (%d)\n", __func__, unit);
166 #endif
167 		return (-1);
168 	}
169 				/* get optional partition number */
170 	if (*cp == ',')
171 		cp++;
172 
173 	for (; /* *cp != ',' && */ *cp != ')'; cp++) {
174 		if (*cp == '\0')
175 			return -1;
176 		if (*cp >= '0' && *cp <= '9')
177 			part = part * 10 + *cp - '0';
178 	}
179 	if (part < 0 || part >= MAXPARTITIONS) {
180 #ifdef DEBUG
181 		printf("%s: invalid partition number (%d)\n", __func__, part);
182 #endif
183 		return (-1);
184 	}
185 				/* check out end of dev spec */
186 	*devp  = major;
187 	*unitp = unit;
188 	*partp = part;
189 	cp++;
190 	if (*cp == ':')
191 		cp++;
192 	if (*cp == '\0')
193 		*fname = "bsd";
194 	else
195 		*fname = (char *)cp;	/* XXX */
196 #ifdef DEBUG
197 	printf("%s(%s): major = %d, unit = %d, part = %d, fname = %s\n",
198 	    __func__, str, major, unit, part, *fname);
199 #endif
200 
201 	return 0;
202 }
203