1 /* $NetBSD: diskio.c,v 1.2 1997/06/28 21:36:45 leo Exp $ */ 2 3 /* 4 * Copyright (c) 1995 Waldi Ravens. 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. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Waldi Ravens. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include "stand.h" 34 #include "atari_stand.h" 35 #include <sys/disklabel.h> 36 37 typedef int (*rdsec_f)__P((void *buffer, u_int offset, u_int count)); 38 typedef struct { rdsec_f rds; u_int rst; u_int rend; } bdevd_t; 39 40 static int rootstrategy __P((void *, int, daddr_t, size_t, void *, size_t *)); 41 static int rootopen __P((struct open_file *, ...)); 42 static int rootclose __P((struct open_file *)); 43 static int rootioctl __P((struct open_file *, u_long, void *)); 44 45 static struct devsw devsw[] = { 46 { "root", rootstrategy, rootopen, rootclose, rootioctl } 47 }; 48 static bdevd_t bootdev; 49 50 /* 51 * Initialise boot device info. 52 */ 53 int 54 init_dskio (func, label, root) 55 void *func, *label; 56 int root; 57 { 58 struct disklabel *dl = label; 59 struct partition *pd = &dl->d_partitions[root]; 60 61 if (dl->d_magic != DISKMAGIC || dl->d_magic2 != DISKMAGIC 62 || dl->d_npartitions > MAXPARTITIONS || dkcksum(dl) != 0) { 63 printf("Invalid disk label.\n"); 64 return(-1); 65 } 66 if (root >= 0) { 67 if (root >= dl->d_npartitions 68 || pd->p_fstype != FS_BSDFFS || pd->p_size == 0) { 69 printf("No suitable root.\n"); 70 return(-1); 71 } 72 bootdev.rds = func; 73 bootdev.rst = pd->p_offset; 74 bootdev.rend = pd->p_offset + pd->p_size - 1; 75 } 76 return(0); 77 } 78 79 /* 80 * No choice, the kernel is loaded from the 81 * same device as the bootstrap. 82 */ 83 int 84 devopen (f, fname, file) 85 struct open_file *f; 86 const char *fname; 87 char **file; 88 { 89 f->f_devdata = &bootdev; 90 f->f_dev = &devsw[0]; 91 *file = (char *)fname; 92 return(0); 93 } 94 95 static int 96 rootstrategy (devd, flag, dblk, size, buf, rsize) 97 void *devd; 98 int flag; 99 daddr_t dblk; 100 size_t size; 101 void *buf; 102 size_t *rsize; 103 { 104 bdevd_t *dd = devd; 105 daddr_t stb = dd->rst + dblk; 106 size_t nb = size >> 9; 107 108 if ((flag == F_READ) && !(size & 511) && (stb + nb <= dd->rend)) { 109 if (!dd->rds(buf, stb, nb)) { 110 *rsize = size; 111 return(0); 112 } 113 } 114 *rsize = 0; 115 return(EIO); 116 } 117 118 static int 119 rootopen (f) 120 struct open_file *f; 121 { 122 return(0); 123 } 124 125 static int 126 rootclose (f) 127 struct open_file *f; 128 { 129 return(EIO); 130 } 131 132 static int 133 rootioctl (f, cmd, data) 134 struct open_file *f; 135 u_long cmd; 136 void *data; 137 { 138 return(EIO); 139 } 140