1 /* $NetBSD: devopen.c,v 1.8 2010/12/24 20:40:42 jakllsch Exp $ */
4 * Copyright (c) 2005 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
33 * Copyright (c) 1996, 1997
34 * Matthias Drochner. All rights reserved.
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
45 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
46 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
47 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
48 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
49 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
50 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
51 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
52 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
53 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
54 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
58 #include <sys/types.h>
60 #include <lib/libsa/stand.h>
61 #include <lib/libkern/libkern.h>
73 static int dev2bios(char *, int, int *);
76 dev2bios(char *devname
, int unit
, int *biosdev
)
79 if (strcmp(devname
, "hd") == 0)
80 *biosdev
= 0x80 + unit
;
81 else if (strcmp(devname
, "fd") == 0)
82 *biosdev
= 0x00 + unit
;
83 else if (strcmp(devname
, "cd") == 0)
84 *biosdev
= boot_biosdev
;
92 bios2dev(int biosdev
, daddr_t sector
, char **devname
, int *unit
, int *partition
)
96 *unit
= biosdev
& 0x7f;
100 * There seems to be no standard way of numbering BIOS
101 * CD-ROM drives. The following method is a little tricky
104 if (biosdev
>= 0x80 + get_harddrives()) {
106 *unit
= 0; /* override default */
112 *partition
= biosdisk_findpartition(biosdev
, sector
);
116 struct btinfo_bootpath bibp
;
117 extern bool kernel_loaded
;
121 * Open the BIOS disk device
124 devopen(struct open_file
*f
, const char *fname
, char **file
)
126 char *fsname
, *devname
;
131 if ((error
= parsebootfile(fname
, &fsname
, &devname
,
132 &unit
, &partition
, (const char **) file
))
133 || (error
= dev2bios(devname
, unit
, &biosdev
)))
136 f
->f_dev
= &devsw
[0]; /* must be biosdisk */
139 if (!kernel_loaded
) {
140 strncpy(bibp
.bootpath
, *file
, sizeof(bibp
.bootpath
));
141 BI_ADD(&bibp
, BTINFO_BOOTPATH
, sizeof(bibp
));
145 return biosdisk_open(f
, biosdev
, partition
);