aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2021-01-29[build] Add syslinux search locations used on FreeBSDMichael Brown1-0/+2
Originally-implemented-by: Nikolai Lifanov <lifanov@mail.lifanov.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-29[build] Drop timestamps from .a filedeterminismBernhard M. Wiedemann1-2/+2
Make the contents of $(BLIB) deterministic to allow it to be subsequently used for calculating a build ID. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-29[hermon] Perform clean MPT unmap on device shutdownChristian Iversen2-0/+29
This change is ported from Flexboot sources. When stopping a Hermon device, perform hermon_unmap_mpt() which runs HERMON_HCR_HW2SW_MPT to bring the Memory Protection Table (MPT) back to software control. Signed-off-by: Christian Iversen <ci@iversenit.dk> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-29[hermon] Use Ethernet MAC as eIPoIB local EMACChristian Iversen2-17/+20
The eIPoIB local Ethernet MAC is currently constructed from the port GUID. Given a base GUID/MAC value of N, Mellanox seems to populate: Node GUID: N + 0 Port 1 GUID: N + 1 Port 2 GUID: N + 2 and Port 1 MAC: N + 0 Port 2 MAC: N + 1 This causes a duplicate local MAC address when port 1 is configured as Infiniband and port 2 as Ethernet, since both will derive their MAC address as (N + 1). Fix by using the port's Ethernet MAC as the eIPoIB local EMAC. This is a behavioural change that could potentially break configurations that rely on the local EMAC value, such as a DHCP server relying on the chaddr field for DHCP reservations. Signed-off-by: Christian Iversen <ci@iversenit.dk> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-28[hermon] Increase polling rate for command completionsChristian Iversen1-2/+2
Some older versions of the hardware (and/or firmware) do not report an event when an Infiniband link reaches the INIT state. The driver works around this missing event by calling ib_smc_update() on each event queue poll while the link is in the DOWN state. This results in a very large number of commands being issued while any open Infiniband link is in the DOWN state (e.g. unplugged), to the point that the 1ms delay from waiting for each command to complete will noticeably affect responsiveness. Fix by decreasing the command completion polling delay from 1ms to 10us. Signed-off-by: Christian Iversen <ci@iversenit.dk> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-28[hermon] Add event queue debug functionsMichael Brown1-2/+76
Add hermon_dump_eqctx() for dumping the event queue context and hermon_dump_eqes() for dumping any unconsumed event queue entries. Originally-implemented-by: Christian Iversen <ci@iversenit.dk> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-28[hermon] Increase command timeout from 2 to 10 secondsChristian Iversen1-1/+1
Some commands (particularly in relation to device initialization) can occasionally take longer than 2 seconds, and the Mellanox documentation recommends a 10 second timeout. Signed-off-by: Christian Iversen <ci@iversenit.dk>
2021-01-28[hermon] Add assorted debug error messagesMichael Brown1-6/+33
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-28[hermon] Show "issuing command" messages only at DBGLVL_EXTRAMichael Brown1-7/+5
Originally-implemented-by: Christian Iversen <ci@iversenit.dk> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-28[hermon] Reorganize PCI ROM list and document well-known product namesChristian Iversen1-2/+9
Signed-off-by: Christian Iversen <ci@iversenit.dk>
2021-01-28[golan] Backport typo fix in nodnic_prm.h: s/HERMON/NODNIC/Christian Iversen1-2/+2
Signed-off-by: Christian Iversen <ci@iversenit.dk>
2021-01-28[arbel] Clean up whitespace in MT25218_PRM.h headerChristian Iversen1-88/+88
Signed-off-by: Christian Iversen <ci@iversenit.dk>
2021-01-28[hermon] Clean up whitespace in MT25408_PRM.h headerChristian Iversen1-132/+132
Signed-off-by: Christian Iversen <ci@iversenit.dk>
2021-01-27[efi] Use EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL if availableMichael Brown1-11/+66
The original EFI_SIMPLE_TEXT_INPUT_PROTOCOL is not technically required to handle the use of the Ctrl key, and the long-obsolete EFI 1.10 specification lists only backspace, tab, linefeed, and carriage return as required. Some particularly brain-dead vendor UEFI firmware implementations dutifully put in the extra effort of ensuring that all other control characters (such as Ctrl-C) are impossible to type via EFI_SIMPLE_TEXT_INPUT_PROTOCOL. Current versions of the UEFI specification mandate that the console input handle must support both EFI_SIMPLE_TEXT_INPUT_PROTOCOL and EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL, the latter of which at least provides access to modifier key state. Unlike EFI_SIMPLE_TEXT_INPUT_PROTOCOL, the pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance does not appear within the EFI system table and must therefore be opened explicitly. The UEFI specification provides no safe way to do so, since we cannot open the handle BY_DRIVER or BY_CHILD_CONTROLLER and so nothing guarantees that this pointer will remain valid for the lifetime of iPXE. We must simply hope that no UEFI firmware implementation ever discovers a motivation for reinstalling the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. Use EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL if available, falling back to the existing EFI_SIMPLE_TEXT_PROTOCOL otherwise. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-27[image] Implicitly trust first embedded imageJoe Groocock1-0/+3
iPXE when used as a NIC option ROM can sometimes be reloaded by the UEFI/BIOS and any pre-initialised memory will remain loaded. When the imgtrust command is run it sets `require_trusted_images'. Upon reloading, iPXE tries to load the first embedded image but fails as it is not marked trusted. Setting this flag ensures that imgtrust with the first embedded script is reentrant. Signed-off-by: Joe Groocock <jgroocock@cloudflare.com>
2021-01-27[infiniband] Require drivers to specify the number of portsChristian Iversen9-22/+9
Require drivers to report the total number of Infiniband ports. This is necessary to report the correct number of ports on devices with dynamic port types. For example, dual-port Mellanox cards configured for (eth, ib) would be rejected by the subnet manager, because they report using "port 2, out of 1". Signed-off-by: Christian Iversen <ci@iversenit.dk>
2021-01-26[efi] Fix misleading debug messageMichael Brown1-1/+2
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-26[ifmgmt] Make "ifstat" show the link-layer protocol for each netdevChristian Iversen1-1/+2
This is useful on devices that perform auto-detection for ports. Example output: iPXE> ifstat net0: 00:11:22:33:44:55 using mt4099 on 0000:00:03.0 (Ethernet) [open] [Link:down, TX:0 TXE:0 RX:0 RXE:0] [Link status: Unknown (http://ipxe.org/1a086101)] net1: 00:11:22:33:44:56 using mt4099 on 0000:00:03.0 (IPoIB) [open] [Link:down, TX:0 TXE:0 RX:0 RXE:0] [Link status: Initialising (http://ipxe.org/1a136101)] Signed-off-by: Christian Iversen <ci@iversenit.dk>
2021-01-26[cmdline] Expose "iflinkwait" as a commandMichael Brown4-7/+67
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-26[efi] Fix use of uninitialised variableMichael Brown1-0/+3
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-25[efi] Automatically load "/autoexec.ipxe" when booted from a filesystemMichael Brown3-10/+204
When booting iPXE from a filesystem (e.g. a FAT-formatted USB key) it can be useful to have an iPXE script loaded automatically from the same filesystem. Compared to using an embedded script, this has the advantage that the script can be edited without recompiling the iPXE binary. For the BIOS version of iPXE, loading from a filesystem is handled using syslinux (or isolinux) which allows the script to be passed to the iPXE .lkrn image as an initrd. For the UEFI version of iPXE, the platform firmware loads the iPXE .efi image directly and there is currently no equivalent of the BIOS initrd mechanism. Add support for automatically loading a file "autoexec.ipxe" (if present) from the root of the filesystem containing the UEFI iPXE binary. A combined BIOS and UEFI image for a USB key can be created using e.g. ./util/genfsimg -o usbkey.img -s myscript.ipxe \ bin-x86_64-efi/ipxe.efi bin/ipxe.lkrn The file "myscript.ipxe" would appear as "autoexec.ipxe" on the USB key, and would be loaded automatically on both BIOS and UEFI systems. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-25[image] Provide image_memory()Michael Brown6-76/+62
Consolidate the remaining logic common to initrd_init() and imgmem() into a shared image_memory() function. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-24[travis] Update to current default build environmentMichael Brown1-1/+2
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-24[build] Report a meaningful error message if isolinux.bin is missingMichael Brown1-2/+4
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-24[build] Check that mkisofs equivalent supports the required optionsMichael Brown1-19/+14
The "-e" option required for creating EFI boot images is supported only by widely used patched versions of genisoimage. Check that the required options are supported when selecting a mkisofs equivalent, thereby allowing a fallback to the use of xorrisofs when building a UEFI ISO image on a system with an unpatched version of genisoimage. Continue to prefer the use of genisoimage over xorrisofs, since there is apparently no way to inhibit the irritatingly useless startup banner message printed by xorrisofs even when the "-quiet" option is specified. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-22[tftp] Allow for profiling of client and server turnaround timesMichael Brown1-1/+23
Provide some visibility into the turnaround times on both client and server sides as perceived by iPXE, to assist in debugging inexplicably slow TFTP transfers. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-22[image] Add the "imgmem" commandMichael Brown5-0/+148
Provide the "imgmem" command to create an image from an existing block of memory, for debugging purposes only. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-22[image] Provide image_set_data()Michael Brown3-12/+34
Extract part of the logic in initrd_init() to a standalone function image_set_data(). Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-22[build] Allow an initrd script to be provided via genfsimgMichael Brown1-4/+15
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-22[build] Fail gracefully when no input files are given to genfsimgMichael Brown1-0/+5
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-22[build] Use explicit disk geometry for generated FAT filesystem imagesMichael Brown1-4/+7
For FAT filesystem images larger than a 1.44MB floppy disk, round up the image size to a whole number of 504kB cylinders before formatting. This avoids losing up to a cylinder's worth of expected space in the filesystem image. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-22[build] Fix genfsimg incompatibility with dash shellMichael Brown1-2/+2
Reported-by: Antony Messerli <antony@mes.ser.li> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-21[build] Set volume name "iPXE" on FAT filesystem imagesMichael Brown1-2/+2
Allow generated filesystem images to be accessed using the file:// URI syntax by setting a defined volume name. This allows a script placed on the same filesystem image to be accessed using e.g. chain file://iPXE/script.ipxe Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-19[build] Allow genfsimg to be used on third party UEFI binariesMichael Brown1-3/+21
Extract the PE header offset from the MZ header rather than assuming a fixed offset as used in the binaries created by the iPXE build system. This allows genfsimg to be used to create bootable filesystem images from third party UEFI binaries such as the UEFI shell. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-19[ipv6] Defer router discovery timeout while link is blockedMichael Brown1-1/+19
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-19[dhcp] Allow for links that remained blocked for up to three minutesMichael Brown1-1/+1
With the default timeouts for Cisco MAC Authentication Bypass, the link will remain blocked for around 90 seconds (plus a likely subsequent delay for STP). Extend the maximum number of DHCP discovery deferrals to allow for up to three minutes of waiting for a link to become unblocked. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-19[eap] Treat an EAP Request-Identity as indicating a blocked linkMichael Brown7-0/+256
A switch port using 802.1x authentication will send EAP Request-Identity packets once the physical link is up, and will not be forwarding packets until the port identity has been established. We do not currently support 802.1x authentication. However, a reasonably common configuration involves using a preset list of permitted MAC addresses, with the "authentication" taking place between the switch and a RADIUS server. In this configuration, the end device does not need to perform any authentication step, but does need to be prepared for the switch port to fail to forward packets for a substantial time after physical link-up. This exactly matches the "blocked link" semantics already used when detecting a non-forwarding switch port via LACP or STP. Treat a received EAP Request-Identity as indicating a blocked link. Unlike LACP or STP, there is no way to determine the expected time until the next EAP packet and so we must choose a fixed timeout. Erroneously assuming that the link is blocked is relatively harmless since we will still attempt to transmit and receive data even over a link that is marked as blocked, and so the net effect is merely to prolong DHCP attempts. In contrast, erroneously assuming that the link is unblocked will potentially cause DHCP to time out and give up, resulting in a failed boot. The default EAP Request-Identity interval in Cisco switches (where this is most likely to be encountered in practice) is 30 seconds, so choose 45 seconds as a timeout that is likely to avoid gaps during which we falsely assume that the link is unblocked. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-19[eapol] Replace EAPoL codeMichael Brown3-146/+109
Replace the GPL2+-only EAPoL code (currently used only for WPA) with new code licensed under GPL2+-or-UBDL. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-19[dhcp] Continue transmitting DHCPDISCOVER while link is blockedMichael Brown1-12/+11
Continue to transmit DHCPDISCOVER while waiting for a blocked link, in order to support mechanisms such as Cisco MAC Authentication Bypass that require repeated transmission attempts in order to trigger the action that will result in the link becoming unblocked. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-18[build] Include xorrisofs as a viable mkisofs equivalentOmgalof1-2/+2
Add support for xorrisofs, a GNU mkisofs equivalent that is available in most distro repositories. Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-15[build] Inhibit spurious array bounds warning on some versions of gccMichael Brown1-1/+1
Some versions of gcc (observed with gcc 9.3.0 on NixOS Linux) produce a spurious warning about an out-of-bounds array access for the isa_extra_probe_addrs[] array. Work around this compiler bug by redefining the array index as a signed long, which seems to somehow avoid this spurious warning. Debugged-by: Manuel Mendez <mmendez534@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-13[isa] Add missing #include <config/isa.h>Manuel Mendez1-0/+1
Signed-off-by: Manuel Mendez <mmendez534@gmail.com> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-13[build] Create util/genfsimg for building filesystem-based imagesMichael Brown6-308/+260
Generalise util/geniso, util/gensdsk, and util/genefidsk to create a single script util/genfsimg that can be used to build either FAT filesystem images or ISO images. Extend the functionality to allow for building multi-architecture UEFI bootable ISO images and combined BIOS+UEFI images. For example: ./util/genfsimg -o combined.iso \ bin-x86_64-efi/ipxe.efi \ bin-arm64-efi/ipxe.efi \ bin/ipxe.lkrn would generate a hybrid image that could be used as a CDROM (or hard disk or USB key) on legacy BIOS, x86_64 UEFI, or ARM64 UEFI. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-04[xhci] Avoid false positive Coverity warningMichael Brown1-1/+1
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-03[efi] Leave asynchronous USB endpoints open until device is removedMichael Brown1-11/+13
Some UEFI device drivers will react to an asynchronous USB transfer failure by dubiously terminating the scheduled transfer from within the completion handler. We already have code from commit fbb776f ("[efi] Leave USB endpoint descriptors in existence until device is removed") that avoids freeing memory in this situation, in order to avoid use-after-free bugs. This is not sufficient to avoid potential problems, since with an xHCI controller the act of closing the endpoint requires issuing a command and awaiting completion via the event ring, which may in turn dispatch further USB transfer completion events. Avoid these problems by leaving the USB endpoint open (but with the refill timer stopped) until the device is finally removed, as is already done for control and bulk transfers. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-03[xhci] Show meaningful error messages after command failuresMichael Brown1-7/+25
Ensure that any command failure messages are followed up with an error message indicating what the failed command was attempting to perform. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2021-01-03[xhci] Fail attempts to issue concurrent commandsMichael Brown1-0/+8
The xHCI driver can handle only a single command TRB in progress at any one time. Immediately fail any attempts to issue concurrent commands (which should not occur in normal operation). Signed-off-by: Michael Brown <mcb30@ipxe.org>
2020-12-31[efi] Use segment and bus number to identify PCI root bridge I/O protocolv1.21.1Michael Brown2-4/+71
There may be multiple instances of EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL for a single PCI segment. Use the bus number range descriptor from the ACPI resource list to identify the correct protocol instance. There is some discrepancy between the ACPI and UEFI specifications regarding the interpretation of values within the ACPI resource list. The ACPI specification defines the min/max field values to be within the secondary (device-side) address space, and defines the offset field value as "the offset that must be added to the address on the secondary side to obtain the address on the primary side". The UEFI specification states instead that the offset field value is the "offset to apply to the starting address to convert it to a PCI address", helpfully omitting to clarify whether "to apply" in this context means "to add" or "to subtract". The implication of the wording is also that the "starting address" is not already a "PCI address" and must therefore be a host-side address rather than the ACPI-defined device-side address. Code comments in the EDK2 codebase seem to support the latter (non-ACPI) interpretation of these ACPI structures. For example, in the PciHostBridgeDxe driver there can be found the comment Macros to translate device address to host address and vice versa. According to UEFI 2.7, device address = host address + translation offset. along with a pair of macros TO_HOST_ADDRESS() and TO_DEVICE_ADDRESS() which similarly negate the sense of the "translation offset" from the definition found in the ACPI specification. The existing logic in efipci_ioremap() (based on a presumed-working externally contributed patch) applies the non-ACPI interpretation: it assumes that min/max field values are host-side addresses and that the offset field value is negated. Match this existing logic by assuming that min/max field values are host-side bus numbers. (The bus number offset value is therefore not required and so can be ignored.) As noted in commit 9b25f6e ("[efi] Fall back to assuming identity mapping of MMIO address space"), some systems seem to fail to provide MMIO address space descriptors. Assume that some systems may similarly fail to provide bus number range descriptors, and fall back in this situation to assuming that matching on segment number alone is sufficient. Testing any of this is unfortunately impossible without access to esoteric hardware that actually uses non-zero translation offsets. Originally-implemented-by: Thomas Walker <twalker@twosigma.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
2020-12-29[smbios] Add support for the 64-bit SMBIOS3 entry pointMichael Brown3-22/+82
Support UEFI systems that provide only 64-bit versions of the SMBIOS entry point. Signed-off-by: Michael Brown <mcb30@ipxe.org>
2020-12-29[efi] Allow for longer device paths in debug messagesb1f6c1c41-1/+1
Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>