Home | History | Annotate | Line # | Download | only in boot
devopen.c revision 1.7
      1 /*	$NetBSD: devopen.c,v 1.7 2008/05/02 15:26:38 ad 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
     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
     92 bios2dev(int biosdev, u_int 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
    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