1/* $NetBSD: devopen.c,v 1.1 2009/03/02 09:33:02 nonaka Exp $ */ 2 3/*- 4 * Copyright (c) 1993 John Brezak 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 27 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include <sys/param.h> 32#include <sys/disklabel.h> 33 34#include "boot.h" 35#include "bootinfo.h" 36#include "disk.h" 37#include "unixdev.h" 38 39static int dev2bios(char *devname, unsigned int unit, int *biosdev); 40static int devlookup(char *d); 41 42static int 43dev2bios(char *devname, unsigned int unit, int *biosdev) 44{ 45 46 if (strcmp(devname, devname_hd) == 0) { 47 *biosdev = 0x80 + unit; 48 return 0; 49 } else if (strcmp(devname, devname_mmcd) == 0) { 50 *biosdev = 0x00 + unit; 51 return 0; 52 } 53 return ENXIO; 54} 55 56static int 57devlookup(char *d) 58{ 59 struct devsw *dp = devsw; 60 int i; 61 62 for (i = 0; i < ndevs; i++, dp++) { 63 if ((dp->dv_name != NULL) && (strcmp(dp->dv_name, d) == 0)) { 64 return i; 65 } 66 } 67 68 printf("No such device - Configured devices are:\n"); 69 for (dp = devsw, i = 0; i < ndevs; i++, dp++) { 70 if (dp->dv_name != NULL) { 71 printf(" %s", dp->dv_name); 72 } 73 } 74 printf("\n"); 75 return -1; 76} 77 78int 79devopen(struct open_file *f, const char *fname, char **file) 80{ 81 struct devsw *dp; 82 char *fsname, *devname; 83 u_int dev, unit, partition; 84 int biosdev; 85 int error; 86 87#if defined(UNIX_DEBUG) 88 printf("devopen: fname = %s\n", fname ? fname : "(null)"); 89#endif 90 91 if ((error = parsebootfile(fname, &fsname, &devname, &unit, &partition, 92 (const char **)file)) != 0) { 93 return error; 94 } 95 96#if defined(UNIX_DEBUG) 97 printf("devopen: devname = %s\n", devname); 98#endif 99 dev = devlookup(devname); 100 if (dev == -1) { 101#if defined(UNIX_DEBUG) 102 printf("devopen: devlookup failed\n"); 103#endif 104 return ENXIO; 105 } 106 107 dp = &devsw[dev]; 108 if (dp->dv_open == NULL) { 109#if defined(UNIX_DEBUG) 110 printf("devopen: dev->dv_open() == NULL\n"); 111#endif 112 return ENODEV; 113 } 114 f->f_dev = dp; 115 116 if (dev2bios(devname, unit, &biosdev) == 0) { 117#if defined(UNIX_DEBUG) 118 printf("devopen: bios disk\n"); 119#endif 120 return unixopen(f, devname, unit, partition, *file); 121 } 122 123#if defined(UNIX_DEBUG) 124 printf("devopen: dev->dv_open()\n"); 125#endif 126 if ((error = (*dp->dv_open)(f, devname, unit, partition, *file)) == 0) { 127#if defined(UNIX_DEBUG) 128 printf("devopen: dev->dv_open() opened\n"); 129#endif 130 return 0; 131 } 132 133 printf("%s%d%c:%s : %s\n", dp->dv_name, unit, partition + 'a', *file, 134 strerror(error)); 135 return error; 136} 137