diff options
author | 2014-01-19 02:58:50 +0000 | |
---|---|---|
committer | 2014-01-19 02:58:50 +0000 | |
commit | b4544c7c7f204e0163176d2c291c88d0ed370abc (patch) | |
tree | d9ede41f4ef30d7a37eff82c7d94904e0bc1688a /usr.sbin/installboot/sparc64_softraid.c | |
parent | all 64bit archs myx runs on support bus_space 8 things because of work i (diff) | |
download | wireguard-openbsd-b4544c7c7f204e0163176d2c291c88d0ed370abc.tar.xz wireguard-openbsd-b4544c7c7f204e0163176d2c291c88d0ed370abc.zip |
Rework installboot and use a single directory with a single makefile. The
directory per machine model is arguably cleaner, however it does not play
well with distrib/special and instbin.
Discussed with deraadt@
Diffstat (limited to 'usr.sbin/installboot/sparc64_softraid.c')
-rw-r--r-- | usr.sbin/installboot/sparc64_softraid.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/usr.sbin/installboot/sparc64_softraid.c b/usr.sbin/installboot/sparc64_softraid.c new file mode 100644 index 00000000000..659d82f699c --- /dev/null +++ b/usr.sbin/installboot/sparc64_softraid.c @@ -0,0 +1,101 @@ +/* $OpenBSD: sparc64_softraid.c,v 1.1 2014/01/19 02:58:50 jsing Exp $ */ +/* + * Copyright (c) 2012 Joel Sing <jsing@openbsd.org> + * + * 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. + */ + +#include <sys/param.h> +#include <sys/disklabel.h> +#include <sys/ioctl.h> +#include <sys/stat.h> + +#include <dev/biovar.h> +#include <dev/softraidvar.h> + +#include <err.h> +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <util.h> +#include <unistd.h> + +#include "installboot.h" +#include "sparc64_installboot.h" + +void +sr_install_bootblk(int devfd, int vol, int disk) +{ + struct bioc_disk bd; + char *realdev; + int diskfd; + char part; + + /* Get device name for this disk/chunk. */ + memset(&bd, 0, sizeof(bd)); + bd.bd_volid = vol; + bd.bd_diskid = disk; + if (ioctl(devfd, BIOCDISK, &bd) == -1) + err(1, "BIOCDISK"); + + /* Check disk status. */ + if (bd.bd_status != BIOC_SDONLINE && bd.bd_status != BIOC_SDREBUILD) { + fprintf(stderr, "softraid chunk %u not online - skipping...\n", + disk); + return; + } + + if (strlen(bd.bd_vendor) < 1) + errx(1, "invalid disk name"); + part = bd.bd_vendor[strlen(bd.bd_vendor) - 1]; + if (part < 'a' || part >= 'a' + MAXPARTITIONS) + errx(1, "invalid partition %c\n", part); + bd.bd_vendor[strlen(bd.bd_vendor) - 1] = '\0'; + + /* Open device. */ + if ((diskfd = opendev(bd.bd_vendor, (nowrite ? O_RDONLY : O_RDWR), + OPENDEV_PART, &realdev)) < 0) + err(1, "open: %s", realdev); + + if (verbose) + fprintf(stderr, "%s%c: installing boot blocks on %s\n", + bd.bd_vendor, part, realdev); + + /* Write boot blocks to device. */ + md_installboot(diskfd, realdev); + + close(diskfd); +} + +void +sr_install_bootldr(int devfd, char *dev) +{ + struct bioc_installboot bb; + + /* + * Install boot loader into softraid boot loader storage area. + */ + memset(&bb, 0, sizeof(bb)); + bb.bb_bootblk = blkstore; + bb.bb_bootblk_size = blksize; + bb.bb_bootldr = ldrstore; + bb.bb_bootldr_size = ldrsize; + strncpy(bb.bb_dev, dev, sizeof(bb.bb_dev)); + if (!nowrite) { + if (verbose) + fprintf(stderr, "%s: installing boot loader on " + "softraid volume\n", dev); + if (ioctl(devfd, BIOCINSTALLBOOT, &bb) == -1) + errx(1, "softraid installboot failed"); + } +} |