summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2018-11-18 17:55:59 +0200
committerDan McDonald <danmcd@joyent.com>2018-12-07 16:34:34 -0500
commit37002877d7628586736855370376e9f6ec0d4704 (patch)
treef4a9d545eda6282507c7f4818c39543db9224eb2 /usr/src
parent03fe8ede397c5609aac1be54aedccec490dca121 (diff)
downloadillumos-gate-37002877d7628586736855370376e9f6ec0d4704.tar.gz
9989 Make loader.efi dual boot, step 2: remove boot1
Reviewed by: John Levon <john.levon@joyent.com> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/boot/sys/boot/efi/Makefile2
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/Makefile32
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/Makefile.com134
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/amd64/Makefile33
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/boot1.c748
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/boot_module.h107
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/i386/Makefile33
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/ufs_module.c178
-rw-r--r--usr/src/boot/sys/boot/efi/boot1/zfs_module.c242
-rw-r--r--usr/src/pkg/manifests/system-boot-loader.mf2
10 files changed, 1 insertions, 1510 deletions
diff --git a/usr/src/boot/sys/boot/efi/Makefile b/usr/src/boot/sys/boot/efi/Makefile
index da61badebf..14fc37fe35 100644
--- a/usr/src/boot/sys/boot/efi/Makefile
+++ b/usr/src/boot/sys/boot/efi/Makefile
@@ -17,7 +17,7 @@
include $(SRC)/Makefile.master
-SUBDIRS = libefi boot1 loader
+SUBDIRS = libefi loader
#.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "arm"
#.if ${MK_FDT} != "no"
diff --git a/usr/src/boot/sys/boot/efi/boot1/Makefile b/usr/src/boot/sys/boot/efi/boot1/Makefile
deleted file mode 100644
index fa72aaecd7..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/Makefile
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# This file and its contents are supplied under the terms of the
-# Common Development and Distribution License ("CDDL"), version 1.0.
-# You may only use this file in accordance with the terms of version
-# 1.0 of the CDDL.
-#
-# A full copy of the text of the CDDL should have accompanied this
-# source. A copy of the CDDL is also available via the Internet at
-# http://www.illumos.org/license/CDDL.
-#
-
-#
-# Copyright 2016 Toomas Soome <tsoome@me.com>
-#
-
-.KEEP_STATE:
-
-include $(SRC)/Makefile.master
-
-SUBDIRS = $(MACH) $(MACH64)
-
-all := TARGET = all
-clean := TARGET = clean
-clobber := TARGET = clobber
-install := TARGET = install
-
-all clean clobber install: $(SUBDIRS)
-
-$(SUBDIRS): FRC
- @cd $@; pwd; $(MAKE) $(MFLAGS) $(TARGET)
-
-FRC:
diff --git a/usr/src/boot/sys/boot/efi/boot1/Makefile.com b/usr/src/boot/sys/boot/efi/boot1/Makefile.com
deleted file mode 100644
index f3c72005e9..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/Makefile.com
+++ /dev/null
@@ -1,134 +0,0 @@
-#
-# This file and its contents are supplied under the terms of the
-# Common Development and Distribution License ("CDDL"), version 1.0.
-# You may only use this file in accordance with the terms of version
-# 1.0 of the CDDL.
-#
-# A full copy of the text of the CDDL should have accompanied this
-# source. A copy of the CDDL is also available via the Internet at
-# http://www.illumos.org/license/CDDL.
-#
-
-#
-# Copyright 2016 Toomas Soome <tsoome@me.com>
-#
-
-include $(SRC)/Makefile.master
-include $(SRC)/boot/Makefile.version
-
-CC= $(GNUC_ROOT)/bin/gcc
-LD= $(GNU_ROOT)/bin/gld
-OBJCOPY= $(GNU_ROOT)/bin/gobjcopy
-OBJDUMP= $(GNU_ROOT)/bin/gobjdump
-
-PROG= boot1.sym
-
-# architecture-specific loader code
-SRCS= multiboot.S boot1.c self_reloc.c start.S ufs_module.c zfs_module.c \
- devopen.c
-OBJS= multiboot.o boot1.o self_reloc.o start.o ufs_module.o zfs_module.o \
- devopen.o
-
-CFLAGS= -O2
-CPPFLAGS= -nostdinc -D_STANDALONE
-
-zfs_module.o := CFLAGS += -Wno-unused-function
-
-CPPFLAGS += -I.
-CPPFLAGS += -I../../include
-CPPFLAGS += -I../../include/$(MACHINE)
-CPPFLAGS += -I../../../../../include
-CPPFLAGS += -I../../../../sys
-CPPFLAGS += -I../../../..
-CPPFLAGS += -I../../../../../lib/libstand
-CPPFLAGS += -DUFS1_ONLY
-# CPPFLAGS += -DEFI_DEBUG
-
-CPPFLAGS += -I../../../zfs/
-CPPFLAGS += -I../../../../cddl/boot/zfs/
-
-# Always add MI sources and REGULAR efi loader bits
-CPPFLAGS += -I../../../common
-
-# For sys/skein.h
-CPPFLAGS += -I$(SRC)/uts/common
-
-include ../../Makefile.inc
-
-FILES= $(EFIPROG)
-FILEMODE= 0555
-ROOT_BOOT= $(ROOT)/boot
-ROOTBOOTFILES=$(FILES:%=$(ROOT_BOOT)/%)
-
-LDSCRIPT= ../../loader/arch/$(MACHINE)/ldscript.$(MACHINE)
-LDFLAGS= -nostdlib --eh-frame-hdr
-LDFLAGS += -shared --hash-style=both --enable-new-dtags
-LDFLAGS += -T$(LDSCRIPT) -Bsymbolic
-
-install: all $(ROOTBOOTFILES)
-
-LIBEFI= ../../libefi/$(MACHINE)/libefi.a
-#
-# Add libstand for the runtime functions used by the compiler - for example
-# __aeabi_* (arm) or __divdi3 (i386).
-# as well as required string and memory functions for all platforms.
-#
-LIBSTAND= ../../../libstand/$(MACHINE)/libstand.a
-LIBZFSBOOT= ../../../zfs/$(MACHINE)/libzfsboot.a
-DPADD= $(LIBEFI) $(LIBZFSBOOT) $(LIBSTAND)
-LDADD= -L../../libefi/$(MACHINE) -lefi
-LDADD += -L../../../zfs/$(MACHINE) -lzfsboot
-LDADD += -L../../../libstand/$(MACHINE) -lstand
-
-DPADD += $(LDSCRIPT)
-
-$(EFIPROG): $(PROG)
- if [ `$(OBJDUMP) -t $(PROG) | fgrep '*UND*' | wc -l` != 0 ]; then \
- $(OBJDUMP) -t $(PROG) | fgrep '*UND*'; \
- exit 1; \
- fi
- $(OBJCOPY) --readonly-text -j .peheader -j .text -j .sdata -j .data \
- -j .dynamic -j .dynsym -j .rel.dyn \
- -j .rela.dyn -j .reloc -j .eh_frame \
- --output-target=$(EFI_TARGET) --subsystem efi-app $(PROG) $@
- $(BTXLD) -V $(BOOT_VERSION) -o $@ $@
-
-boot1.o: ../../../common/ufsread.c
-
-CLEANFILES= $(EFIPROG) $(PROG)
-
-$(PROG): $(OBJS) $(DPADD)
- $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDADD)
-
-machine:
- $(RM) machine
- $(SYMLINK) ../../../../$(MACHINE)/include machine
-
-x86:
- $(RM) x86
- $(SYMLINK) ../../../../x86/include x86
-
-clean clobber:
- $(RM) $(CLEANFILES) $(OBJS)
-
-%.o: ../../../common/%.S
- $(COMPILE.S) $<
-
-%.o: ../%.c
- $(COMPILE.c) $<
-
-#
-# using -W to silence gas here, as for 32bit build, it will generate warning
-# for start.S because hand crafted .reloc section does not have group name
-#
-%.o: ../../loader/arch/$(MACHINE)/%.S
- $(COMPILE.S) -Wa,-W $<
-
-%.o: ../../loader/%.c
- $(COMPILE.c) $<
-
-%.o: ../../../common/%.c
- $(COMPILE.c) $<
-
-$(ROOT_BOOT)/%: %
- $(INS.file)
diff --git a/usr/src/boot/sys/boot/efi/boot1/amd64/Makefile b/usr/src/boot/sys/boot/efi/boot1/amd64/Makefile
deleted file mode 100644
index 24d3c17a1e..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/amd64/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# This file and its contents are supplied under the terms of the
-# Common Development and Distribution License ("CDDL"), version 1.0.
-# You may only use this file in accordance with the terms of version
-# 1.0 of the CDDL.
-#
-# A full copy of the text of the CDDL should have accompanied this
-# source. A copy of the CDDL is also available via the Internet at
-# http://www.illumos.org/license/CDDL.
-#
-
-#
-# Copyright 2016 Toomas Soome <tsoome@me.com>
-# Copyright 2016 RackTop Systems.
-#
-
-MACHINE= $(MACH64)
-ASFLAGS= -m64
-EFIPROG= bootx64.efi
-
-all: $(EFIPROG)
-
-include ../Makefile.com
-
-EFI_TARGET= pei-x86-64
-LDFLAGS += -znocombreloc
-
-CPPFLAGS += -DLOADER_EFI=\"loader64.efi\"
-CFLAGS += -m64 -mno-red-zone
-
-CLEANFILES += machine x86
-
-$(OBJS): machine x86
diff --git a/usr/src/boot/sys/boot/efi/boot1/boot1.c b/usr/src/boot/sys/boot/efi/boot1/boot1.c
deleted file mode 100644
index f2159d95ab..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/boot1.c
+++ /dev/null
@@ -1,748 +0,0 @@
-/*-
- * Copyright (c) 1998 Robert Nordier
- * All rights reserved.
- * Copyright (c) 2001 Robert Drehmel
- * All rights reserved.
- * Copyright (c) 2014 Nathan Whitehorn
- * All rights reserved.
- * Copyright (c) 2015 Eric McCorkle
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are freely
- * permitted provided that the above copyright notice and this
- * paragraph and the following disclaimer are duplicated in all
- * such forms.
- *
- * This software is provided "AS IS" and without any express or
- * implied warranties, including, without limitation, the implied
- * warranties of merchantability and fitness for a particular
- * purpose.
- */
-
-#include <sys/cdefs.h>
-
-#include <sys/param.h>
-#include <machine/elf.h>
-#include <machine/stdarg.h>
-#include <stand.h>
-
-#include <efi.h>
-#include <eficonsctl.h>
-
-#include <bootstrap.h>
-#include "boot_module.h"
-#include "paths.h"
-
-struct arch_switch archsw;
-struct fs_ops *file_system[] = {
- NULL
-};
-
-static const boot_module_t *boot_modules[] =
-{
- &zfs_module,
- &ufs_module
-};
-
-#define NUM_BOOT_MODULES nitems(boot_modules)
-/* The initial number of handles used to query EFI for partitions. */
-#define NUM_HANDLES_INIT 24
-
-static EFI_GUID BlockIoProtocolGUID = BLOCK_IO_PROTOCOL;
-static EFI_GUID DevicePathGUID = DEVICE_PATH_PROTOCOL;
-static EFI_GUID LoadedImageGUID = LOADED_IMAGE_PROTOCOL;
-static EFI_GUID ConsoleControlGUID = EFI_CONSOLE_CONTROL_PROTOCOL_GUID;
-
-/*
- * Provide Malloc / Free backed by EFIs AllocatePool / FreePool which ensures
- * memory is correctly aligned avoiding EFI_INVALID_PARAMETER returns from
- * EFI methods.
- */
-void *
-Malloc(size_t len, const char *file __unused, int line __unused)
-{
- void *out;
-
- if (BS->AllocatePool(EfiLoaderData, len, &out) == EFI_SUCCESS)
- return (out);
-
- return (NULL);
-}
-
-void
-Free(void *buf, const char *file __unused, int line __unused)
-{
- if (buf != NULL)
- (void)BS->FreePool(buf);
-}
-
-/*
- * nodes_match returns TRUE if the imgpath isn't NULL and the nodes match,
- * FALSE otherwise.
- */
-static BOOLEAN
-nodes_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath)
-{
- size_t len;
-
- if (imgpath == NULL || imgpath->Type != devpath->Type ||
- imgpath->SubType != devpath->SubType)
- return (FALSE);
-
- len = DevicePathNodeLength(imgpath);
- if (len != DevicePathNodeLength(devpath))
- return (FALSE);
-
- return (memcmp(imgpath, devpath, (size_t)len) == 0);
-}
-
-/*
- * device_paths_match returns TRUE if the imgpath isn't NULL and all nodes
- * in imgpath and devpath match up to their respective occurences of a
- * media node, FALSE otherwise.
- */
-static BOOLEAN
-device_paths_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath)
-{
-
- if (imgpath == NULL)
- return (FALSE);
-
- while (!IsDevicePathEnd(imgpath) && !IsDevicePathEnd(devpath)) {
- if (IsDevicePathType(imgpath, MEDIA_DEVICE_PATH) &&
- IsDevicePathType(devpath, MEDIA_DEVICE_PATH))
- return (TRUE);
-
- if (!nodes_match(imgpath, devpath))
- return (FALSE);
-
- imgpath = NextDevicePathNode(imgpath);
- devpath = NextDevicePathNode(devpath);
- }
-
- return (FALSE);
-}
-
-/*
- * devpath_last returns the last non-path end node in devpath.
- */
-static EFI_DEVICE_PATH *
-devpath_last(EFI_DEVICE_PATH *devpath)
-{
-
- while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
- devpath = NextDevicePathNode(devpath);
-
- return (devpath);
-}
-
-/*
- * devpath_node_str is a basic output method for a devpath node which
- * only understands a subset of the available sub types.
- *
- * If we switch to UEFI 2.x then we should update it to use:
- * EFI_DEVICE_PATH_TO_TEXT_PROTOCOL.
- */
-static int
-devpath_node_str(char *buf, size_t size, EFI_DEVICE_PATH *devpath)
-{
-
- switch (devpath->Type) {
- case MESSAGING_DEVICE_PATH:
- switch (devpath->SubType) {
- case MSG_ATAPI_DP: {
- ATAPI_DEVICE_PATH *atapi;
-
- atapi = (ATAPI_DEVICE_PATH *)(void *)devpath;
- return snprintf(buf, size, "ata(%s,%s,0x%x)",
- (atapi->PrimarySecondary == 1) ? "Sec" : "Pri",
- (atapi->SlaveMaster == 1) ? "Slave" : "Master",
- atapi->Lun);
- }
- case MSG_USB_DP: {
- USB_DEVICE_PATH *usb;
-
- usb = (USB_DEVICE_PATH *)devpath;
- return snprintf(buf, size, "usb(0x%02x,0x%02x)",
- usb->ParentPortNumber, usb->InterfaceNumber);
- }
- case MSG_SCSI_DP: {
- SCSI_DEVICE_PATH *scsi;
-
- scsi = (SCSI_DEVICE_PATH *)(void *)devpath;
- return snprintf(buf, size, "scsi(0x%02x,0x%02x)",
- scsi->Pun, scsi->Lun);
- }
- case MSG_SATA_DP: {
- SATA_DEVICE_PATH *sata;
-
- sata = (SATA_DEVICE_PATH *)(void *)devpath;
- return snprintf(buf, size, "sata(0x%x,0x%x,0x%x)",
- sata->HBAPortNumber, sata->PortMultiplierPortNumber,
- sata->Lun);
- }
- default:
- return snprintf(buf, size, "msg(0x%02x)",
- devpath->SubType);
- }
- break;
- case HARDWARE_DEVICE_PATH:
- switch (devpath->SubType) {
- case HW_PCI_DP: {
- PCI_DEVICE_PATH *pci;
-
- pci = (PCI_DEVICE_PATH *)devpath;
- return snprintf(buf, size, "pci(0x%02x,0x%02x)",
- pci->Device, pci->Function);
- }
- default:
- return snprintf(buf, size, "hw(0x%02x)",
- devpath->SubType);
- }
- break;
- case ACPI_DEVICE_PATH: {
- ACPI_HID_DEVICE_PATH *acpi;
-
- acpi = (ACPI_HID_DEVICE_PATH *)(void *)devpath;
- if ((acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
- switch (EISA_ID_TO_NUM(acpi->HID)) {
- case 0x0a03:
- return snprintf(buf, size, "pciroot(0x%x)",
- acpi->UID);
- case 0x0a08:
- return snprintf(buf, size, "pcieroot(0x%x)",
- acpi->UID);
- case 0x0604:
- return snprintf(buf, size, "floppy(0x%x)",
- acpi->UID);
- case 0x0301:
- return snprintf(buf, size, "keyboard(0x%x)",
- acpi->UID);
- case 0x0501:
- return snprintf(buf, size, "serial(0x%x)",
- acpi->UID);
- case 0x0401:
- return snprintf(buf, size, "parallelport(0x%x)",
- acpi->UID);
- default:
- return snprintf(buf, size, "acpi(pnp%04x,0x%x)",
- EISA_ID_TO_NUM(acpi->HID), acpi->UID);
- }
- }
-
- return snprintf(buf, size, "acpi(0x%08x,0x%x)", acpi->HID,
- acpi->UID);
- }
- case MEDIA_DEVICE_PATH:
- switch (devpath->SubType) {
- case MEDIA_CDROM_DP: {
- CDROM_DEVICE_PATH *cdrom;
-
- cdrom = (CDROM_DEVICE_PATH *)(void *)devpath;
- return snprintf(buf, size, "cdrom(%x)",
- cdrom->BootEntry);
- }
- case MEDIA_HARDDRIVE_DP: {
- HARDDRIVE_DEVICE_PATH *hd;
-
- hd = (HARDDRIVE_DEVICE_PATH *)(void *)devpath;
- return snprintf(buf, size, "hd(%x)",
- hd->PartitionNumber);
- }
- default:
- return snprintf(buf, size, "media(0x%02x)",
- devpath->SubType);
- }
- case BBS_DEVICE_PATH:
- return snprintf(buf, size, "bbs(0x%02x)", devpath->SubType);
- case END_DEVICE_PATH_TYPE:
- return (0);
- }
-
- return snprintf(buf, size, "type(0x%02x, 0x%02x)", devpath->Type,
- devpath->SubType);
-}
-
-/*
- * devpath_strlcat appends a text description of devpath to buf but not more
- * than size - 1 characters followed by NUL-terminator.
- */
-int
-devpath_strlcat(char *buf, size_t size, EFI_DEVICE_PATH *devpath)
-{
- size_t len, used;
- const char *sep;
-
- sep = "";
- used = 0;
- while (!IsDevicePathEnd(devpath)) {
- len = snprintf(buf, size - used, "%s", sep);
- used += len;
- if (used > size)
- return (used);
- buf += len;
-
- len = devpath_node_str(buf, size - used, devpath);
- used += len;
- if (used > size)
- return (used);
- buf += len;
- devpath = NextDevicePathNode(devpath);
- sep = ":";
- }
-
- return (used);
-}
-
-/*
- * devpath_str is convenience method which returns the text description of
- * devpath using a static buffer, so it isn't thread safe!
- */
-char *
-devpath_str(EFI_DEVICE_PATH *devpath)
-{
- static char buf[256];
-
- devpath_strlcat(buf, sizeof(buf), devpath);
-
- return buf;
-}
-
-/*
- * load_loader attempts to load the loader image data.
- *
- * It tries each module and its respective devices, identified by mod->probe,
- * in order until a successful load occurs at which point it returns EFI_SUCCESS
- * and EFI_NOT_FOUND otherwise.
- *
- * Only devices which have preferred matching the preferred parameter are tried.
- */
-static EFI_STATUS
-load_loader(const boot_module_t **modp, dev_info_t **devinfop, void **bufp,
- size_t *bufsize, BOOLEAN preferred)
-{
- UINTN i;
- dev_info_t *dev;
- const boot_module_t *mod;
-
- for (i = 0; i < NUM_BOOT_MODULES; i++) {
- mod = boot_modules[i];
- for (dev = mod->devices(); dev != NULL; dev = dev->next) {
- if (dev->preferred != preferred)
- continue;
-
- if (mod->load(PATH_LOADER_EFI, dev, bufp, bufsize) ==
- EFI_SUCCESS) {
- *devinfop = dev;
- *modp = mod;
- return (EFI_SUCCESS);
- }
- }
- }
-
- return (EFI_NOT_FOUND);
-}
-
-/*
- * try_boot only returns if it fails to load the loader. If it succeeds
- * it simply boots, otherwise it returns the status of last EFI call.
- */
-static EFI_STATUS
-try_boot(void)
-{
- size_t bufsize, loadersize, cmdsize;
- void *buf, *loaderbuf;
- char *cmd;
- dev_info_t *dev;
- const boot_module_t *mod;
- EFI_HANDLE loaderhandle;
- EFI_LOADED_IMAGE *loaded_image;
- EFI_STATUS status;
-
- status = load_loader(&mod, &dev, &loaderbuf, &loadersize, TRUE);
- if (status != EFI_SUCCESS) {
- status = load_loader(&mod, &dev, &loaderbuf, &loadersize,
- FALSE);
- if (status != EFI_SUCCESS) {
- printf("Failed to load '%s'\n", PATH_LOADER_EFI);
- return (status);
- }
- }
-
- /*
- * Read in and parse the command line from /boot.config or /boot/config,
- * if present. We'll pass it the next stage via a simple ASCII
- * string. loader.efi has a hack for ASCII strings, so we'll use that to
- * keep the size down here. We only try to read the alternate file if
- * we get EFI_NOT_FOUND because all other errors mean that the boot_module
- * had troubles with the filesystem. We could return early, but we'll let
- * loading the actual kernel sort all that out. Since these files are
- * optional, we don't report errors in trying to read them.
- */
- cmd = NULL;
- cmdsize = 0;
- status = mod->load(PATH_DOTCONFIG, dev, &buf, &bufsize);
- if (status == EFI_NOT_FOUND)
- status = mod->load(PATH_CONFIG, dev, &buf, &bufsize);
- if (status == EFI_SUCCESS) {
- cmdsize = bufsize + 1;
- cmd = malloc(cmdsize);
- if (cmd == NULL)
- goto errout;
- memcpy(cmd, buf, bufsize);
- cmd[bufsize] = '\0';
- free(buf);
- buf = NULL;
- }
-
- if ((status = BS->LoadImage(TRUE, IH, devpath_last(dev->devpath),
- loaderbuf, loadersize, &loaderhandle)) != EFI_SUCCESS) {
- printf("Failed to load image provided by %s, size: %zu, (%lu)\n",
- mod->name, loadersize, EFI_ERROR_CODE(status));
- goto errout;
- }
-
- if ((status = BS->HandleProtocol(loaderhandle, &LoadedImageGUID,
- (VOID**)&loaded_image)) != EFI_SUCCESS) {
- printf("Failed to query LoadedImage provided by %s (%lu)\n",
- mod->name, EFI_ERROR_CODE(status));
- goto errout;
- }
-
- if (cmd != NULL)
- printf(" command args: %s\n", cmd);
-
- loaded_image->DeviceHandle = dev->devhandle;
- loaded_image->LoadOptionsSize = cmdsize;
- loaded_image->LoadOptions = cmd;
-
- DPRINTF("Starting '%s' in 5 seconds...", PATH_LOADER_EFI);
- DSTALL(1000000);
- DPRINTF(".");
- DSTALL(1000000);
- DPRINTF(".");
- DSTALL(1000000);
- DPRINTF(".");
- DSTALL(1000000);
- DPRINTF(".");
- DSTALL(1000000);
- DPRINTF(".\n");
-
- if ((status = BS->StartImage(loaderhandle, NULL, NULL)) !=
- EFI_SUCCESS) {
- printf("Failed to start image provided by %s (%lu)\n",
- mod->name, EFI_ERROR_CODE(status));
- loaded_image->LoadOptionsSize = 0;
- loaded_image->LoadOptions = NULL;
- }
-
-errout:
- if (cmd != NULL)
- free(cmd);
- if (buf != NULL)
- free(buf);
- if (loaderbuf != NULL)
- free(loaderbuf);
-
- return (status);
-}
-
-/*
- * probe_handle determines if the passed handle represents a logical partition
- * if it does it uses each module in order to probe it and if successful it
- * returns EFI_SUCCESS.
- */
-static EFI_STATUS
-probe_handle(EFI_HANDLE h, EFI_DEVICE_PATH *imgpath, BOOLEAN *preferred)
-{
- dev_info_t *devinfo;
- EFI_BLOCK_IO *blkio = NULL;
- EFI_DEVICE_PATH *devpath, *dp;
- HARDDRIVE_DEVICE_PATH *hd;
- EFI_STATUS status;
- extern UINT64 start_sector; /* from multiboot.S */
- UINTN i;
-
- /* Figure out if we're dealing with an actual partition. */
- status = BS->HandleProtocol(h, &DevicePathGUID, (void **)&devpath);
- if (status == EFI_UNSUPPORTED)
- return (status);
-
- if (status != EFI_SUCCESS) {
- DPRINTF("\nFailed to query DevicePath (%lu)\n",
- EFI_ERROR_CODE(status));
- return (status);
- }
-
- DPRINTF("probing: %s\n", devpath_str(devpath));
-
- status = BS->HandleProtocol(h, &BlockIoProtocolGUID, (void **)&blkio);
- if (status == EFI_UNSUPPORTED)
- return (status);
-
- if (status != EFI_SUCCESS) {
- DPRINTF("\nFailed to query BlockIoProtocol (%lu)\n",
- EFI_ERROR_CODE(status));
- return (status);
- }
-
- if (!blkio->Media->LogicalPartition)
- return (EFI_UNSUPPORTED);
-
- *preferred = device_paths_match(imgpath, devpath);
-
- /*
- * This is the boot device. Check for the start of the partition.
- * If it does not match what is specified in the stage1 loader then
- * this is not our preferred device.
- */
- if (*preferred == TRUE && start_sector != 0) {
- dp = devpath_last(devpath);
-
- if (dp != NULL &&
- dp->Type == MEDIA_DEVICE_PATH &&
- dp->SubType == MEDIA_HARDDRIVE_DP) {
- hd = (HARDDRIVE_DEVICE_PATH *)dp;
- if (hd->PartitionStart != start_sector)
- *preferred = FALSE;
- }
- }
-
- /* Run through each module, see if it can load this partition */
- for (i = 0; i < NUM_BOOT_MODULES; i++) {
- if ((status = BS->AllocatePool(EfiLoaderData,
- sizeof(*devinfo), (void **)&devinfo)) !=
- EFI_SUCCESS) {
- DPRINTF("\nFailed to allocate devinfo (%lu)\n",
- EFI_ERROR_CODE(status));
- continue;
- }
- devinfo->dev = blkio;
- devinfo->devpath = devpath;
- devinfo->devhandle = h;
- devinfo->devdata = NULL;
- devinfo->preferred = *preferred;
- devinfo->next = NULL;
-
- status = boot_modules[i]->probe(devinfo);
- if (status == EFI_SUCCESS)
- return (EFI_SUCCESS);
- (void)BS->FreePool(devinfo);
- }
-
- return (EFI_UNSUPPORTED);
-}
-
-/*
- * probe_handle_status calls probe_handle and outputs the returned status
- * of the call.
- */
-static void
-probe_handle_status(EFI_HANDLE h, EFI_DEVICE_PATH *imgpath)
-{
- EFI_STATUS status;
- BOOLEAN preferred = false;
-
- status = probe_handle(h, imgpath, &preferred);
-
- DPRINTF("probe: ");
- switch (status) {
- case EFI_UNSUPPORTED:
- printf(".");
- DPRINTF(" not supported\n");
- break;
- case EFI_SUCCESS:
- if (preferred) {
- printf("%c", '*');
- DPRINTF(" supported (preferred)\n");
- } else {
- printf("%c", '+');
- DPRINTF(" supported\n");
- }
- break;
- default:
- printf("x");
- DPRINTF(" error (%lu)\n", EFI_ERROR_CODE(status));
- break;
- }
- DSTALL(500000);
-}
-
-EFI_STATUS
-efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE *Xsystab)
-{
- EFI_HANDLE *handles;
- EFI_LOADED_IMAGE *img;
- EFI_DEVICE_PATH *imgpath;
- EFI_STATUS status;
- EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl = NULL;
- SIMPLE_TEXT_OUTPUT_INTERFACE *conout = NULL;
- UINTN i, max_dim, best_mode, cols, rows, hsize, nhandles;
-
- /* Basic initialization*/
- ST = Xsystab;
- IH = Ximage;
- BS = Xsystab->BootServices;
- RS = Xsystab->RuntimeServices;
-
- /* Set up the console, so printf works. */
- status = BS->LocateProtocol(&ConsoleControlGUID, NULL,
- (VOID **)&ConsoleControl);
- if (status == EFI_SUCCESS)
- (void)ConsoleControl->SetMode(ConsoleControl,
- EfiConsoleControlScreenText);
- /*
- * Reset the console and find the best text mode.
- */
- conout = ST->ConOut;
- conout->Reset(conout, TRUE);
- max_dim = best_mode = 0;
- for (i = 0; i < conout->Mode->MaxMode; i++) {
- status = conout->QueryMode(conout, i, &cols, &rows);
- if (EFI_ERROR(status))
- continue;
- if (cols * rows > max_dim) {
- max_dim = cols * rows;
- best_mode = i;
- }
- }
- if (max_dim > 0)
- conout->SetMode(conout, best_mode);
- conout->EnableCursor(conout, TRUE);
- conout->ClearScreen(conout);
-
- printf("\n>> illumos EFI boot block\n");
- printf(" Loader path: %s\n\n", PATH_LOADER_EFI);
- printf(" Initializing modules:");
- for (i = 0; i < NUM_BOOT_MODULES; i++) {
- printf(" %s", boot_modules[i]->name);
- if (boot_modules[i]->init != NULL)
- boot_modules[i]->init();
- }
- putchar('\n');
-
- /* Get all the device handles */
- hsize = (UINTN)NUM_HANDLES_INIT * sizeof(EFI_HANDLE);
- if ((status = BS->AllocatePool(EfiLoaderData, hsize, (void **)&handles))
- != EFI_SUCCESS)
- panic("Failed to allocate %d handles (%lu)", NUM_HANDLES_INIT,
- EFI_ERROR_CODE(status));
-
- status = BS->LocateHandle(ByProtocol, &BlockIoProtocolGUID, NULL,
- &hsize, handles);
- switch (status) {
- case EFI_SUCCESS:
- break;
- case EFI_BUFFER_TOO_SMALL:
- (void)BS->FreePool(handles);
- if ((status = BS->AllocatePool(EfiLoaderData, hsize,
- (void **)&handles)) != EFI_SUCCESS) {
- panic("Failed to allocate %zu handles (%lu)", hsize /
- sizeof(*handles), EFI_ERROR_CODE(status));
- }
- status = BS->LocateHandle(ByProtocol, &BlockIoProtocolGUID,
- NULL, &hsize, handles);
- if (status != EFI_SUCCESS)
- panic("Failed to get device handles (%lu)\n",
- EFI_ERROR_CODE(status));
- break;
- default:
- panic("Failed to get device handles (%lu)",
- EFI_ERROR_CODE(status));
- }
-
- /* Scan all partitions, probing with all modules. */
- nhandles = hsize / sizeof(*handles);
- printf(" Probing %zu block devices...", nhandles);
- DPRINTF("\n");
-
- /* Determine the devpath of our image so we can prefer it. */
- status = BS->HandleProtocol(IH, &LoadedImageGUID, (VOID**)&img);
- imgpath = NULL;
- if (status == EFI_SUCCESS) {
- status = BS->HandleProtocol(img->DeviceHandle, &DevicePathGUID,
- (void **)&imgpath);
- if (status != EFI_SUCCESS)
- DPRINTF("Failed to get image DevicePath (%lu)\n",
- EFI_ERROR_CODE(status));
- DPRINTF("boot1 imagepath: %s\n", devpath_str(imgpath));
- }
-
- for (i = 0; i < nhandles; i++)
- probe_handle_status(handles[i], imgpath);
- printf(" done\n");
-
- /* Status summary. */
- for (i = 0; i < NUM_BOOT_MODULES; i++) {
- printf(" ");
- boot_modules[i]->status();
- }
-
- try_boot();
-
- /* If we get here, we're out of luck... */
- panic("No bootable partitions found!");
-}
-
-/*
- * add_device adds a device to the passed devinfo list.
- */
-void
-add_device(dev_info_t **devinfop, dev_info_t *devinfo)
-{
- dev_info_t *dev;
-
- if (*devinfop == NULL) {
- *devinfop = devinfo;
- return;
- }
-
- for (dev = *devinfop; dev->next != NULL; dev = dev->next)
- ;
-
- dev->next = devinfo;
-}
-
-void
-panic(const char *fmt, ...)
-{
- va_list ap;
-
- printf("panic: ");
- va_start(ap, fmt);
- vprintf(fmt, ap);
- va_end(ap);
- printf("\n");
-
- while (1) {}
-}
-
-void
-putchar(int c)
-{
- CHAR16 buf[2];
-
- if (c == '\n') {
- buf[0] = '\r';
- buf[1] = 0;
- ST->ConOut->OutputString(ST->ConOut, buf);
- }
- buf[0] = c;
- buf[1] = 0;
- ST->ConOut->OutputString(ST->ConOut, buf);
-}
-
-int
-getchar(void)
-{
- EFI_INPUT_KEY key;
- EFI_STATUS status;
- UINTN junk;
-
- status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key);
- if (status == EFI_NOT_READY) {
- BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &junk);
- status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key);
- }
- return (key.UnicodeChar);
-}
diff --git a/usr/src/boot/sys/boot/efi/boot1/boot_module.h b/usr/src/boot/sys/boot/efi/boot1/boot_module.h
deleted file mode 100644
index 30ecd30d9c..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/boot_module.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * Copyright (c) 2015 Eric McCorkle
- * All rights reserved.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
- *
- * $FreeBSD$
- */
-
-#ifndef _BOOT_MODULE_H_
-#define _BOOT_MODULE_H_
-
-#include <stdbool.h>
-
-#include <efi.h>
-#include <efilib.h>
-#include <eficonsctl.h>
-
-#ifdef EFI_DEBUG
-#define DPRINTF(fmt, args...) printf(fmt, ##args)
-#define DSTALL(d) BS->Stall(d)
-#else
-#define DPRINTF(fmt, ...) {}
-#define DSTALL(d) {}
-#endif
-
-/* EFI device info */
-typedef struct dev_info
-{
- EFI_BLOCK_IO *dev;
- EFI_DEVICE_PATH *devpath;
- EFI_HANDLE *devhandle;
- void *devdata;
- BOOLEAN preferred;
- struct dev_info *next;
-} dev_info_t;
-
-/*
- * A boot loader module.
- *
- * This is a standard interface for filesystem modules in the EFI system.
- */
-typedef struct boot_module_t
-{
- const char *name;
-
- /* init is the optional initialiser for the module. */
- void (*init)(void);
-
- /*
- * probe checks to see if the module can handle dev.
- *
- * Return codes:
- * EFI_SUCCESS = The module can handle the device.
- * EFI_NOT_FOUND = The module can not handle the device.
- * Other = The module encountered an error.
- */
- EFI_STATUS (*probe)(dev_info_t* dev);
-
- /*
- * load should select the best out of a set of devices that probe
- * indicated were loadable and load the specified file.
- *
- * Return codes:
- * EFI_SUCCESS = The module can handle the device.
- * EFI_NOT_FOUND = The module can not handle the device.
- * Other = The module encountered an error.
- */
- EFI_STATUS (*load)(const char *filepath, dev_info_t *devinfo,
- void **buf, size_t *bufsize);
-
- /* status outputs information about the probed devices. */
- void (*status)(void);
-
- /* valid devices as found by probe. */
- dev_info_t *(*devices)(void);
-} boot_module_t;
-
-/* Standard boot modules. */
-extern const boot_module_t ufs_module;
-extern const boot_module_t zfs_module;
-
-/* Functions available to modules. */
-extern void add_device(dev_info_t **devinfop, dev_info_t *devinfo);
-
-extern int devpath_strlcat(char *buf, size_t size, EFI_DEVICE_PATH *devpath);
-extern char *devpath_str(EFI_DEVICE_PATH *devpath);
-#endif
diff --git a/usr/src/boot/sys/boot/efi/boot1/i386/Makefile b/usr/src/boot/sys/boot/efi/boot1/i386/Makefile
deleted file mode 100644
index 4d01edc6fa..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/i386/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# This file and its contents are supplied under the terms of the
-# Common Development and Distribution License ("CDDL"), version 1.0.
-# You may only use this file in accordance with the terms of version
-# 1.0 of the CDDL.
-#
-# A full copy of the text of the CDDL should have accompanied this
-# source. A copy of the CDDL is also available via the Internet at
-# http://www.illumos.org/license/CDDL.
-#
-
-#
-# Copyright 2016 Toomas Soome <tsoome@me.com>
-# Copyright 2016 RackTop Systems.
-#
-
-MACHINE= $(MACH)
-ASFLAGS= -m32
-EFIPROG= bootia32.efi
-
-all: $(EFIPROG)
-
-include ../Makefile.com
-
-EFI_TARGET= pei-i386
-LDFLAGS += -znocombreloc
-
-CPPFLAGS += -DLOADER_EFI=\"loader32.efi\"
-CFLAGS += -m32
-
-CLEANFILES += machine x86
-
-$(OBJS): machine x86
diff --git a/usr/src/boot/sys/boot/efi/boot1/ufs_module.c b/usr/src/boot/sys/boot/efi/boot1/ufs_module.c
deleted file mode 100644
index 571e9514de..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/ufs_module.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/*-
- * Copyright (c) 1998 Robert Nordier
- * All rights reserved.
- * Copyright (c) 2001 Robert Drehmel
- * All rights reserved.
- * Copyright (c) 2014 Nathan Whitehorn
- * All rights reserved.
- * Copyright (c) 2015 Eric McCorkle
- * All rights reverved.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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 <stdarg.h>
-#include <stdbool.h>
-#include <sys/cdefs.h>
-#include <sys/param.h>
-#include <efi.h>
-
-#include "boot_module.h"
-
-static dev_info_t *devinfo;
-static dev_info_t *devices;
-
-static int
-dskread(void *buf, u_int64_t lba, int nblk)
-{
- int size;
- EFI_STATUS status;
-
- lba = lba / (devinfo->dev->Media->BlockSize / DEV_BSIZE);
- size = nblk * DEV_BSIZE;
-
- status = devinfo->dev->ReadBlocks(devinfo->dev,
- devinfo->dev->Media->MediaId, lba, size, buf);
-
- if (status != EFI_SUCCESS) {
- DPRINTF("dskread: failed dev: %p, id: %u, lba: %ju, size: %d, "
- "status: %lu\n", devinfo->dev,
- devinfo->dev->Media->MediaId, (uintmax_t)lba, size,
- EFI_ERROR_CODE(status));
- return (-1);
- }
-
- return (0);
-}
-
-#include "ufsread.c"
-
-static struct dmadat __dmadat;
-
-static int
-init_dev(dev_info_t* dev)
-{
-
- devinfo = dev;
- dmadat = &__dmadat;
-
- return fsread(0, NULL, 0);
-}
-
-static EFI_STATUS
-probe(dev_info_t* dev)
-{
-
- if (init_dev(dev) < 0)
- return (EFI_UNSUPPORTED);
-
- add_device(&devices, dev);
-
- return (EFI_SUCCESS);
-}
-
-static EFI_STATUS
-load(const char *filepath, dev_info_t *dev, void **bufp, size_t *bufsize)
-{
- ufs_ino_t ino;
- EFI_STATUS status;
- size_t size;
- ssize_t read;
- void *buf;
-
- DPRINTF("Loading '%s' from %s\n", filepath, devpath_str(dev->devpath));
-
- if (init_dev(dev) < 0) {
- DPRINTF("Failed to init device\n");
- return (EFI_UNSUPPORTED);
- }
-
- if ((ino = lookup(filepath)) == 0) {
- DPRINTF("Failed to lookup '%s' (file not found?)\n", filepath);
- return (EFI_NOT_FOUND);
- }
-
- if (fsread_size(ino, NULL, 0, &size) < 0 || size <= 0) {
- printf("Failed to read size of '%s' ino: %d\n", filepath, ino);
- return (EFI_INVALID_PARAMETER);
- }
-
- if ((status = BS->AllocatePool(EfiLoaderData, size, &buf)) !=
- EFI_SUCCESS) {
- printf("Failed to allocate read buffer %zu for '%s' (%lu)\n",
- size, filepath, EFI_ERROR_CODE(status));
- return (status);
- }
-
- read = fsread(ino, buf, size);
- if ((size_t)read != size) {
- printf("Failed to read '%s' (%zd != %zu)\n", filepath, read,
- size);
- (void)BS->FreePool(buf);
- return (EFI_INVALID_PARAMETER);
- }
-
- DPRINTF("Load complete\n");
-
- *bufp = buf;
- *bufsize = size;
-
- return (EFI_SUCCESS);
-}
-
-static void
-status(void)
-{
- int i;
- dev_info_t *dev;
-
- for (dev = devices, i = 0; dev != NULL; dev = dev->next, i++)
- ;
-
- printf("%s found ", ufs_module.name);
- switch (i) {
- case 0:
- printf("no partitions\n");
- break;
- case 1:
- printf("%d partition\n", i);
- break;
- default:
- printf("%d partitions\n", i);
- }
-}
-
-static dev_info_t *
-_devices(void)
-{
-
- return (devices);
-}
-
-const boot_module_t ufs_module =
-{
- .name = "UFS",
- .probe = probe,
- .load = load,
- .status = status,
- .devices = _devices
-};
diff --git a/usr/src/boot/sys/boot/efi/boot1/zfs_module.c b/usr/src/boot/sys/boot/efi/boot1/zfs_module.c
deleted file mode 100644
index 6617e417df..0000000000
--- a/usr/src/boot/sys/boot/efi/boot1/zfs_module.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*-
- * Copyright (c) 2015 Eric McCorkle
- * All rights reserved.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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 <stddef.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <sys/cdefs.h>
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <efi.h>
-
-#include "boot_module.h"
-
-#include "libzfs.h"
-#include "zfsimpl.c"
-
-static dev_info_t *devices;
-
-uint64_t
-ldi_get_size(void *priv)
-{
- dev_info_t *devinfo = priv;
-
- return (devinfo->dev->Media->BlockSize *
- (devinfo->dev->Media->LastBlock + 1));
-}
-
-static int
-vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes)
-{
- dev_info_t *devinfo;
- uint64_t lba;
- size_t size, remainder, rb_size, blksz;
- char *bouncebuf = NULL, *rb_buf;
- EFI_STATUS status;
-
- devinfo = (dev_info_t *)priv;
- lba = off / devinfo->dev->Media->BlockSize;
- remainder = off % devinfo->dev->Media->BlockSize;
-
- rb_buf = buf;
- rb_size = bytes;
-
- /*
- * If we have remainder from off, we need to add remainder part.
- * Since buffer must be multiple of the BlockSize, round it all up.
- */
- size = roundup2(bytes + remainder, devinfo->dev->Media->BlockSize);
- blksz = size;
- if (remainder != 0 || size != bytes) {
- rb_size = devinfo->dev->Media->BlockSize;
- bouncebuf = malloc(rb_size);
- if (bouncebuf == NULL) {
- printf("vdev_read: out of memory\n");
- return (-1);
- }
- rb_buf = bouncebuf;
- blksz = rb_size - remainder;
- }
-
- while (bytes > 0) {
- status = devinfo->dev->ReadBlocks(devinfo->dev,
- devinfo->dev->Media->MediaId, lba, rb_size, rb_buf);
- if (status != EFI_SUCCESS)
- goto error;
- if (bytes < blksz)
- blksz = bytes;
- if (bouncebuf != NULL)
- memcpy(buf, rb_buf + remainder, blksz);
- buf = (void *)((uintptr_t)buf + blksz);
- bytes -= blksz;
- lba++;
- remainder = 0;
- blksz = rb_size;
- }
-
- free(bouncebuf);
- return (0);
-
-error:
- free(bouncebuf);
- DPRINTF("vdev_read: failed dev: %p, id: %u, lba: %ju, size: %zu,"
- " rb_size: %zu, status: %lu\n", devinfo->dev,
- devinfo->dev->Media->MediaId, (uintmax_t)lba, bytes, rb_size,
- EFI_ERROR_CODE(status));
- return (-1);
-}
-
-static EFI_STATUS
-probe(dev_info_t *dev)
-{
- spa_t *spa;
- dev_info_t *tdev;
- EFI_STATUS status;
-
- /* ZFS consumes the dev on success so we need a copy. */
- if ((status = BS->AllocatePool(EfiLoaderData, sizeof(*dev),
- (void**)&tdev)) != EFI_SUCCESS) {
- DPRINTF("Failed to allocate tdev (%lu)\n",
- EFI_ERROR_CODE(status));
- return (status);
- }
- memcpy(tdev, dev, sizeof(*dev));
-
- if (vdev_probe(vdev_read, tdev, &spa) != 0) {
- (void)BS->FreePool(tdev);
- return (EFI_UNSUPPORTED);
- }
-
- dev->devdata = spa;
- add_device(&devices, dev);
-
- return (EFI_SUCCESS);
-}
-
-static EFI_STATUS
-load(const char *filepath, dev_info_t *devinfo, void **bufp, size_t *bufsize)
-{
- spa_t *spa;
- struct zfsmount zfsmount;
- dnode_phys_t dn;
- struct stat st;
- int err;
- void *buf;
- EFI_STATUS status;
-
- spa = devinfo->devdata;
-
- DPRINTF("load: '%s' spa: '%s', devpath: %s\n", filepath, spa->spa_name,
- devpath_str(devinfo->devpath));
-
- if ((err = zfs_spa_init(spa)) != 0) {
- DPRINTF("Failed to load pool '%s' (%d)\n", spa->spa_name, err);
- return (EFI_NOT_FOUND);
- }
-
- if ((err = zfs_mount(spa, 0, &zfsmount)) != 0) {
- DPRINTF("Failed to mount pool '%s' (%d)\n", spa->spa_name, err);
- return (EFI_NOT_FOUND);
- }
-
- if ((err = zfs_lookup(&zfsmount, filepath, &dn)) != 0) {
- if (err == ENOENT) {
- DPRINTF("Failed to find '%s' on pool '%s' (%d)\n",
- filepath, spa->spa_name, err);
- return (EFI_NOT_FOUND);
- }
- printf("Failed to lookup '%s' on pool '%s' (%d)\n", filepath,
- spa->spa_name, err);
- return (EFI_INVALID_PARAMETER);
- }
-
- if ((err = zfs_dnode_stat(spa, &dn, &st)) != 0) {
- printf("Failed to stat '%s' on pool '%s' (%d)\n", filepath,
- spa->spa_name, err);
- return (EFI_INVALID_PARAMETER);
- }
-
- if ((status = BS->AllocatePool(EfiLoaderData, (UINTN)st.st_size, &buf))
- != EFI_SUCCESS) {
- printf("Failed to allocate load buffer %zd for pool '%s' "
- "for '%s' (%lu)\n", (ssize_t)st.st_size, spa->spa_name,
- filepath, EFI_ERROR_CODE(status));
- return (EFI_INVALID_PARAMETER);
- }
-
- if ((err = dnode_read(spa, &dn, 0, buf, st.st_size)) != 0) {
- printf("Failed to read node from %s (%d)\n", spa->spa_name,
- err);
- (void)BS->FreePool(buf);
- return (EFI_INVALID_PARAMETER);
- }
-
- *bufsize = st.st_size;
- *bufp = buf;
-
- return (EFI_SUCCESS);
-}
-
-static void
-status(void)
-{
- spa_t *spa;
-
- spa = STAILQ_FIRST(&zfs_pools);
- if (spa == NULL) {
- printf("%s found no pools\n", zfs_module.name);
- return;
- }
-
- printf("%s found the following pools:", zfs_module.name);
- STAILQ_FOREACH(spa, &zfs_pools, spa_link)
- printf(" %s", spa->spa_name);
-
- printf("\n");
-}
-
-static void
-init(void)
-{
-
- zfs_init();
-}
-
-static dev_info_t *
-_devices(void)
-{
-
- return (devices);
-}
-
-const boot_module_t zfs_module =
-{
- .name = "ZFS",
- .init = init,
- .probe = probe,
- .load = load,
- .status = status,
- .devices = _devices
-};
diff --git a/usr/src/pkg/manifests/system-boot-loader.mf b/usr/src/pkg/manifests/system-boot-loader.mf
index ce0af6a4f7..22d5337392 100644
--- a/usr/src/pkg/manifests/system-boot-loader.mf
+++ b/usr/src/pkg/manifests/system-boot-loader.mf
@@ -43,8 +43,6 @@ $(i386_ONLY)dir path=usr/share/man
$(i386_ONLY)dir path=usr/share/man/man3
$(i386_ONLY)dir path=usr/share/man/man4
$(i386_ONLY)dir path=usr/share/man/man5
-$(i386_ONLY)file path=boot/bootia32.efi group=sys mode=0555
-$(i386_ONLY)file path=boot/bootx64.efi group=sys mode=0555
$(i386_ONLY)file path=boot/cdboot group=sys mode=0444
$(i386_ONLY)file path=boot/defaults/loader.conf group=sys mode=0444
$(i386_ONLY)file path=boot/forth/beadm.4th group=sys mode=0444