xref: /minix3/sys/arch/i386/stand/boot/devopen.c (revision 58a2b0008e28f606a7f7f5faaeaba4faac57a1ea)
1 /*	$NetBSD: devopen.c,v 1.8 2010/12/24 20:40:42 jakllsch Exp $	 */
2 
3 /*-
4  * Copyright (c) 2005 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Bang Jun-Young.
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  *
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.
30  */
31 
32 /*
33  * Copyright (c) 1996, 1997
34  *	Matthias Drochner.  All rights reserved.
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
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.
44  *
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.
55  */
56 
57 
58 #include <sys/types.h>
59 
60 #include <lib/libsa/stand.h>
61 #include <lib/libkern/libkern.h>
62 
63 #include <libi386.h>
64 #include <biosdisk.h>
65 #include "devopen.h"
66 #ifdef _STANDALONE
67 #include <bootinfo.h>
68 #endif
69 #ifdef SUPPORT_PS2
70 #include <biosmca.h>
71 #endif
72 
73 static int dev2bios(char *, int, int *);
74 
75 static int
dev2bios(char * devname,int unit,int * biosdev)76 dev2bios(char *devname, int unit, int *biosdev)
77 {
78 
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;
85 	else
86 		return ENXIO;
87 
88 	return 0;
89 }
90 
91 void
bios2dev(int biosdev,daddr_t sector,char ** devname,int * unit,int * partition)92 bios2dev(int biosdev, daddr_t sector, char **devname, int *unit, int *partition)
93 {
94 
95 	/* set default */
96 	*unit = biosdev & 0x7f;
97 
98 	if (biosdev & 0x80) {
99 		/*
100 		 * There seems to be no standard way of numbering BIOS
101 		 * CD-ROM drives. The following method is a little tricky
102 		 * but works nicely.
103 		 */
104 		if (biosdev >= 0x80 + get_harddrives()) {
105 			*devname = "cd";
106 			*unit = 0;		/* override default */
107 		} else
108 			*devname = "hd";
109 	} else
110 		*devname = "fd";
111 
112 	*partition = biosdisk_findpartition(biosdev, sector);
113 }
114 
115 #ifdef _STANDALONE
116 struct btinfo_bootpath bibp;
117 extern bool kernel_loaded;
118 #endif
119 
120 /*
121  * Open the BIOS disk device
122  */
123 int
devopen(struct open_file * f,const char * fname,char ** file)124 devopen(struct open_file *f, const char *fname, char **file)
125 {
126 	char *fsname, *devname;
127 	int unit, partition;
128 	int biosdev;
129 	int error;
130 
131 	if ((error = parsebootfile(fname, &fsname, &devname,
132 				   &unit, &partition, (const char **) file))
133 	    || (error = dev2bios(devname, unit, &biosdev)))
134 		return error;
135 
136 	f->f_dev = &devsw[0];		/* must be biosdisk */
137 
138 #ifdef _STANDALONE
139 	if (!kernel_loaded) {
140 		strncpy(bibp.bootpath, *file, sizeof(bibp.bootpath));
141 		BI_ADD(&bibp, BTINFO_BOOTPATH, sizeof(bibp));
142 	}
143 #endif
144 
145 	return biosdisk_open(f, biosdev, partition);
146 }
147