Home | History | Annotate | Line # | Download | only in efiboot
devopen.c revision 1.1.20.2
      1 /*	$NetBSD: devopen.c,v 1.1.20.2 2018/03/22 01:44:45 pgoyette 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 if (strcmp(devname, "cd") == 0)
     70 		*biosdev = 0x80 + get_harddrives() + unit;
     71 	else
     72 		return ENXIO;
     73 
     74 	return 0;
     75 }
     76 
     77 void
     78 bios2dev(int biosdev, daddr_t sector, char **devname, int *unit, int *partition)
     79 {
     80 
     81 	*unit = biosdev & 0x7f;
     82 
     83 	if (biosdev >= 0x80 + get_harddrives()) {
     84 		*devname = "cd";
     85 		*unit -= get_harddrives();
     86 	} else
     87 		*devname = "hd";
     88 
     89 	*partition = biosdisk_findpartition(biosdev, sector);
     90 }
     91 
     92 struct btinfo_bootpath bibp;
     93 extern bool kernel_loaded;
     94 
     95 /*
     96  * Open the EFI disk device
     97  */
     98 int
     99 devopen(struct open_file *f, const char *fname, char **file)
    100 {
    101 	char *fsname, *devname;
    102 	int unit, partition;
    103 	int biosdev;
    104 	int error;
    105 
    106 	if ((error = parsebootfile(fname, &fsname, &devname,
    107 				   &unit, &partition, (const char **) file))
    108 	    || (error = dev2bios(devname, unit, &biosdev)))
    109 		return error;
    110 
    111 	f->f_dev = &devsw[0];		/* must be biosdisk */
    112 
    113 	if (!kernel_loaded) {
    114 		strncpy(bibp.bootpath, *file, sizeof(bibp.bootpath));
    115 		BI_ADD(&bibp, BTINFO_BOOTPATH, sizeof(bibp));
    116 	}
    117 
    118 	return biosdisk_open(f, biosdev, partition);
    119 }
    120