hostdisk.c revision 329183
1251881Speter/*- 2251881Speter * Copyright (C) 2014 Nathan Whitehorn 3251881Speter * All rights reserved. 4251881Speter * 5251881Speter * Redistribution and use in source and binary forms, with or without 6251881Speter * modification, are permitted provided that the following conditions 7251881Speter * are met: 8251881Speter * 1. Redistributions of source code must retain the above copyright 9251881Speter * notice, this list of conditions and the following disclaimer. 10251881Speter * 2. Redistributions in binary form must reproduce the above copyright 11251881Speter * notice, this list of conditions and the following disclaimer in the 12251881Speter * documentation and/or other materials provided with the distribution. 13251881Speter * 14251881Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15251881Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16251881Speter * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17251881Speter * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 18251881Speter * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19251881Speter * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20251881Speter * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 21251881Speter * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 22251881Speter * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 23251881Speter * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24251881Speter */ 25251881Speter 26251881Speter#include <sys/cdefs.h> 27251881Speter__FBSDID("$FreeBSD: stable/11/stand/powerpc/kboot/hostdisk.c 329183 2018-02-12 20:51:28Z kevans $"); 28251881Speter 29251881Speter#include <sys/types.h> 30251881Speter#include <stdarg.h> 31251881Speter#include "bootstrap.h" 32251881Speter#include "host_syscall.h" 33251881Speter 34251881Speterstatic int hostdisk_init(void); 35251881Speterstatic int hostdisk_strategy(void *devdata, int flag, daddr_t dblk, 36251881Speter size_t size, char *buf, size_t *rsize); 37289180Speterstatic int hostdisk_open(struct open_file *f, ...); 38251881Speterstatic int hostdisk_close(struct open_file *f); 39251881Speterstatic int hostdisk_ioctl(struct open_file *f, u_long cmd, void *data); 40251881Speterstatic int hostdisk_print(int verbose); 41251881Speter 42251881Speterstruct devsw hostdisk = { 43251881Speter "/dev", 44251881Speter DEVT_DISK, 45251881Speter hostdisk_init, 46251881Speter hostdisk_strategy, 47251881Speter hostdisk_open, 48251881Speter hostdisk_close, 49251881Speter hostdisk_ioctl, 50251881Speter hostdisk_print, 51251881Speter}; 52251881Speter 53251881Speterstatic int 54251881Speterhostdisk_init(void) 55251881Speter{ 56251881Speter 57251881Speter return (0); 58251881Speter} 59251881Speter 60251881Speterstatic int 61251881Speterhostdisk_strategy(void *devdata, int flag, daddr_t dblk, size_t size, 62251881Speter char *buf, size_t *rsize) 63251881Speter{ 64251881Speter struct devdesc *desc = devdata; 65251881Speter daddr_t pos; 66251881Speter int n; 67251881Speter uint64_t res; 68251881Speter uint32_t posl, posh; 69251881Speter 70251881Speter pos = dblk * 512; 71251881Speter 72251881Speter posl = pos & 0xffffffff; 73251881Speter posh = (pos >> 32) & 0xffffffff; 74251881Speter if (host_llseek(desc->d_unit, posh, posl, &res, 0) < 0) { 75251881Speter printf("Seek error\n"); 76251881Speter return (EIO); 77289180Speter } 78251881Speter n = host_read(desc->d_unit, buf, size); 79251881Speter 80289180Speter if (n < 0) 81251881Speter return (EIO); 82251881Speter 83251881Speter *rsize = n; 84251881Speter return (0); 85251881Speter} 86289180Speter 87251881Speterstatic int 88251881Speterhostdisk_open(struct open_file *f, ...) 89251881Speter{ 90251881Speter struct devdesc *desc; 91251881Speter va_list vl; 92251881Speter 93251881Speter va_start(vl, f); 94251881Speter desc = va_arg(vl, struct devdesc *); 95251881Speter va_end(vl); 96251881Speter 97251881Speter desc->d_unit = host_open(desc->d_opendata, O_RDONLY, 0); 98251881Speter 99251881Speter if (desc->d_unit <= 0) { 100251881Speter printf("hostdisk_open: couldn't open %s: %d\n", 101289180Speter (char *)desc->d_opendata, desc->d_unit); 102289180Speter return (ENOENT); 103289180Speter } 104289180Speter 105289180Speter return (0); 106289180Speter} 107289180Speter 108289180Speterstatic int 109251881Speterhostdisk_close(struct open_file *f) 110251881Speter{ 111289180Speter struct devdesc *desc = f->f_devdata; 112251881Speter 113251881Speter host_close(desc->d_unit); 114251881Speter return (0); 115251881Speter} 116251881Speter 117289180Speterstatic int 118251881Speterhostdisk_ioctl(struct open_file *f, u_long cmd, void *data) 119289180Speter{ 120289180Speter 121251881Speter return (EINVAL); 122251881Speter} 123251881Speter 124251881Speterstatic int 125251881Speterhostdisk_print(int verbose) 126251881Speter{ 127251881Speter return (0); 128251881Speter} 129251881Speter 130251881Speter