199767f8919635c4928607450d9e0abb932109ceToomas Soome * Copyright (c) 2008-2010 Rui Paulo
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Copyright (c) 2006 Marcel Moolenaar
199767f8919635c4928607450d9e0abb932109ceToomas Soome * All rights reserved.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Redistribution and use in source and binary forms, with or without
199767f8919635c4928607450d9e0abb932109ceToomas Soome * modification, are permitted provided that the following conditions
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 1. Redistributions of source code must retain the above copyright
199767f8919635c4928607450d9e0abb932109ceToomas Soome * notice, this list of conditions and the following disclaimer.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * 2. Redistributions in binary form must reproduce the above copyright
199767f8919635c4928607450d9e0abb932109ceToomas Soome * notice, this list of conditions and the following disclaimer in the
199767f8919635c4928607450d9e0abb932109ceToomas Soome * documentation and/or other materials provided with the distribution.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
199767f8919635c4928607450d9e0abb932109ceToomas Soome * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
199767f8919635c4928607450d9e0abb932109ceToomas Soome * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
199767f8919635c4928607450d9e0abb932109ceToomas Soome * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
199767f8919635c4928607450d9e0abb932109ceToomas Soome * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
199767f8919635c4928607450d9e0abb932109ceToomas Soome * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
199767f8919635c4928607450d9e0abb932109ceToomas Soome * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
199767f8919635c4928607450d9e0abb932109ceToomas Soome * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
199767f8919635c4928607450d9e0abb932109ceToomas Soome * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
199767f8919635c4928607450d9e0abb932109ceToomas Soomestruct arch_switch archsw; /* MI/MD interface boundary */
199767f8919635c4928607450d9e0abb932109ceToomas SoomeEFI_GUID memtype = MEMORY_TYPE_INFORMATION_TABLE_GUID;
199767f8919635c4928607450d9e0abb932109ceToomas SoomeEFI_GUID debugimg = DEBUG_IMAGE_INFO_TABLE_GUID;
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic void efi_zfs_probe(void);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Need this because EFI uses UTF-16 unicode string constants, but we
199767f8919635c4928607450d9e0abb932109ceToomas Soome * use UTF-8. We can't use printf due to the possiblity of \0 and we
199767f8919635c4928607450d9e0abb932109ceToomas Soome * don't support support wide characters either.
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; str[i]; i++)
199767f8919635c4928607450d9e0abb932109ceToomas Soomecp16to8(const CHAR16 *src, char *dst, size_t len)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Find all the handles that support the SIMPLE_TEXT_INPUT_PROTOCOL and
199767f8919635c4928607450d9e0abb932109ceToomas Soome * do the typical dance to get the right sized buffer.
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->LocateHandle(ByProtocol, &inputid, 0, &sz, 0);
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->LocateHandle(ByProtocol, &inputid, 0, &sz,
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Look at each of the handles. If it supports the device path protocol,
199767f8919635c4928607450d9e0abb932109ceToomas Soome * use it to get the device path for this handle. Then see if that
199767f8919635c4928607450d9e0abb932109ceToomas Soome * device path matches either the USB device path for keyboards or the
199767f8919635c4928607450d9e0abb932109ceToomas Soome * legacy device path for keyboards.
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (walker = hin; walker < hin_end; walker++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->HandleProtocol(*walker, &devid, (VOID **)&path);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Check for the ACPI keyboard node. All PNP3xx nodes
199767f8919635c4928607450d9e0abb932109ceToomas Soome * are keyboards of different flavors. Note: It is
199767f8919635c4928607450d9e0abb932109ceToomas Soome * unclear of there's always a keyboard node when
199767f8919635c4928607450d9e0abb932109ceToomas Soome * there's a keyboard controller, or if there's only one
199767f8919635c4928607450d9e0abb932109ceToomas Soome * when a keyboard is detected at boot.
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (DevicePathType(path) == ACPI_DEVICE_PATH &&
199767f8919635c4928607450d9e0abb932109ceToomas Soome DevicePathSubType(path) == ACPI_EXTENDED_DP)) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if ((EISA_ID_TO_NUM(acpi->HID) & 0xff00) == 0x300 &&
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Check for USB keyboard node, if present. Unlike a
199767f8919635c4928607450d9e0abb932109ceToomas Soome * PS/2 keyboard, these definitely only appear when
199767f8919635c4928607450d9e0abb932109ceToomas Soome * connected to the system.
199767f8919635c4928607450d9e0abb932109ceToomas Soome } else if (DevicePathType(path) == MESSAGING_DEVICE_PATH &&
199767f8919635c4928607450d9e0abb932109ceToomas Soome usb->DeviceProtocol == 1) { /* Boot keyboards */
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* Note this needs to be set before ZFS init. */
199767f8919635c4928607450d9e0abb932109ceToomas Soome * XXX Chicken-and-egg problem; we want to have console output
199767f8919635c4928607450d9e0abb932109ceToomas Soome * early, but some console attributes may depend on reading from
199767f8919635c4928607450d9e0abb932109ceToomas Soome * eg. the boot device, which we can't do yet. We can use
199767f8919635c4928607450d9e0abb932109ceToomas Soome * printf() etc. once this is done.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Initialise the block cache. Set the upper limit.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Parse the args to set the console settings, etc
199767f8919635c4928607450d9e0abb932109ceToomas Soome * boot1.efi passes these in, if it can read /boot.config or /boot/config
199767f8919635c4928607450d9e0abb932109ceToomas Soome * or iPXE may be setup to pass these in.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Loop through the args, and for each one that contains an '=' that is
199767f8919635c4928607450d9e0abb932109ceToomas Soome * not the first character, add it to the environment. This allows
199767f8919635c4928607450d9e0abb932109ceToomas Soome * loader and kernel env vars to be passed on the command line. Convert
199767f8919635c4928607450d9e0abb932109ceToomas Soome * args from UCS-2 to ASCII (16 to 8 bit) as they are copied.
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (j = 0; argv[i][j] != 0; j++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (j == sizeof(var)) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome * March through the device switch probing for things.
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* Get our loaded image protocol interface structure. */
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < argc; i++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("Image base: 0x%lx\n", (u_long)img->ImageBase);
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("EFI version: %d.%02d\n", ST->Hdr.Revision >> 16,
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* printf doesn't understand EFI Unicode */
199767f8919635c4928607450d9e0abb932109ceToomas Soome ST->ConOut->OutputString(ST->ConOut, ST->FirmwareVendor);
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf(" (rev %d.%02d)\n", ST->FirmwareRevision >> 16,
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("(%s, %s)\n", bootprog_maker, bootprog_date);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Disable the watchdog timer. By default the boot manager sets
199767f8919635c4928607450d9e0abb932109ceToomas Soome * the timer to 5 minutes before invoking a boot option. If we
199767f8919635c4928607450d9e0abb932109ceToomas Soome * want to return to the boot manager, we have to disable the
199767f8919635c4928607450d9e0abb932109ceToomas Soome * watchdog timer and since we're an interactive program, we don't
199767f8919635c4928607450d9e0abb932109ceToomas Soome * want to wait until the user types "quit". The timer may have
199767f8919635c4928607450d9e0abb932109ceToomas Soome * fired by then. We don't care if this fails. It does not prevent
199767f8919635c4928607450d9e0abb932109ceToomas Soome * normal functioning in any way...
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (efi_handle_lookup(img->DeviceHandle, &dev, &unit, &pool_guid) != 0)
199767f8919635c4928607450d9e0abb932109ceToomas Soome env_setenv("currdev", EV_VOLATILE, efi_fmtdev(&currdev),
199767f8919635c4928607450d9e0abb932109ceToomas Soome env_setenv("loaddev", EV_VOLATILE, efi_fmtdev(&currdev), env_noset,
199767f8919635c4928607450d9e0abb932109ceToomas Soome env_setenv("currdev", EV_VOLATILE, efi_fmtdev(&currdev),
199767f8919635c4928607450d9e0abb932109ceToomas Soome env_setenv("loaddev", EV_VOLATILE, efi_fmtdev(&currdev), env_noset,
199767f8919635c4928607450d9e0abb932109ceToomas Soome setenv("ISADIR", "amd64", 1); /* we only build 64bit */
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (k = 0; k < ST->NumberOfTableEntries; k++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (!memcmp(guid, &smbios, sizeof(EFI_GUID)) ||
199767f8919635c4928607450d9e0abb932109ceToomas Soome smbios_detect(ST->ConfigurationTable[k].VendorTable);
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (!memcmp(guid, &acpi20, sizeof(EFI_GUID))) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome acpi_detect(ST->ConfigurationTable[k].VendorTable);
199767f8919635c4928607450d9e0abb932109ceToomas Soome efi_serial_init(); /* detect and set up serial ports */
199767f8919635c4928607450d9e0abb932109ceToomas Soome return (EFI_SUCCESS); /* keep compiler happy */
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(reboot, "reboot", "reboot the system", command_reboot);
199767f8919635c4928607450d9e0abb932109ceToomas Soome RS->ResetSystem(EfiResetCold, EFI_SUCCESS, 23, (CHAR16 *)msg);
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* NOTREACHED */
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(memmap, "memmap", "print memory map", command_memmap);
199767f8919635c4928607450d9e0abb932109ceToomas Soome "LoaderCode",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "LoaderData",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "BootServicesCode",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "BootServicesData",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "RuntimeServicesCode",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "RuntimeServicesData",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "ConventionalMemory",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "UnusableMemory",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "ACPIReclaimMemory",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "ACPIMemoryNVS",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "MemoryMappedIO",
199767f8919635c4928607450d9e0abb932109ceToomas Soome "MemoryMappedIOPortSpace",
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->GetMemoryMap(&sz, 0, &key, &dsz, &dver);
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->GetMemoryMap(&sz, map, &key, &dsz, &dver);
199767f8919635c4928607450d9e0abb932109ceToomas Soome "Type", "Physical", "Virtual", "#Pages", "Attr");
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(line, 80, "%23s %012lx %012lx %08lx ",
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(configuration, "configuration", "print configuration tables",
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic const char *
199767f8919635c4928607450d9e0abb932109ceToomas Soome sprintf(buf, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
199767f8919635c4928607450d9e0abb932109ceToomas Soome guid->Data1, guid->Data2, guid->Data3, guid->Data4[0],
199767f8919635c4928607450d9e0abb932109ceToomas Soome guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4],
199767f8919635c4928607450d9e0abb932109ceToomas Soome guid->Data4[5], guid->Data4[6], guid->Data4[7]);
199767f8919635c4928607450d9e0abb932109ceToomas Soomecommand_configuration(int argc __attribute((unused)),
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < ST->NumberOfTableEntries; i++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &acpi, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &acpi20, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &smbios, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &smbios3, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &dxe, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &hoblist, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &memtype, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &debugimg, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome else if (!memcmp(guid, &fdtdtb, sizeof(EFI_GUID)))
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("Unknown Table (%s)", guid_to_string(guid));
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf(" at %p\n", ST->ConfigurationTable[i].VendorTable);
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(mode, "mode", "change or display EFI text modes", command_mode);
199767f8919635c4928607450d9e0abb932109ceToomas Soome extern void HO(void);
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = conout->QueryMode(conout, mode, &cols, &rows);
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("Current mode: %d\n", conout->Mode->Mode);
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = conout->QueryMode(conout, i, &cols, &rows);
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("Mode %d: %u columns, %u rows\n", i, (unsigned)cols,
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf("Select a mode with the command \"mode <number>\"\n");
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(nvram, "nvram", "get NVRAM variables", command_nvram);
199767f8919635c4928607450d9e0abb932109ceToomas Soome EFI_GUID varguid = { 0,0,0,{0,0,0,0,0,0,0,0} };
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (status = RS->GetNextVariableName(&varsz, var, &varguid);
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = RS->GetNextVariableName(&varsz, var, &varguid)) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome * as term emu is keeping track on cursor, use putchar().
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; var[i] != 0; i++)
199767f8919635c4928607450d9e0abb932109ceToomas Soome varsz = 128; /* GetNextVariableName() did change it. */
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = RS->GetVariable(var, &varguid, &attr, &datasz, NULL);
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = RS->GetVariable(var, &varguid, &attr, &datasz, data);
199767f8919635c4928607450d9e0abb932109ceToomas Soome if (attr & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS)
199767f8919635c4928607450d9e0abb932109ceToomas Soome EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)
199767f8919635c4928607450d9e0abb932109ceToomas Soome printf(": DataLength: %lld", (long long)datasz);
199767f8919635c4928607450d9e0abb932109ceToomas Soome { UNICODE_COLLATION_PROTOCOL, "unicode collation" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_UNICODE_COLLATION2_PROTOCOL_GUID, "unicode collation2" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_SIMPLE_NETWORK_PROTOCOL, "simple network" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { SIMPLE_TEXT_OUTPUT_PROTOCOL, "simple text output" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { SIMPLE_TEXT_INPUT_PROTOCOL, "simple text input" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID, "simple text ex input" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_CONSOLE_CONTROL_PROTOCOL_GUID, "console control" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_PXE_BASE_CODE_PROTOCOL, "PXE base code" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL, "PXE base code callback" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome "loaded image device path" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_IDE_CONTROLLER_INIT_PROTOCOL_GUID, "IDE controller init" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_PCI_ENUMERATION_COMPLETE_GUID, "PCI enumeration" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DRIVER_DIAGNOSTICS_PROTOCOL_GUID, "Driver diagnostics" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DRIVER_DIAGNOSTICS2_PROTOCOL_GUID, "Driver diagnostics2" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_SIMPLE_POINTER_PROTOCOL_GUID, "simple pointer" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_ABSOLUTE_POINTER_PROTOCOL_GUID, "absolute pointer" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_VLAN_CONFIG_PROTOCOL_GUID, "VLAN config" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_ARP_SERVICE_BINDING_PROTOCOL_GUID, "ARP service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_IP4_SERVICE_BINDING_PROTOCOL, "IPv4 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_IP4_CONFIG_PROTOCOL_GUID, "IPv4 config" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_IP6_SERVICE_BINDING_PROTOCOL, "IPv6 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_IP6_CONFIG_PROTOCOL_GUID, "IPv6 config" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_UDP4_SERVICE_BINDING_PROTOCOL, "UDPv4 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_UDP6_SERVICE_BINDING_PROTOCOL, "UDPv6 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_TCP4_SERVICE_BINDING_PROTOCOL, "TCPv4 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_TCP6_SERVICE_BINDING_PROTOCOL, "TCPv6 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_PART_TYPE_EFI_SYSTEM_PART_GUID, "EFI System partition" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_PART_TYPE_LEGACY_MBR_GUID, "MBR legacy" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_COMPONENT_NAME_PROTOCOL_GUID, "component name" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_COMPONENT_NAME2_PROTOCOL_GUID, "component name2" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DRIVER_BINDING_PROTOCOL_GUID, "driver binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DRIVER_CONFIGURATION_PROTOCOL_GUID, "driver configuration" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DRIVER_CONFIGURATION2_PROTOCOL_GUID, "driver configuration2" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DECOMPRESS_PROTOCOL_GUID, "decompress" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_EBC_INTERPRETER_PROTOCOL_GUID, "ebc interpreter" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome "network interface identifier" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_31,
199767f8919635c4928607450d9e0abb932109ceToomas Soome "network interface identifier_31" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_MANAGED_NETWORK_SERVICE_BINDING_PROTOCOL_GUID,
199767f8919635c4928607450d9e0abb932109ceToomas Soome "managed network service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_MANAGED_NETWORK_PROTOCOL_GUID, "managed network" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_FORM_BROWSER2_PROTOCOL_GUID, "form browser" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID, "HII config routing" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_HII_DATABASE_PROTOCOL_GUID, "HII database" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_HII_STRING_PROTOCOL_GUID, "HII string" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_HII_CONFIGURATION_ACCESS_PROTOCOL_GUID, "HII config" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_MTFTP4_SERVICE_BINDING_PROTOCOL_GUID, "MTFTP4 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_MTFTP6_SERVICE_BINDING_PROTOCOL_GUID, "MTFTP6 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DHCP4_SERVICE_BINDING_PROTOCOL_GUID, "DHCP4 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DHCP6_SERVICE_BINDING_PROTOCOL_GUID, "DHCP6 service binding" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_SCSI_PASS_THRU_PROTOCOL_GUID, "SCSI pass thru" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_EXT_SCSI_PASS_THRU_PROTOCOL_GUID, "SCSI pass thru ext" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_CAPSULE_ARCH_PROTOCOL_GUID, "Capsule arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_MONOTONIC_COUNTER_ARCH_PROTOCOL_GUID, "monotonic counter arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_REALTIME_CLOCK_ARCH_PROTOCOL_GUID, "realtime clock arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_VARIABLE_ARCH_PROTOCOL_GUID, "variable arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_VARIABLE_WRITE_ARCH_PROTOCOL_GUID, "variable write arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_WATCHDOG_TIMER_ARCH_PROTOCOL_GUID, "watchdog timer arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_MP_SERVICES_PROTOCOL_GUID, "MP services" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_ACPI_SUPPORT_PROTOCOL_GUID, "ACPI support" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_METRONOME_ARCH_PROTOCOL_GUID, "metronome arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_TIMER_ARCH_PROTOCOL_GUID, "timer arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID, "device path to text" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_RESET_ARCH_PROTOCOL_GUID, "reset arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_LEGACY_8259_PROTOCOL_GUID, "Legacy 8259" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_SECURITY_ARCH_PROTOCOL_GUID, "Security arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_SECURITY2_ARCH_PROTOCOL_GUID, "Security2 arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_RUNTIME_ARCH_PROTOCOL_GUID, "Runtime arch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID, "status code runtime" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID, "firmware volume block" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { EFI_FIRMWARE_VOLUME2_PROTOCOL_GUID, "firmware volume2" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome "firmware volume dispatch" },
199767f8919635c4928607450d9e0abb932109ceToomas Soome { { 0,0,0,{0,0,0,0,0,0,0,0} }, NULL } /* must be last entry */
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(lsefi, "lsefi", "list EFI handles", command_lsefi);
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->LocateHandle(AllHandles, NULL, NULL, &bufsz, buffer);
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(command_errbuf, sizeof (command_errbuf),
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->LocateHandle(AllHandles, NULL, NULL, &bufsz, buffer);
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(command_errbuf, sizeof (command_errbuf),
199767f8919635c4928607450d9e0abb932109ceToomas Soome "LocateHandle() error: %lld", (long long)status);
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < (bufsz / sizeof (EFI_HANDLE)); i++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome /* device path */
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->ProtocolsPerHandle(handle, &protocols, &nproto);
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(command_errbuf, sizeof (command_errbuf),
199767f8919635c4928607450d9e0abb932109ceToomas Soome "ProtocolsPerHandle() error: %lld",
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (j = 0; j < nproto; j++) {
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(lszfs, "lszfs", "list child datasets of a zfs dataset",
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(reloadbe, "reloadbe", "refresh the list of ZFS Boot Environments",
199767f8919635c4928607450d9e0abb932109ceToomas Soome#endif /* __FreeBSD__ */
199767f8919635c4928607450d9e0abb932109ceToomas Soome * get buffer size
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->LocateHandle(ByProtocol, &serial_io, NULL, &bufsz, buffer);
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(command_errbuf, sizeof (command_errbuf),
199767f8919635c4928607450d9e0abb932109ceToomas Soome * get handle array
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->LocateHandle(ByProtocol, &serial_io, NULL, &bufsz, buffer);
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(command_errbuf, sizeof (command_errbuf),
199767f8919635c4928607450d9e0abb932109ceToomas Soome "LocateHandle() error: %lld", (long long)status);
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; i < (bufsz / sizeof (EFI_HANDLE)); i++) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome status = BS->OpenProtocol(buffer[i], &serial_io, (void**)&sio,
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(command_errbuf, sizeof (command_errbuf),
199767f8919635c4928607450d9e0abb932109ceToomas Soome "OpenProtocol() error: %lld", (long long)status);
199767f8919635c4928607450d9e0abb932109ceToomas Soomeextern int command_fdt_internal(int argc, char *argv[]);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Since proper fdt command handling function is defined in fdt_loader_cmd.c,
199767f8919635c4928607450d9e0abb932109ceToomas Soome * and declaring it as extern is in contradiction with COMMAND_SET() macro
199767f8919635c4928607450d9e0abb932109ceToomas Soome * (which uses static pointer), we're defining wrapper function, which
199767f8919635c4928607450d9e0abb932109ceToomas Soome * calls the proper fdt handling routine.
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCOMMAND_SET(fdt, "fdt", "flattened device tree handling", command_fdt);
199767f8919635c4928607450d9e0abb932109ceToomas Soome for (i = 0; h != NULL; h = efi_find_handle(&efipart_dev, ++i)) {
199767f8919635c4928607450d9e0abb932109ceToomas Soome snprintf(dname, sizeof(dname), "%s%d:", efipart_dev.dv_name, i);