aboutsummaryrefslogtreecommitdiff
path: root/src/interface/efi
AgeCommit message (Collapse)AuthorFilesLines
2016-05-04[efi] Generalise EFI entropy generation to non-x86 CPUsMichael Brown1-0/+223
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2016-05-04[efi] Use a timer event to generate the currticks() timerMichael Brown1-50/+68
We currently use the EFI_CPU_ARCH_PROTOCOL's GetTimerValue() method to generate the currticks() timer, calibrated against a 1ms delay from the boot services Stall() method. This does not work on ARM platforms, where GetTimerValue() is an empty stub which just returns EFI_UNSUPPORTED. Fix by instead creating a periodic timer event, and using this event to increment a current tick counter. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2016-04-12[efi] Work around broken EFI HII specificationMichael Brown1-0/+7
The EFI_HII_CONFIG_ACCESS_PROTOCOL's ExtractConfig() method is passed a request string which includes the parameters being queried plus an apparently meaningless blob of information (the ConfigHdr), and is expected to include this same meaningless blob of information in the results string. Neither the specification nor the existing EDK2 code (including the nominal reference implementation in the DriverSampleDxe driver) provide any reason for the existence of this meaningless blob of information. It appears to be consumed in its entirety by the EFI_HII_CONFIG_ROUTING_PROTOCOL, and to contain zero bits of information by the time it reaches an EFI_HII_CONFIG_ACCESS_PROTOCOL instance. It would potentially allow for multiple configuration data sets to be handled by a single EFI_HII_CONFIG_ACCESS_PROTOCOL instance, in a style alien to the rest of the UEFI specification (which implicitly assumes that the instance pointer is always sufficient to uniquely identify the instance). iPXE currently handles this by simply copying the ConfigHdr from the request string to the results string, and otherwise ignoring it. This approach is also used by some code in EDK2, such as OVMF's PlatformDxe driver. As of EDK2 commit 8a45f80 ("MdeModulePkg: Make HII configuration settings available to OS runtime"), this causes an assertion failure inside EDK2. The failure arises when iPXE is handled a NULL request string, and responds (as per the specification) with a results string including all settings. Since there is no meaningless blob to copy from the request string, there is no corresponding meaningless blob in the results string. This now causes an assertion failure in HiiDatabaseDxe's HiiConfigRoutingExportConfig(). The same failure does not affect the OVMF PlatformDxe driver, which simply passes the request string to the HII BlockToConfig() utility function. The BlockToConfig() function returns EFI_INVALID_PARAMETER when passed a null request string, and PlatformDxe propagates this error directly to the caller. Fix by matching the behaviour of OVMF's PlatformDxe driver: explicitly return EFI_INVALID_PARAMETER if the request string is NULL or empty. This violates the specification (insofar as it is feasible to determine what the specification actually requires), but causes correct behaviour with the EDK2 codebase. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2016-03-17[efi] Move architecture-independent EFI prefixes to interface/efiMichael Brown2-0/+182
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2016-03-14[efi] Provide access to files stored on EFI filesystemsMichael Brown1-0/+573
Provide access to local files via the "file://" URI scheme. There are three syntaxes: - An opaque URI with a relative path (e.g. "file:script.ipxe"). This will be interpreted as a path relative to the iPXE binary. - A hierarchical URI with a non-network absolute path (e.g. "file:/boot/script.ipxe"). This will be interpreted as a path relative to the root of the filesystem from which the iPXE binary was loaded. - A hierarchical URI with a network path in which the authority is a volume label (e.g. "file://bootdisk/script.ipxe"). This will be interpreted as a path relative to the root of the filesystem with the specified volume label. Note that the potentially desirable shell mappings (e.g. "fs0:" and "blk0:") are concepts internal to the UEFI shell binary, and do not seem to be exposed in any way to external executables. The old EFI_SHELL_PROTOCOL (which did provide access to these mappings) is no longer installed by current versions of the UEFI shell. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2016-03-10[efi] Work around broken GetFontInfo() implementationsMichael Brown1-16/+38
Several UEFI platforms are known to return EFI_NOT_FOUND when asked to retrieve the system default font information via GetFontInfo(). Work around these broken platforms by iterating over the glyphs to find the maximum height used by a printable character. Originally-fixed-by: Jonathan Dieter <jdieter@lesbg.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2016-02-12[efi] Add missing definitions for function key scancodesMichael Brown1-0/+8
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2016-01-19[usb] Allow USB endpoints to specify a reserved header length for refillsMichael Brown1-1/+1
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-12-09[efi] Centralise EFI file system info GUIDsMichael Brown2-6/+8
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-10-16[efi] Add support for EFI_GRAPHICS_OUTPUT_PROTOCOL frame buffer consolesMichael Brown2-0/+555
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-10-07[efi] Import EFI_HII_FONT_PROTOCOL definitionsMichael Brown2-0/+7
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-10-07[efi] Reset root directory when installing EFI_SIMPLE_FILE_SYSTEM_PROTOCOLMichael Brown1-0/+3
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-28[efi] Expose an UNDI interface alongside the existing SNP interfaceMichael Brown1-23/+676
UEFI UNDI is a hideously ugly lump of poorly specified garbage bolted on as an appendix of the UEFI specification. My personal favourite line from the UNDI 'specification' is section E.2.2, which states "Basically, the rule is: Do it right, or don't do it at all". The author appears to believe that such exhortations are a viable substitute for documenting what it is that the wretched reader is supposed to, in fact, do. (Second favourite is the section listing the pros and cons of various driver types. This fails to identify a single con for the mythical "Hardware UNDI", a design so insanely intrinsically slow that it appears to have been the inspiration for the EFI_USB_IO_PROTOCOL.) UNDI is functionally isomorphic to the substantially less preposterous EFI_SIMPLE_NETWORK_PROTOCOL. Provide an UNDI interface (as a thin wrapper around the existing SNP interface) to allow for use by third-party software that has made poor life choices. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-28[efi] Avoid infinite loops when asked to stop non-existent devicesMichael Brown1-1/+1
Calling EDK2's OpenProtocol() with attributes BY_DRIVER|EXCLUSIVE will call DisconnectController() in a loop to attempt to dislodge any existing openers with attributes BY_DRIVER. The loop will continue indefinitely until either no such openers remain, or until DisconnectController() returns an error. If our driver binding protocol's Stop() method is ever called to disconnect a device that we are not in fact driving, then return EFI_DEVICE_ERROR rather than EFI_SUCCESS, in order to break this potentially infinite loop. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-14[efi] Expose unused USB devices via EFI_USB_IO_PROTOCOLMichael Brown1-0/+1305
Allow the UEFI platform firmware to provide drivers for unrecognised devices, by exposing our own implementation of EFI_USB_IO_PROTOCOL. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-13[efi] Include a copy of the device path within struct efi_deviceMichael Brown2-23/+36
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-13[efi] Provide efi_devpath_len()Michael Brown3-12/+15
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-07[efi] Allow efidev_parent() to traverse multiple device generationsMichael Brown1-10/+8
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-06[efi] Add USB headers and GUID definitionsMichael Brown2-0/+21
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-02[efi] Implement the EFI_PXE_BASE_CODE_PROTOCOLMichael Brown1-0/+1599
Many UEFI NBPs expect to find an EFI_PXE_BASE_CODE_PROTOCOL installed in addition to the EFI_SIMPLE_NETWORK_PROTOCOL. Most NBPs use the EFI_PXE_BASE_CODE_PROTOCOL only to retrieve the cached DHCP packets. This implementation has been tested with grub.efi, shim.efi, syslinux.efi, and wdsmgfw.efi. Some methods (such as Discover() and Arp()) are not used by any known NBP and so have not (yet) been implemented. Usage notes for the tested bootstraps are: - grub.efi uses EFI_PXE_BASE_CODE_PROTOCOL only to retrieve the cached DHCP packet, and uses no other methods. - shim.efi uses EFI_PXE_BASE_CODE_PROTOCOL to retrieve the cached DHCP packet and to retrieve the next NBP via the Mtftp() method. If shim.efi was downloaded via HTTP (or other non-TFTP protocol) then shim.efi will blindly call Mtftp() with an HTTP URI as the filename: this allows the next NBP (e.g. grubx64.efi) to also be transparently retrieved by HTTP. shim.efi can also use the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL to retrieve files previously loaded by "imgfetch" or similar commands in iPXE. The current implementation of shim.efi will use the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL only if it does not find an EFI_PXE_BASE_CODE_PROTOCOL; this patch therefore prevents this usage of our EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. This logic could be trivially reversed in shim.efi if needed. - syslinux.efi uses EFI_PXE_BASE_CODE_PROTOCOL only to retrieve the cached DHCP packet. Versions 6.03 and earlier have a bug which may cause syslinux.efi to attach to the wrong NIC if there are multiple NICs in the system (or if the UEFI firmware supports IPv6). - wdsmgfw.efi (ab)uses EFI_PXE_BASE_CODE_PROTOCOL to retrieve the cached DHCP packets, and to send and retrieve UDP packets via the UdpWrite() and UdpRead() methods. (This was presumably done in order to minimise the amount of benefit obtainable by switching to UEFI, by replicating all of the design mistakes present in the original PXE specification.) The EFI_DOWNGRADE_UX configuration option remains available for now, until this implementation has received more widespread testing. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-01[efi] Do not return EFI_NOT_READY from our ReceiveFilters() methodMichael Brown1-5/+7
Our SNP ReceiveFilters() method is a no-op, since we always (if possible) use promiscuous mode for all network cards. The method currently returns EFI_NOT_READY if the SNP interfaces are claimed for use by iPXE, as with all other SNP methods. The WDS bootstrap wdsmgfw.efi attempts to use both the PXE Base Code protocol and the Simple Network Protocol simultaneously. This is fundamentally broken, since use of the PXE Base Code protocol requires us to disable the use of SNP (by claiming the interfaces for use by iPXE), otherwise MnpDxe swallows all of the received packets before our PXE Base Code's UdpRead() method is able to return them. The root cause of this problem is that, as with BIOS PXE, the network booting portions of the UEFI specification are less of a specification and more of an application note sketchily describing how the original hacked-together Intel implementation works. No sane design would ever have included the UdpWrite() and UdpRead() methods. Work around these fundamental conceptual flaws by unconditionally returning success from efi_snp_receive_filters(). Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-01[efi] Fix order of events on SNP removal pathMichael Brown1-1/+2
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-01[efi] Allow calls to efi_snp_claim() and efi_snp_release() to be nestedMichael Brown1-4/+5
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-09-01[efi] Add definitions of GUIDs observed when booting wdsmgfw.efiMichael Brown2-0/+88
Add definitions of protocols observed to be used by wdsmgfw.efi, and add a handle name type for ConIn, ConOut, and StdErr. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-27[efi] Improve efi_wrap debuggingMichael Brown2-13/+340
Add debug wrappers for more boot services functions, and print symbolic values rather than raw numbers where possible. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-27[efi] Include installed protocol list in unknown handle namesMichael Brown1-3/+19
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-27[efi] Remove raw EFI_HANDLE values from debug messagesMichael Brown7-171/+159
The raw EFI_HANDLE value is almost never useful to know, and simply adds noise to the already verbose debug messages. Improve the legibility of debug messages by using only the name generated by efi_handle_name(). Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-27[efi] Mark EFI debug transcription functions as __attribute__ (( pure ))Michael Brown1-3/+4
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-27[efi] Add definitions of GUIDs observed when booting shim.efi and grub.efiMichael Brown2-0/+28
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-21[test] Allow self-tests to report exit status when running under LinuxMichael Brown1-7/+5
Allow the return status from an embedded image to propagate out to the eventual return status from main(). When running under Linux, this allows the pass/fail result of unit tests to be observable without having to visually inspect the console output. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-03[efi] Add missing "ULL" suffix on 64-bit constantMichael Brown1-1/+1
Older versions of gcc complain if this suffix is missing. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-08-03[efi] Hold off watchdog timer while runningMichael Brown2-0/+89
UEFI platforms may provide a watchdog timer, which will reboot the machine if an operating system takes more than five minutes to load. This can cause long-lived iPXE downloads (or interactive shell sessions) to unexpectedly reboot. Fix by resetting the watchdog timer every ten seconds while the iPXE main processing loop continues to run. Reported-by: Bradley B Williams <bradleybwilliams@swbell.net> Reported-by: John Clark <john.r.clark.3@gmail.com> Reported-by: wdriever@gmail.com Reported-by: Charlie Beima <cbeima@indiana.edu> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-07-22[efi] Allow user experience to be downgradedMichael Brown1-0/+34
iPXE does not currently provide EFI_PXE_BASE_CODE_PROTOCOL: this causes failures when chainloading bootloaders such as shim.efi which assume that this protocol will be present. Provide the ability to work around these problems via the build configuration option EFI_DOWNGRADE_UX. If this option is enabled, then we will not install our usual EFI_LOAD_FILE_PROTOCOL implementation, thereby allowing the platform firmware to install its own EFI_PXE_BASE_CODE_PROTOCOL implementation on top of our EFI_SIMPLE_NETWORK_PROTOCOL handle. A somewhat major side-effect of this workaround is that almost all iPXE features will be disabled. This configuration option will be removed in future when support for EFI_PXE_BASE_CODE_PROTOCOL is added. Requested-by: Laszlo Ersek <lersek@redhat.com> Requested-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-07-22[efi] Fix receive and transmit completion reportingMichael Brown1-66/+66
Fix the TxBuf value filled in by GetStatus() to report the transmit buffer address as required by the (now clarified) specification. Simplify "interrupt" handling in GetStatus() to report only that one or more packets have been transmitted or received; there is no need to report one GetStatus() "interrupt" per packet. Simplify receive handling to dequeue received packets immediately from the network device into an internal list (thereby avoiding the hacks previously used to determine when to report new packet arrivals). Originally-fixed-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-04-24[base16] Add buffer size parameter to base16_encode() and base16_decode()Michael Brown1-1/+1
The current API for Base16 (and Base64) encoding requires the caller to always provide sufficient buffer space. This prevents the use of the generic encoding/decoding functionality in some situations, such as in formatting the hex setting types. Implement a generic hex_encode() (based on the existing format_hex_setting()), implement base16_encode() and base16_decode() in terms of the more generic hex_encode() and hex_decode(), and update all callers to provide the additional buffer length parameter. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-04-14[efi] Add EFI time sourceMichael Brown1-0/+75
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-03-02[legal] Relicense files under GPL2_OR_LATER_OR_UBDLMichael Brown1-1/+5
Relicence files with kind permission from the following contributors: Alex Williamson <alex.williamson@redhat.com> Eduardo Habkost <ehabkost@redhat.com> Greg Jednaszewski <jednaszewski@gmail.com> H. Peter Anvin <hpa@zytor.com> Marin Hannache <git@mareo.fr> Robin Smidsrød <robin@smidsrod.no> Shao Miller <sha0.miller@gmail.com> Thomas Horsten <thomas@horsten.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-03-02[legal] Relicense files under GPL2_OR_LATER_OR_UBDLMichael Brown13-13/+65
Relicense files for which I am the sole author (as identified by util/relicense.pl). Signed-off-by: Michael Brown <mcb30@ipxe.org>
2015-02-11[build] Allow setting help text URI to be customised via config/branding.hMichael Brown1-1/+2
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-10-16[efi] Generalise snpnet_dev_info() to efi_device_info()Michael Brown1-0/+64
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-09-25[efi] Add definitions of GUIDs observed when chainloading from Intel driverMichael Brown2-2/+123
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-09-25[efi] Centralise definitions of more protocol GUIDsMichael Brown4-18/+20
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-09-04[efi] Make EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL optionalMichael Brown1-1/+7
Some UEFI systems (observed with a Hyper-V virtual machine) do not provide EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL. Make this an optional protocol (and fail any attempts to access PCI configuration space via the root bridge if the protocol is missing). Reported-by: Colin Blacker <Colin.Blacker@computerplanet.co.uk> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-08-29[efi] Wrap any images loaded by our wrapped imageMichael Brown1-21/+67
Propagate our modified EFI system table to any images loaded by the image that we wrap, thereby allowing us to observe boot services calls made by all subsequent EFI images. Also show details of intercepted ExitBootServices() calls. When wrapping is used, exiting boot services will almost certainly fail, but this at least allows us to see when it happens. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-08-27[efi] Make our virtual file system case insensitiveMichael Brown1-4/+24
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-08-27[efi] Show details of intercepted LoadImage() callsMichael Brown1-0/+30
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-08-22[efi] Dump details of any calls to our dummy block and disk I/O protocolsMichael Brown1-15/+33
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-08-21[efi] Add definitions of GUIDs observed during Windows bootMichael Brown2-1/+22
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-08-06[efi] Support displaying and hiding cursorMichael Brown1-0/+32
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2014-08-06[efi] Generalise snpnet_pci_info() to efi_locate_device()Michael Brown1-0/+52
Signed-off-by: Michael Brown <mcb30@ipxe.org>