diff options
Diffstat (limited to 'sys/arch/sgi/stand/boot/diskio.c')
-rw-r--r-- | sys/arch/sgi/stand/boot/diskio.c | 252 |
1 files changed, 0 insertions, 252 deletions
diff --git a/sys/arch/sgi/stand/boot/diskio.c b/sys/arch/sgi/stand/boot/diskio.c deleted file mode 100644 index 48104ca11ac..00000000000 --- a/sys/arch/sgi/stand/boot/diskio.c +++ /dev/null @@ -1,252 +0,0 @@ -/* $OpenBSD: diskio.c,v 1.14 2020/12/09 18:10:19 krw Exp $ */ - -/* - * Copyright (c) 2016 Miodrag Vallat. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -/* - * Copyright (c) 2000 Opsycon AB (www.opsycon.se) - * Copyright (c) 2000 Rtmx, Inc (www.rtmx.com) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed for Rtmx, Inc by - * Opsycon Open System Consulting AB, Sweden. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/param.h> -#include <lib/libkern/libkern.h> -#include <stand.h> - -#include <sys/disklabel.h> -#include <mips64/arcbios.h> - -char *strstr(char *, const char *); /* strstr.c */ - -struct dio_softc { - int sc_fd; /* PROM file ID */ - int sc_part; /* Disk partition number. */ - struct disklabel sc_label; /* Disk label for this disk. */ -}; - -int -diostrategy(void *devdata, int rw, daddr_t bn, size_t reqcnt, void *addr, - size_t *cnt) -{ - struct dio_softc *sc = (struct dio_softc *)devdata; - struct partition *pp = &sc->sc_label.d_partitions[sc->sc_part]; - uint64_t blkoffset; - arc_quad_t offset; - long result; - - if (rw != F_READ) - return EOPNOTSUPP; - - blkoffset = - (DL_SECTOBLK(&sc->sc_label, DL_GETPOFFSET(pp)) + bn) * DEV_BSIZE; - offset.hi = blkoffset >> 32; - offset.lo = blkoffset; - - if (Bios_Seek(sc->sc_fd, &offset, 0) < 0 || - Bios_Read(sc->sc_fd, addr, reqcnt, &result) < 0) - return EIO; - - if (cnt != NULL) - *cnt = result; - return 0; -} - -int -dioopen(struct open_file *f, ...) -{ - char *ctlr; - int partition; - struct dio_softc *sc; - struct disklabel *lp; - struct sgilabel *sl; - long fd; - /* XXX getdisklabel() assumes DEV_BSIZE bytes available */ - char buf[DEV_BSIZE + LABELOFFSET]; - arc_quad_t offset; - daddr_t native_offset; - long result; - va_list ap; - char rawctlr[1 + MAXPATHLEN]; - char *partptr; - - va_start(ap, f); - ctlr = va_arg(ap, char *); - partition = va_arg(ap, int); - va_end(ap); - - if (partition >= MAXPARTITIONS) - return ENXIO; - - /* - * If booting from disk, `ctlr` is something like - * whatever()partition(0) - * or - * dksc(whatever,0) - * where 0 is the volume header #0 partition, which is the - * OpenBSD area, where the OpenBSD disklabel can be found. - * - * However, the OpenBSD `a' partition, where the kernel is to be - * found, may not start at the same offset. - * - * In order to be able to correctly load any file from the OpenBSD - * partitions, we need to access the volume header partition table - * and the OpenBSD label. - * - * Therefore, make sure we replace `partition(*)' with `partition(10)' - * before reaching ARCBios, in order to access the raw disk. - * - * We could use partition #8 and use the value of SystemPartition in - * the environment to avoid doing this, but this would prevent us - * from being able to boot from a different disk than the one - * pointed to by SystemPartition. - */ - - strlcpy(rawctlr, ctlr, sizeof rawctlr); - partptr = strstr(rawctlr, "partition("); - if (partptr != NULL) { - strlcpy(partptr, "partition(10)", - sizeof rawctlr - (partptr - rawctlr)); - } else { - if ((partptr = strstr(rawctlr, "dksc(")) != NULL) { - partptr = strstr(partptr, ",0)"); - if (partptr != NULL && partptr[3] == '\0') - strlcpy(partptr, ",10)", - sizeof rawctlr - (partptr - rawctlr)); - } - } - - sl = NULL; /* no volume header found yet */ - if (partptr != NULL) { - if (Bios_Open(rawctlr, 0, &fd) < 0) - return ENXIO; - - /* - * Read the volume header. - */ - offset.hi = offset.lo = 0; - if (Bios_Seek(fd, &offset, 0) < 0 || - Bios_Read(fd, buf, DEV_BSIZE, &result) < 0 || - result != DEV_BSIZE) - return EIO; - - sl = (struct sgilabel *)buf; - if (sl->magic != SGILABEL_MAGIC) { -#ifdef DEBUG - printf("Invalid volume header magic %x\n", sl->magic); -#endif - Bios_Close(fd); - sl = NULL; - } - } - - if (sl == NULL) { - if (Bios_Open(ctlr, 0, &fd) < 0) - return ENXIO; - } - - sc = alloc(sizeof(struct dio_softc)); - bzero(sc, sizeof(struct dio_softc)); - f->f_devdata = (void *)sc; - lp = &sc->sc_label; - - sc->sc_fd = fd; - sc->sc_part = partition; - - if (sl != NULL) { - native_offset = sl->partitions[0].first; - } else { - /* - * We could not read the volume header, or there isn't any. - * Stick to the device we were given, and assume the - * OpenBSD disklabel can be found at the beginning. - */ - native_offset = 0; - } - - /* - * Read the native OpenBSD label. - */ -#ifdef DEBUG - printf("OpenBSD label @%lld\n", native_offset + LABELSECTOR); -#endif - offset.hi = ((native_offset + LABELSECTOR) * DEV_BSIZE) >> 32; - offset.lo = (native_offset + LABELSECTOR) * DEV_BSIZE; - - if (Bios_Seek(fd, &offset, 0) < 0 || - Bios_Read(fd, buf, DEV_BSIZE, &result) < 0 || - result != DEV_BSIZE) - return EIO; - - if (getdisklabel(buf + LABELOFFSET, lp) == NULL) { -#ifdef DEBUG - printf("Found native disklabel, " - "partition %c starts at %lld\n", - 'a' + partition, - DL_GETPOFFSET(&lp->d_partitions[partition])); -#endif - } else { - /* - * Assume the OpenBSD partition spans the whole device. - */ - lp->d_secsize = DEV_BSIZE; - lp->d_secpercyl = 1; - lp->d_npartitions = MAXPARTITIONS; - DL_SETPOFFSET(&lp->d_partitions[partition], native_offset); - DL_SETPSIZE(&lp->d_partitions[partition], -1ULL); -#ifdef DEBUG - printf("No native disklabel found, " - "assuming partition %c starts at %lld\n", - 'a' + partition, native_offset); -#endif - } - - return 0; -} - -int -dioclose(struct open_file *f) -{ - Bios_Close(((struct dio_softc *)f->f_devdata)->sc_fd); - free(f->f_devdata, sizeof(struct dio_softc)); - f->f_devdata = NULL; - return (0); -} |