Home | History | Annotate | Line # | Download | only in efiboot
devopen.c revision 1.1.18.2
      1 /*	$NetBSD: devopen.c,v 1.1.18.2 2017/12/03 11:36:18 jdolecek 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 #include "efiboot.h"
     58 
     59 #include <biosdisk.h>
     60 #include "devopen.h"
     61 #include <bootinfo.h>
     62 
     63 static int
     64 dev2bios(char *devname, int unit, int *biosdev)
     65 {
     66 
     67 	if (strcmp(devname, "hd") == 0)
     68 		*biosdev = 0x80 + unit;
     69 	else
     70 		return ENXIO;
     71 	return 0;
     72 }
     73 
     74 void
     75 bios2dev(int biosdev, daddr_t sector, char **devname, int *unit, int *partition)
     76 {
     77 
     78 	*unit = biosdev & 0x7f;
     79 	*devname = "hd";
     80 	*partition = biosdisk_findpartition(biosdev, sector);
     81 }
     82 
     83 struct btinfo_bootpath bibp;
     84 extern bool kernel_loaded;
     85 
     86 /*
     87  * Open the EFI disk device
     88  */
     89 int
     90 devopen(struct open_file *f, const char *fname, char **file)
     91 {
     92 	char *fsname, *devname;
     93 	int unit, partition;
     94 	int biosdev;
     95 	int error;
     96 
     97 	if ((error = parsebootfile(fname, &fsname, &devname,
     98 				   &unit, &partition, (const char **) file))
     99 	    || (error = dev2bios(devname, unit, &biosdev)))
    100 		return error;
    101 
    102 	f->f_dev = &devsw[0];		/* must be biosdisk */
    103 
    104 	if (!kernel_loaded) {
    105 		strncpy(bibp.bootpath, *file, sizeof(bibp.bootpath));
    106 		BI_ADD(&bibp, BTINFO_BOOTPATH, sizeof(bibp));
    107 	}
    108 
    109 	return biosdisk_open(f, biosdev, partition);
    110 }
    111