3 weeks ago[acpi] Expose system MAC address via ${sysmac} setting master sysmac
Michael Brown [Fri, 10 Jun 2022 12:42:01 +0000 (13:42 +0100)] 
[acpi] Expose system MAC address via ${sysmac} setting

Expose the system MAC address (if any) via the ${sysmac} setting.
This allows scripts to access the system MAC address even when iPXE
has decided not to apply it to a network device (e.g. because the
cached DHCPACK MAC address was selected in order to match the
behaviour of a previous boot stage).

The setting is named ${sysmac} rather than ${acpimac} in order to
allow for forward compatibility with non-ACPI mechanisms that may
exist in future for specifying a system MAC address.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
6 weeks ago[cachedhcp] Allow cached DHCPACK to override a temporary MAC address hwmac
Michael Brown [Mon, 23 May 2022 12:05:24 +0000 (13:05 +0100)] 
[cachedhcp] Allow cached DHCPACK to override a temporary MAC address

When running on a system with an ACPI-provided system-specific MAC
address, iPXE will apply this address to an ECM or NCM USB NIC.  If
iPXE has been chainloaded from a previous stage that does not
understand the ACPI MAC mechanism then this can result in iPXE using a
different MAC address than the previous stage, which is surprising to

Attempt to minimise surprise by allowing the MAC address found in a
cached DHCPACK packet to override a temporary MAC address, if the
DHCPACK MAC address matches the network device's permanent MAC
address.  When a previous stage has chosen to use the network device's
permanent MAC address (e.g. because it does not understand the ACPI
MAC mechanism), this will cause iPXE to make the same choice.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
6 weeks ago[ecm] Treat ACPI MAC address as being a non-permanent MAC address
Michael Brown [Mon, 23 May 2022 11:23:53 +0000 (12:23 +0100)] 
[ecm] Treat ACPI MAC address as being a non-permanent MAC address

When applying an ACPI-provided system-specific MAC address, apply it
to netdev->ll_addr rather than netdev->hw_addr.  This allows iPXE
scripts to access the permanent MAC address via the ${netX/hwaddr}
setting (and thereby provides scripts with a mechanism to ascertain
that the NIC is using a MAC address other than its own permanent
hardware address).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2 months ago[cloud] Allow aws-import script to run on Python 3.6
Michael Brown [Wed, 6 Apr 2022 13:36:07 +0000 (14:36 +0100)] 
[cloud] Allow aws-import script to run on Python 3.6

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[acpi] Support the "_RTXMAC_" format for ACPI-based MAC addresses
Michael Brown [Wed, 23 Mar 2022 15:02:17 +0000 (15:02 +0000)] 
[acpi] Support the "_RTXMAC_" format for ACPI-based MAC addresses

Some newer HP products expose the host-based MAC (HBMAC) address using
an ACPI method named "RTMA" returning a part-binary string of the form
"_RTXMAC_#<mac>#", where "<mac>" comprises the raw MAC address bytes.

Extend the existing support to handle this format alongside the older
"_AUXMAC_" format (which uses a base16-encoded MAC address).

Reported-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[acpi] Add MAC address extraction self-tests
Michael Brown [Wed, 23 Mar 2022 14:57:53 +0000 (14:57 +0000)] 
[acpi] Add MAC address extraction self-tests

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[linux] Add stub phys_to_user() implementation
Michael Brown [Wed, 23 Mar 2022 14:41:36 +0000 (14:41 +0000)] 
[linux] Add stub phys_to_user() implementation

For symmetry with the stub user_to_phys() implementation, provide
phys_to_user() with the same underlying assumption that virtual
addresses are physical (since there is no way to know the real
physical address when running as a Linux userspace executable).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[acpi] Allow for the possibility of overriding ACPI tables at link time
Michael Brown [Wed, 23 Mar 2022 14:39:11 +0000 (14:39 +0000)] 
[acpi] Allow for the possibility of overriding ACPI tables at link time

Allow for linked-in code to override the mechanism used to locate an
ACPI table, thereby opening up the possibility of ACPI self-tests.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[efi] Support Unicode character output via framebuffer console
Michael Brown [Tue, 15 Mar 2022 15:04:22 +0000 (15:04 +0000)] 
[efi] Support Unicode character output via framebuffer console

Extend the glyph cache to include a number of dynamic entries that are
populated on demand whenever a non-ASCII character needs to be drawn.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[fbcon] Support Unicode character output
Michael Brown [Mon, 14 Mar 2022 22:38:24 +0000 (22:38 +0000)] 
[fbcon] Support Unicode character output

Accumulate UTF-8 characters in fbcon_putchar(), and require the frame
buffer console's .glyph() method to accept Unicode character values.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[efi] Support Unicode character output via text console
Michael Brown [Mon, 28 Feb 2022 13:39:10 +0000 (13:39 +0000)] 
[efi] Support Unicode character output via text console

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 months ago[utf8] Add UTF-8 accumulation self-tests
Michael Brown [Mon, 28 Feb 2022 14:41:45 +0000 (14:41 +0000)] 
[utf8] Add UTF-8 accumulation self-tests

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[utf8] Add ability to accumulate Unicode characters from UTF-8 bytes
Michael Brown [Mon, 28 Feb 2022 13:37:40 +0000 (13:37 +0000)] 
[utf8] Add ability to accumulate Unicode characters from UTF-8 bytes

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[dns] Always start DNS queries using the first configured DNS server dns_primary
Michael Brown [Wed, 23 Feb 2022 22:52:08 +0000 (22:52 +0000)] 
[dns] Always start DNS queries using the first configured DNS server

We currently define the active DNS server as a global variable.  All
queries will start by attempting to contact the active DNS server, and
the active DNS server will be changed only if we fail to get a
response.  This effectively treats the DNS server list as expressing a
weak preference ordering: we will try servers in order, but once we
have found a working server we will stick with that server for as long
as it continues to respond to queries.

Some sites are misconfigured to hand out DNS servers that do not have
a consistent worldview.  For example: the site may hand out two DNS
server addresses, the first being an internal DNS server (which is
able to resolve names in private DNS domains) and the second being a
public DNS server such as (which will correctly return
NXDOMAIN for any private DNS domains).  This type of configuration is
fundamentally broken and should never be used, since any DNS resolver
performing a query for a name within a private DNS domain may obtain a
spurious NXDOMAIN response for a valid private DNS name.

Work around these broken configurations by treating the DNS server
list as expressing a strong preference ordering, and always starting
DNS queries from the first server in the list (rather than maintaining
a global concept of the active server).  This will have the debatable
benefit of converting permanent spurious NXDOMAIN errors into
transient spurious NXDOMAIN errors, which can at least be worked
around at a higher level (e.g. by retrying a download in a loop within
an iPXE script).

The cost of always starting DNS queries from the first server in the
list is a slight delay introduced when the first server is genuinely
unavailable.  This should be negligible in practice since DNS queries
are relatively infrequent and the failover expiry time is short.

Treating the DNS server list as a preference ordering is permitted by
the language of RFC 2132, which defines DHCP option 6 as a list in
which "[DNS] servers SHOULD be listed in order of preference".  No
specification defines a precise algorithm for how this preference
order should be applied in practice: this new approach seems as good
as any.

Requested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Include mappings for AltGr-Shift-<key>
Michael Brown [Wed, 16 Feb 2022 15:19:35 +0000 (15:19 +0000)] 
[console] Include mappings for AltGr-Shift-<key>

The BIOS console's interpretation of LShift+RShift as equivalent to
AltGr requires the shifted ASCII characters to be present in the AltGr
mapping table, to allow AltGr-Shift-<key> to be interpreted in the
same way as AltGr-<key>.

For keyboard layouts that have different ASCII characters for
AltGr-<key> and AltGr-Shift-<key>, this will potentially leave the
character for AltGr-<key> inaccessible via the BIOS console if the
BIOS requires the use of the LShift+RShift workaround.  This
theoretically affects the numeric keys in the Lithuanian ("lt")
keyboard layout (where the numerals are accessed via AltGr-<key> and
punctuation characters via AltGr-Shift-<key>), but the simple
workaround for that keyboard layout is to avoid using AltGr and Shift
entirely since the unmodified numeric keys are not remapped anyway.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Support changing keyboard map at runtime
Michael Brown [Wed, 16 Feb 2022 00:14:38 +0000 (00:14 +0000)] 
[console] Support changing keyboard map at runtime

Provide the special keyboard map named "dynamic" which allows the
active keyboard map to be selected at runtime via the ${keymap}
setting, e.g.:

  #define KEYBOARD_MAP dynamic

  iPXE> set keymap uk

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[settings] Always process all settings applicators
Michael Brown [Wed, 16 Feb 2022 00:12:55 +0000 (00:12 +0000)] 
[settings] Always process all settings applicators

Settings applicators are entirely independent, and there is no reason
why a failure in one applicator should prevent other applicators from
being processed.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Ensure that US keyboard map appears at start of linker table
Michael Brown [Wed, 16 Feb 2022 00:11:33 +0000 (00:11 +0000)] 
[console] Ensure that US keyboard map appears at start of linker table

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[xsigo] Avoid storing unused uninitialised fields in gateway address
Michael Brown [Wed, 16 Feb 2022 13:22:56 +0000 (13:22 +0000)] 
[xsigo] Avoid storing unused uninitialised fields in gateway address

As reported by Coverity, xsmp_rx_xve_modify() currently passes a
partially initialised struct ib_address_vector to xve_update_tca() and
thence to eoib_set_gateway(), which uses memcpy() to store the whole
structure including the (unused and unneeded) uninitialised fields.

Silence the Coverity warning by zeroing the whole structure.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[pci] Ensure that pci_read_config() initialises all fields
Michael Brown [Wed, 16 Feb 2022 12:30:02 +0000 (12:30 +0000)] 
[pci] Ensure that pci_read_config() initialises all fields

As per the general pattern for initialisation functions in iPXE,
pci_init() saves code size by assuming that the caller has already
zeroed the underlying storage (e.g. as part of zeroing a larger
containing structure).  There are several places within the code where
pci_init() is deliberately used to initialise a transient struct
pci_device without zeroing the entire structure, because the calling
code knows that only the PCI bus:dev.fn address is required to be
initialised (e.g. when reading from PCI configuration space).

Ensure that using pci_init() followed by pci_read_config() will fully
initialise the struct pci_device even if the caller did not previously
zero the underlying storage, since Coverity reports that there are
several places in the code that rely upon this.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[image] Do not clear current working URI when executing embedded image
Michael Brown [Tue, 15 Feb 2022 14:28:01 +0000 (14:28 +0000)] 
[image] Do not clear current working URI when executing embedded image

Embedded images do not have an associated URI.  This currently causes
the current working URI (cwuri) to be cleared when starting an
embedded image.

If the current working URI has been set via a ${next-server} setting
from a cached DHCP packet then this will result in unexpected
behaviour.  An attempt by the embedded script to use a relative URI to
download files from the TFTP server will fail with the error:

  Could not start download: Operation not supported (ipxe.org/3c092083)

Rerunning the "dhcp" command will not fix this error, since the TFTP
settings applicator will not see any change to the ${next-server}
setting and so will not reset the current working URI.

Fix by setting the current working URI to the image's URI only if the
image actually has an associated URI.

Debugged-by: Ignat Korchagin <ignat@cloudflare.com>
Originally-fixed-by: Ignat Korchagin <ignat@cloudflare.com>
Tested-by: Ignat Korchagin <ignat@cloudflare.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Fix definition of unreachability for remapped keys
Michael Brown [Tue, 15 Feb 2022 16:41:19 +0000 (16:41 +0000)] 
[console] Fix definition of unreachability for remapped keys

The AltGr remapping table is constructed to include only keys that are
not reachable after applying the basic remapping table.  The logic
currently fails to include keys that are omitted entirely from the
basic remapping table since they would map to a non-ASCII character.

Fix this logic by allowing the remapping tables to include null
mappings, which are then elided only at the point of constructing the
C code fragment.

Reported-by: Christian Nilsson <nikize@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Add Swedish "se" keymap
Michael Brown [Tue, 15 Feb 2022 14:12:18 +0000 (14:12 +0000)] 
[console] Add Swedish "se" keymap

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[build] Avoid invoking genkeymap.py via Perl
Michael Brown [Tue, 15 Feb 2022 13:54:28 +0000 (13:54 +0000)] 
[build] Avoid invoking genkeymap.py via Perl

The build process currently invokes the Python genkeymap.py script via
the Perl executable.  Strangely, this appears to work.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Ensure that all ASCII characters are reachable in all keymaps
Michael Brown [Tue, 15 Feb 2022 11:51:37 +0000 (11:51 +0000)] 
[console] Ensure that all ASCII characters are reachable in all keymaps

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Remove "az" keymap
Michael Brown [Tue, 15 Feb 2022 11:53:07 +0000 (11:53 +0000)] 
[console] Remove "az" keymap

The "az" keymap has several unreachable ASCII characters, with no
obvious closest equivalent keys.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Fix unreachable characters in "mt" keymap
Michael Brown [Tue, 15 Feb 2022 11:45:17 +0000 (11:45 +0000)] 
[console] Fix unreachable characters in "mt" keymap

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Fix unreachable characters in "il" keymap
Michael Brown [Tue, 15 Feb 2022 11:43:08 +0000 (11:43 +0000)] 
[console] Fix unreachable characters in "il" keymap

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Treat dead keys as producing their ASCII equivalents
Michael Brown [Tue, 15 Feb 2022 11:28:57 +0000 (11:28 +0000)] 
[console] Treat dead keys as producing their ASCII equivalents

Treat dead keys in target keymaps as producing the closest equivalent
ASCII character, since many of these characters are otherwise
unrepresented on the keyboard.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Support AltGr to access ASCII characters via remapping
Michael Brown [Mon, 14 Feb 2022 13:45:59 +0000 (13:45 +0000)] 
[console] Support AltGr to access ASCII characters via remapping

Several keyboard layouts define ASCII characters as accessible only
via the AltGr modifier.  Add support for this modifier to ensure that
all ASCII characters are accessible.

Experiments suggest that the BIOS console is likely to fail to
generate ASCII characters when the AltGr key is pressed.  Work around
this limitation by accepting LShift+RShift (which will definitely
produce an ASCII character) as a synonym for AltGr.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Centralise handling of key modifiers
Michael Brown [Mon, 14 Feb 2022 16:31:08 +0000 (16:31 +0000)] 
[console] Centralise handling of key modifiers

Handle Ctrl and CapsLock key modifiers within key_remap(), to provide
consistent behaviour across different console types.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Allow for named keyboard mappings
Michael Brown [Mon, 14 Feb 2022 13:22:48 +0000 (13:22 +0000)] 
[console] Allow for named keyboard mappings

Separate the concept of a keyboard mapping from a list of remapped
keys, to allow for the possibility of supporting multiple keyboard
mappings at runtime.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[tables] Add ability to declare static table start and end markers
Michael Brown [Mon, 14 Feb 2022 13:13:37 +0000 (13:13 +0000)] 
[tables] Add ability to declare static table start and end markers

The compound statement expression within __table_entries() prevents
the use of top-level declarations such as

  static struct thing *things = table_start ( THINGS );

Define TABLE_START() and TABLE_END() macros that can be used as:

  static TABLE_START ( things_start, THINGS );
  static struct thing *things = things_start;

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Handle remapping of scancode 86
Michael Brown [Wed, 9 Feb 2022 15:43:42 +0000 (15:43 +0000)] 
[console] Handle remapping of scancode 86

The key with scancode 86 appears in the position between left shift
and Z on a US keyboard, where it typically fails to exist entirely.
Most US keyboard maps define this nonexistent key as generating "\|",
with the notable exception of "loadkeys" which instead reports it as
generating "<>".  Both of these mapping choices duplicate keys that
exist elsewhere in the map, which causes problems for our ASCII-based
remapping mechanism.

Work around these quirks by treating the key as generating "\|" with
the high bit set, and making it subject to remapping.  Where the BIOS
generates "\|" as expected, this allows us to remap to the correct
ASCII value.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Update genkeymap to work with current databases
Michael Brown [Sun, 6 Feb 2022 19:33:20 +0000 (19:33 +0000)] 
[console] Update genkeymap to work with current databases

Rewrite genkeymap.pl in Python with added sanity checks, and update
the list of keyboard mappings to remove those no longer supported by
the underlying "loadkeys" tool.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[efi] Support keyboard remapping via the EFI console
Michael Brown [Thu, 10 Feb 2022 12:14:46 +0000 (12:14 +0000)] 
[efi] Support keyboard remapping via the EFI console

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[usb] Handle upper/lower case and Ctrl-<key> after applying remapping
Michael Brown [Thu, 10 Feb 2022 11:55:54 +0000 (11:55 +0000)] 
[usb] Handle upper/lower case and Ctrl-<key> after applying remapping

Some keyboard layouts (e.g. "fr") swap letter and punctuation keys.
Apply the logic for upper and lower case and for Ctrl-<key> only after
applying remapping, in order to handle these layouts correctly.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[usb] Support keyboard remapping via the native USB keyboard driver
Michael Brown [Wed, 9 Feb 2022 21:54:47 +0000 (21:54 +0000)] 
[usb] Support keyboard remapping via the native USB keyboard driver

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Avoid attempting to remap numeric keypad on BIOS console
Michael Brown [Wed, 9 Feb 2022 16:06:11 +0000 (16:06 +0000)] 
[console] Avoid attempting to remap numeric keypad on BIOS console

To minimise code size, our keyboard mapping works on the basis of
allowing the BIOS to convert the keyboard scancode into an ASCII
character and then remapping the ASCII character.

This causes problems with keyboard layouts such as "fr" that swap the
shifted and unshifted digit keys, since the ASCII-based remapping will
spuriously remap the numeric keypad (which produces the same ASCII
values as the digit keys).

Fix by checking that the keyboard scancode is within the range of keys
that vary between keyboard mappings before attempting to remap the
ASCII character.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[console] Generalise bios_keymap() as key_remap()
Michael Brown [Wed, 9 Feb 2022 15:54:39 +0000 (15:54 +0000)] 
[console] Generalise bios_keymap() as key_remap()

Allow the keyboard remapping functionality to be exposed to consoles
other than the BIOS console.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[efi] Enable IMAGE_GZIP by default for AArch64
Michael Brown [Thu, 10 Feb 2022 12:47:25 +0000 (12:47 +0000)] 
[efi] Enable IMAGE_GZIP by default for AArch64

AArch64 kernels tend to be distributed as gzip compressed images.
Enable IMAGE_GZIP by default for AArch64 to avoid the need for
uncompressed images to be provided.

Originally-implemented-by: Alessandro Di Stefano <aleskandro@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 months ago[prefix] Fix use of writable code segment on 486 and earlier CPUs
Michael Brown [Wed, 2 Feb 2022 03:26:20 +0000 (03:26 +0000)] 
[prefix] Fix use of writable code segment on 486 and earlier CPUs

In real mode, code segments are always writable.  In protected mode,
code segments can never be writable.  The precise implementation of
this attribute differs between CPU generations, with subtly different
behaviour arising on the transitions from protected mode to real mode.

At the point of transition (when the PE bit is cleared in CR0) the
hidden portion of the %cs descriptor will retain whatever attributes
were in place for the protected-mode code segment, including the fact
that the segment is not writable.  The immediately following code will
perform a far control flow transfer (such as ljmp or lret) in order to
load a real-mode value into %cs.

On the Pentium and later CPUs, the retained protected-mode attributes
will be ignored for any accesses via %cs while the CPU is in real
mode.  A write via %cs will therefore be allowed even though the
hidden portion of the %cs descriptor still describes a non-writable

On the 486 and earlier CPUs, the retained protected-mode attributes
will not be ignored for accesses via %cs.  A write via %cs will
therefore cause a CPU fault.  To obtain normal real-mode behaviour
(i.e. a writable %cs descriptor), special logic is added to the ljmp
instruction that populates the hidden portion of the %cs descriptor
with real-mode attributes when a far jump is executed in real mode.
The result is that writes via %cs will cause a CPU fault until the
first ljmp instruction is executed, after which writes via %cs will be
allowed as expected in real mode.

The transition code in libprefix.S currently uses lret to load a
real-mode value into %cs after clearing the PE bit.  Experimentation
shows that only the ljmp instruction will work to load real-mode
attributes into the hidden portion of the %cs descriptor: other far
control flow transfers (such as lret, lcall, or int) do not do so.

When running on a 486 or earlier CPU, this results in code within
libprefix.S running with a non-writable code segment after a mode
transition, which in turn results in a CPU fault when real-mode code
in liba20.S attempts to write to %cs:enable_a20_method.

Fix by constructing and executing an ljmp instruction, to trigger the
relevant descriptor population logic on 486 and earlier CPUs.  This
ljmp instruction is constructed on the stack, since the .prefix
section may be executing directly from ROM (or from memory that the
BIOS has write-protected in order to emulate an ISA ROM region) and so
cannot be modified.

Reported-by: Nikolai Zhubr <n-a-zhubr@yandex.ru>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[efi] Attempt to fetch autoexec script via TFTP
Michael Brown [Mon, 17 Jan 2022 16:17:17 +0000 (16:17 +0000)] 
[efi] Attempt to fetch autoexec script via TFTP

Attempt to fetch the autoexec.ipxe script via TFTP using the PXE base
code protocol installed on the loaded image's device handle, if

This provides a generic alternative to the use of an embedded script
for chainloaded binaries, which is particularly useful in a UEFI
Secure Boot environment since it allows the script to be modified
without the need to sign a new binary.

As a side effect, this also provides a third method for breaking the
PXE chainloading loop (as an alternative to requiring an embedded
script or custom DHCP server configuration).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[efi] Allow for autoexec scripts that are not located in a filesystem
Michael Brown [Mon, 17 Jan 2022 16:11:56 +0000 (16:11 +0000)] 
[efi] Allow for autoexec scripts that are not located in a filesystem

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[uri] Allow for relative URIs that include colons within the path uricolon
Michael Brown [Thu, 13 Jan 2022 14:53:36 +0000 (14:53 +0000)] 
[uri] Allow for relative URIs that include colons within the path

RFC3986 allows for colons to appear within the path component of a
relative URI, but iPXE will currently parse such URIs incorrectly by
interpreting the text before the colon as the URI scheme.

Fix by checking for valid characters when identifying the URI scheme.
Deliberately deviate from the RFC3986 definition of valid characters
by accepting "_" (which was incorrectly used in the iPXE-specific
"ib_srp" URI scheme and so must be accepted for compatibility with
existing deployments), and by omitting the code to check for
characters that are not used in any URI scheme supported by iPXE.

Reported-by: Ignat Korchagin <ignat@cloudflare.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[efi] Include Secure Boot Advanced Targeting (SBAT) metadata sbat
Michael Brown [Thu, 13 Jan 2022 14:10:03 +0000 (14:10 +0000)] 
[efi] Include Secure Boot Advanced Targeting (SBAT) metadata

SBAT defines an encoding for security generation numbers stored as a
CSV file within a special ".sbat" section in the signed binary.  If a
Secure Boot exploit is discovered then the generation number will be
incremented alongside the corresponding fix.

Platforms may then record the minimum generation number required for
any given product.  This allows for an efficient revocation mechanism
that consumes minimal flash storage space (in contrast to the DBX
mechanism, which allows for only a single-digit number of revocation
events to ever take place across all possible signed binaries).

Add SBAT metadata to iPXE EFI binaries to support this mechanism.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[build] Ensure version.%.o is always rebuilt as expected
Michael Brown [Thu, 13 Jan 2022 13:43:08 +0000 (13:43 +0000)] 
[build] Ensure version.%.o is always rebuilt as expected

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[doc] Update user-visible ipxe.org URIs to use HTTPS
Michael Brown [Thu, 13 Jan 2022 12:48:38 +0000 (12:48 +0000)] 
[doc] Update user-visible ipxe.org URIs to use HTTPS

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[efi] Do not align VirtualSize for .reloc and .debug sections
Michael Brown [Tue, 11 Jan 2022 15:27:14 +0000 (15:27 +0000)] 
[efi] Do not align VirtualSize for .reloc and .debug sections

As of commit f1e9e2b ("[efi] Align EFI image sections by page size"),
the VirtualSize fields for the .reloc and .debug sections have been
rounded up to the (4kB) image alignment.  This breaks the PE
relocation logic in the UEFI shim, which requires the VirtualSize
field to exactly match the size as recorded in the data directory.

Fix by setting the VirtualSize field to the unaligned size of the
section, as is already done for normal PE sections (i.e. those other
than .reloc and .debug).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
5 months ago[settings] Support formatting UUIDs as little-endian GUIDs
Michael Brown [Tue, 4 Jan 2022 13:31:15 +0000 (13:31 +0000)] 
[settings] Support formatting UUIDs as little-endian GUIDs

The RFC4122 specification defines UUIDs as being in network byte
order, but an unfortunately significant amount of (mostly Microsoft)
software treats them as having the first three fields in little-endian
byte order.

In an ideal world, any server-side software that compares UUIDs for
equality would perform an endian-insensitive comparison (analogous to
comparing strings for equality using a case-insensitive comparison),
and would therefore not care about byte order differences.

Define a setting type name ":guid" to allow a UUID setting to be
formatted in little-endian order, to simplify interoperability with
server-side software that expects such a formatting.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[efi] Disable EFI watchdog timer when shutting down to boot an OS
Michael Brown [Wed, 24 Nov 2021 15:43:46 +0000 (15:43 +0000)] 
[efi] Disable EFI watchdog timer when shutting down to boot an OS

The UEFI specification mandates that the EFI watchdog timer should be
disabled by the platform firmware as part of the ExitBootServices()
call, but some platforms (e.g. Hyper-V) are observed to occasionally
forget to do so, resulting in a reboot approximately five minutes
after starting the operating system.

Work around these firmware bugs by disabling the watchdog timer

Requested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[efi] Run ExitBootServices shutdown hook at TPL_NOTIFY
Michael Brown [Mon, 22 Nov 2021 14:53:33 +0000 (14:53 +0000)] 
[efi] Run ExitBootServices shutdown hook at TPL_NOTIFY

On some systems (observed with the Thunderbolt ports on a ThinkPad X1
Extreme Gen3 and a ThinkPad P53), if the IOMMU is enabled then the
system firmware will install an ExitBootServices notification event
that disables bus mastering on the Thunderbolt xHCI controller and all
PCI bridges, and destroys any extant IOMMU mappings.  This leaves the
xHCI controller unable to perform any DMA operations.

As described in commit 236299b ("[xhci] Avoid DMA during shutdown if
firmware has disabled bus mastering"), any subsequent DMA operation
attempted by the xHCI controller will end up completing after the
operating system kernel has reenabled bus mastering, resulting in a
DMA operation to an area of memory that the hardware is no longer
permitted to access and, on Windows with the Driver Verifier enabled,

That commit avoids triggering any DMA attempts during the shutdown of
the xHCI controller itself.  However, this is not a complete solution
since any attached and opened USB device (e.g. a USB NIC) may
asynchronously trigger DMA attempts that happen to occur after bus
mastering has been disabled but before we reset the xHCI controller.

Avoid this problem by installing our own ExitBootServices notification
event at TPL_NOTIFY, thereby causing it to be invoked before the
firmware's own ExitBootServices notification event that disables bus

This unsurprisingly causes the shutdown hook itself to be invoked at
TPL_NOTIFY, which causes a fatal error when later code attempts to
raise the TPL to TPL_CALLBACK (which is a lower TPL).  Work around
this problem by redefining the "internal" iPXE TPL to be variable, and
set this internal TPL to TPL_NOTIFY when the shutdown hook is invoked.

Avoid calling into an underlying SNP protocol instance from within our
shutdown hook at TPL_NOTIFY, since the underlying SNP driver may
attempt to raise the TPL to TPL_CALLBACK (which would cause a fatal
error).  Failing to shut down the underlying SNP device is safe to do
since the underlying device must, in any case, have installed its own
ExitBootServices hook if any shutdown actions are required.

Reported-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[build] Include EFI system partition table entry in isohybrid images
Michael Brown [Tue, 23 Nov 2021 15:20:09 +0000 (15:20 +0000)] 
[build] Include EFI system partition table entry in isohybrid images

Add the "--uefi" option when invoking isohybrid on an EFI-bootable
image, to create a partition mapping to the EFI system partition
embedded within the ISO image.

This allows the resulting isohybrid image to be booted on UEFI systems
that will not recognise an El Torito boot catalog on a non-CDROM

Originally-fixed-by: Christian Hesse <mail@eworm.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[efi] Raise TPL during driver unload entry point
Michael Brown [Mon, 22 Nov 2021 12:50:38 +0000 (12:50 +0000)] 
[efi] Raise TPL during driver unload entry point

The efi_unload() function is currently missing the calls to raise and
restore the TPL.  This has the side effect of causing iPXE to return
from the driver unload entry point at TPL_CALLBACK, which will cause
unexpected behaviour (typically a system lockup) shortly afterwards.

Fix by adding the missing calls to raise and restore the TPL.

Debugged-by: Petr Borsodi <petr.borsodi@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[intel] Add PCI ID for Intel X553 0x15e4
Benedikt Braunger [Tue, 16 Nov 2021 12:42:14 +0000 (13:42 +0100)] 
[intel] Add PCI ID for Intel X553 0x15e4

Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[efi] Modify global system table when wrapping a loaded image
Michael Brown [Sun, 21 Nov 2021 13:27:14 +0000 (13:27 +0000)] 
[efi] Modify global system table when wrapping a loaded image

The EFI loaded image protocol allows an image to be provided with a
custom system table, and we currently use this mechanism to wrap any
boot services calls made by the loaded image in order to provide
strace-like debugging via DEBUG=efi_wrap.

The ExitBootServices() call will modify the global system table,
leaving the loaded image using a system table that is no longer
current.  When DEBUG=efi_wrap is used, this generally results in the
machine locking up at the point that the loaded operating system calls

Fix by modifying the global EFI system table to point to our wrapper
functions, instead of providing a custom system table via the loaded
image protocol.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[efi] Do not attempt to use console output after ExitBootServices()
Michael Brown [Sun, 21 Nov 2021 13:19:55 +0000 (13:19 +0000)] 
[efi] Do not attempt to use console output after ExitBootServices()

A successful call to ExitBootServices() will result in the EFI console
becoming unusable.  Ensure that the EFI wrapper produces a complete
line of debug output before calling the wrapped ExitBootServices()
method, and attempt subsequent debug output only if the call fails.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[xhci] Avoid DMA during shutdown if firmware has disabled bus mastering
Michael Brown [Fri, 12 Nov 2021 15:57:51 +0000 (15:57 +0000)] 
[xhci] Avoid DMA during shutdown if firmware has disabled bus mastering

On some systems (observed with the Thunderbolt ports on a ThinkPad X1
Extreme Gen3 and a ThinkPad P53), the system firmware will disable bus
mastering on the xHCI controller and all PCI bridges at the point that
ExitBootServices() is called if the IOMMU is enabled.  This leaves the
xHCI controller unable to shut down cleanly since all commands will
fail with a timeout.

Commit 85eb961 ("[xhci] Allow for permanent failure of the command
mechanism") allows us to detect that this has happened and respond
cleanly.  However, some unidentified hardware component (either the
xHCI controller or one of the PCI bridges) seems to manage to enqueue
the attempted DMA operation and eventually complete it after the
operating system kernel has reenabled bus mastering.  This results in
a DMA operation to an area of memory that the hardware is no longer
permitted to access.  On Windows with the Driver Verifier enabled,
this will result in a STOP 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION).

Work around this problem by detecting when bus mastering has been
disabled, and immediately failing the device to avoid initiating any
further DMA attempts.

Reported-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
7 months ago[uri] Retain original encodings for path, query, and fragment fields
Michael Brown [Thu, 11 Nov 2021 23:31:23 +0000 (23:31 +0000)] 
[uri] Retain original encodings for path, query, and fragment fields

iPXE decodes any percent-encoded characters during the URI parsing
stage, thereby allowing protocol implementations to consume the raw
field values directly without further decoding.

When reconstructing a URI string for use in an HTTP request line, the
percent-encoding is currently reapplied in a reversible way: we
guarantee that our reconstructed URI string could be decoded to give
the same raw field values.

This technically violates RFC3986, which states that "URIs that differ
in the replacement of a reserved character with its corresponding
percent-encoded octet are not equivalent".  Experiments show that
several HTTP server applications will attach meaning to the choice of
whether or not a particular character was percent-encoded, even when
the percent-encoding is unnecessary from the perspective of parsing
the URI into its component fields.

Fix by storing the originally encoded substrings for the path, query,
and fragment fields and using these original encoded versions when
reconstructing a URI string.  The path field is also stored as a
decoded string, for use by protocols such as TFTP that communicate
using raw strings rather than URI-encoded strings.  All other fields
(such as the username and password) continue to be stored only in
their decoded versions since nothing ever needs to know the originally
encoded versions of these fields.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 months ago[xhci] Allow for permanent failure of the command mechanism
Michael Brown [Wed, 27 Oct 2021 23:38:02 +0000 (00:38 +0100)] 
[xhci] Allow for permanent failure of the command mechanism

Some xHCI controllers (observed with the Thunderbolt ports on a
ThinkPad X1 Extreme Gen3 and a ThinkPad P53) seem to suffer a
catastrophic failure at the point that ExitBootServices() is called if
the IOMMU is enabled.  The symptoms appear to be consistent with
another UEFI driver (e.g. the IOMMU driver, or the Thunderbolt driver)
having torn down the DMA mappings, leaving the xHCI controller unable
to write to host memory.  The observable effect is that all commands
fail with a timeout, and attempts to abort command execution similarly
fail since the xHCI controller is unable to report the abort

Check for failure to abort a command, and respond by performing a full
device reset (as recommended by the xHCI specification) and by marking
the device as permanently failed.

Reported-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
8 months ago[virtio] Update driver to use DMA API
Aaron Young [Wed, 27 Oct 2021 23:05:43 +0000 (16:05 -0700)] 
[virtio] Update driver to use DMA API

Signed-off-by: Aaron Young <aaron.young@oracle.com>
9 months ago[readline] Extend maximum read line length to 1024 characters
Michael Brown [Fri, 10 Sep 2021 14:34:57 +0000 (15:34 +0100)] 
[readline] Extend maximum read line length to 1024 characters

Realistic Linux kernel command lines may exceed our current 256
character limit for interactively edited commands or settings.

Switch from stack allocation to heap allocation, and increase the
limit to 1024 characters.

Requested-by: Matteo Guglielmi <Matteo.Guglielmi@dalco.ch>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 months ago[ecm] Use ACPI-provided system-specific MAC address if present
Michael Brown [Wed, 8 Sep 2021 13:29:36 +0000 (14:29 +0100)] 
[ecm] Use ACPI-provided system-specific MAC address if present

Use the "system MAC address" provided within the DSDT/SSDT if such an
address is available and has not already been assigned to a network

Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 months ago[ecm] Expose USB vendor/device information to ecm_fetch_mac()
Michael Brown [Wed, 8 Sep 2021 13:23:21 +0000 (14:23 +0100)] 
[ecm] Expose USB vendor/device information to ecm_fetch_mac()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 months ago[acpi] Allow for extraction of a MAC address from the DSDT/SSDT
Michael Brown [Wed, 8 Sep 2021 12:50:20 +0000 (13:50 +0100)] 
[acpi] Allow for extraction of a MAC address from the DSDT/SSDT

Some vendors provide a "system MAC address" within the DSDT/SSDT, to
be used to override the MAC address for a USB docking station.

A full implementation would require an ACPI bytecode interpreter,
since at least one OEM allows the MAC address to be constructed by
executable ACPI bytecode (rather than a fixed data structure).

We instead attempt to extract a plausible-looking "_AUXMAC_#.....#"
string that appears shortly after an "AMAC" or "MACA" signature.  This
should work for most implementations encountered in practice.

Debugged-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
9 months ago[acpi] Generalise DSDT/SSDT data extraction logic
Michael Brown [Wed, 8 Sep 2021 11:53:12 +0000 (12:53 +0100)] 
[acpi] Generalise DSDT/SSDT data extraction logic

Allow for the DSDT/SSDT signature-scanning and value extraction code
to be reused for extracting a pass-through MAC address.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
11 months ago[efi] Record cached ProxyDHCPOFFER and PXEBSACK, if present
Michael Brown [Fri, 23 Jul 2021 10:32:04 +0000 (11:32 +0100)] 
[efi] Record cached ProxyDHCPOFFER and PXEBSACK, if present

Commit cd3de55 ("[efi] Record cached DHCPACK from loaded image's
device handle, if present") added the ability for a chainloaded UEFI
iPXE to reuse an IPv4 address and DHCP options previously obtained by
a built-in PXE stack, without needing to perform a second DHCP

Extend this to also record the cached ProxyDHCPOFFER and PXEBSACK
obtained from the EFI_PXE_BASE_CODE_PROTOCOL instance installed on the
loaded image's device handle, if present.

This allows a chainloaded UEFI iPXE to reuse a boot filename or other
options that were provided via a ProxyDHCP or PXE boot server
mechanism, rather than by standard DHCP.

Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
11 months ago[efi] Use zero for PCI vendor/device IDs when no applicable ID exists
Michael Brown [Mon, 26 Jul 2021 14:42:00 +0000 (15:42 +0100)] 
[efi] Use zero for PCI vendor/device IDs when no applicable ID exists

When building an EFI ROM image for which no PCI vendor/device ID is
applicable (e.g. bin-x86_64-efi/ipxe.efirom), the build process will
currently construct a command such as

  ./util/efirom -v -d -c bin-x86_64-efi/ipxe.efidrv \

which gets interpreted as a vendor ID of "-0xd" (i.e. 0xfff3, after
truncation to 16 bits).

Fix by using an explicit zero ID when no applicable ID exists, as is
already done when constructing BIOS ROM images.

Reported-by: Konstantin Aladyshev <aladyshev22@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
11 months ago[build] Fix genfsimg to work with FATDIR with space
JuniorJPDJ [Thu, 8 Jul 2021 08:47:29 +0000 (10:47 +0200)] 
[build] Fix genfsimg to work with FATDIR with space

Signed-off-by: Michael Brown <mcb30@ipxe.org>
11 months ago[cloud] Retry DHCP aggressively in AWS EC2
Michael Brown [Tue, 20 Jul 2021 12:19:15 +0000 (13:19 +0100)] 
[cloud] Retry DHCP aggressively in AWS EC2

The DHCP service in EC2 has been observed to occasionally stop
responding for bursts of several seconds.  This can easily result in a
failed boot, since the current cloud boot script will attempt DHCP
only once.

Work around this problem by retrying DHCP in a fairly tight cycle
within the cloud boot script, and falling back to a reboot after
several failed DHCP attempts.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
11 months ago[efi] Match signtool expectations for file alignment
Michael Brown [Thu, 15 Jul 2021 14:32:31 +0000 (15:32 +0100)] 
[efi] Match signtool expectations for file alignment

As of commit f1e9e2b ("[efi] Align EFI image sections by page size"),
our SectionAlignment has been increased to 4kB in order to allow for
page-level memory protection to be applied by the UEFI firmware, with
FileAlignment left at 32 bytes.

The PE specification states that the value for FileAlignment "should
be a power of 2 between 512 and 64k, inclusive", and that "if the
SectionAlignment is less than the architecture's page size, then
FileAlignment must match SectionAlignment".

Testing shows that signtool.exe will reject binaries where
FileAlignment is less than 512, unless FileAlignment is equal to
SectionAlignment.  This indicates a somewhat zealous interpretation of
the word "should" in the PE specification.

Work around this interpretation by increasing FileAlignment from 32
bytes to 512 bytes, and add explanatory comments for both
FileAlignment and SectionAlignment.

Debugged-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
11 months ago[libc] Allow for externally-defined LITTLE_ENDIAN and BIG_ENDIAN constants
Michael Brown [Thu, 15 Jul 2021 12:46:34 +0000 (13:46 +0100)] 
[libc] Allow for externally-defined LITTLE_ENDIAN and BIG_ENDIAN constants

When building the Linux userspace binaries, the external system
headers may have already defined values for the __LITTLE_ENDIAN and
__BIG_ENDIAN constants.

Fix by retaining the existing values if already defined, since the
actual values of these constants do not matter.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[uri] Make URI schemes case-insensitive
Michael Brown [Thu, 1 Jul 2021 15:32:46 +0000 (16:32 +0100)] 
[uri] Make URI schemes case-insensitive

RFC 3986 section 3.1 defines URI schemes as case-insensitive (though
the canonical form is always lowercase).

Use strcasecmp() rather than strcmp() to allow for case insensitivity
in URI schemes.

Requested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[rdc] Add driver for RDC R6040 embedded NIC
Michael Brown [Mon, 28 Jun 2021 11:32:19 +0000 (12:32 +0100)] 
[rdc] Add driver for RDC R6040 embedded NIC

Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[realtek] Work around hardware bug on RTL8211B
Michael Brown [Tue, 22 Jun 2021 13:48:10 +0000 (14:48 +0100)] 
[realtek] Work around hardware bug on RTL8211B

The RTL8211B seems to have a bug that prevents the link from coming up
unless the MII_MMD_DATA register is cleared.

The Linux kernel driver applies this workaround (in rtl8211b_resume())
only to the specific RTL8211B PHY model, along with a matching
workaround to set bit 9 of MII_MMD_DATA when suspending the PHY.
Since we have no need to ever suspend the PHY, and since writing a
zero ought to be harmless, we just clear the register unconditionally.

Debugged-by: Nikolay Pertsev <nikolay.p@cos.flag.org>
Tested-by: Nikolay Pertsev <nikolay.p@cos.flag.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[cloud] Show ifstat output after a failed boot attempt
Michael Brown [Wed, 23 Jun 2021 09:22:38 +0000 (10:22 +0100)] 
[cloud] Show ifstat output after a failed boot attempt

Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[peerdist] Assume that most recently discovered peer can be reused
Michael Brown [Thu, 17 Jun 2021 14:29:22 +0000 (15:29 +0100)] 
[peerdist] Assume that most recently discovered peer can be reused

The peer discovery time has a significant impact on the overall
PeerDist download speed, since each block requires an individual
discovery attempt.  In most cases, a peer that responds for block N
will turn out to also respond for block N+1.

Assume that the most recently discovered peer (for any block) probably
has a copy of the next block to be discovered, thereby allowing the
peer download attempt to begin immediately.

In the case that this assumption is incorrect, the existing error
recovery path will allow for fallback to newly discovered peers (or to
the origin server).

Suggested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Tested-by: Andreas Hammarskjöld <junior@2PintSoftware.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[build] Fix building on broken versions of GNU binutils
Michael Brown [Thu, 17 Jun 2021 13:32:23 +0000 (14:32 +0100)] 
[build] Fix building on broken versions of GNU binutils

Some versions of GNU objcopy (observed with binutils on
CentOS 7.0.1406) document the -D/--enable-deterministic-archives
option but fail to recognise the short form of the option.

Work around this problem by using the long form of the option.

Reported-by: Olaf Hering <olaf@aepfle.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[build] Ensure build ID is deterministic
Bernhard M. Wiedemann [Sat, 12 Jun 2021 19:55:43 +0000 (21:55 +0200)] 
[build] Ensure build ID is deterministic

Commit 040cdd0 ("[linux] Add a prefix to all symbols to avoid future
name collisions") unintentionally reintroduced an element of
non-determinism into the build ID, by omitting the -D option when
manipulating the blib.a archive.

Fix by adding the -D option to restore determinism.

Reworded-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[efi] Veto the Itautec Ip4ConfigDxe driver itautec
Michael Brown [Fri, 11 Jun 2021 13:46:54 +0000 (14:46 +0100)] 
[efi] Veto the Itautec Ip4ConfigDxe driver

The Ip4ConfigDxe driver bug that was observed on Dell systems in
commit 64b4452 ("[efi] Blacklist the Dell Ip4ConfigDxe driver") has
also been observed on systems with a manufacturer name of "Itautec
S.A.".  The symptoms of the bug are identical: an attempt to call
DisconnectController() on the LOM device handle will lock up the

Fix by extending the veto to cover the Ip4ConfigDxe driver for this

Debugged-by: Celso Viana <celso.vianna@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[libc] Match standard prototype for putchar()
Michael Brown [Mon, 7 Jun 2021 12:26:01 +0000 (13:26 +0100)] 
[libc] Match standard prototype for putchar()

Reported-by: Bernhard M. Wiedemann <bwiedemann@suse.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[base64] Include terminating NUL within base64 character array
Michael Brown [Mon, 7 Jun 2021 12:18:19 +0000 (13:18 +0100)] 
[base64] Include terminating NUL within base64 character array

Reported-by: Bernhard M. Wiedemann <bwiedemann@suse.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[rndis] Fix size of reserved fields rndis_padding
Michael Brown [Mon, 7 Jun 2021 11:01:10 +0000 (12:01 +0100)] 
[rndis] Fix size of reserved fields

Most RNDIS data structures include a trailing 4-byte reserved field.
structures, this is an 8-byte field instead.

iPXE currently uses incorrect structure definitions with a 4-byte
reserved field in all data structures, resulting in data payloads that
overlap the last 4 bytes of the 8-byte reserved field.

RNDIS uses explicit offsets to locate any data payloads beyond the
message header, and so liberal RNDIS parsers (such as those used in
Hyper-V and in the Linux USB Ethernet gadget driver) are still able to
parse the malformed structures.

A stricter RNDIS parser (such as that found in some older Android
builds that seem to use an out-of-tree USB Ethernet gadget driver) may
reject the malformed structures since the data payload offset is less
than the header length, causing iPXE to be unable to transmit packets.

Fix by correcting the length of the reserved fields.

Debugged-by: Martin Nield <pmn1492@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
12 months ago[ath5k] Avoid returning uninitialised data on EEPROM read errors
Michael Brown [Fri, 4 Jun 2021 13:16:44 +0000 (14:16 +0100)] 
[ath5k] Avoid returning uninitialised data on EEPROM read errors

Originally-implemented-by: Bernhard M. Wiedemann <bwiedemann@suse.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[crypto] Add memory output constraints for big-integer inline assembly bigint_output_constraints
Michael Brown [Thu, 3 Jun 2021 12:34:14 +0000 (13:34 +0100)] 
[crypto] Add memory output constraints for big-integer inline assembly

The ARM versions of the big-integer inline assembly functions include
constraints to indicate that the output value is modified by the
assembly code.  These constraints are not present in the equivalent
code for the x86 versions.

As of GCC 11, this results in the compiler reporting that the output
values may be uninitialized.

Fix by including the relevant memory output constraints.

Reported-by: Christian Hesse <mail@eworm.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[build] Use SOURCE_DATE_EPOCH for isohybrid MBR ID if it exists
Michael Brown [Mon, 24 May 2021 14:38:54 +0000 (15:38 +0100)] 
[build] Use SOURCE_DATE_EPOCH for isohybrid MBR ID if it exists

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[build] Use SOURCE_DATE_EPOCH for .iso timestamps if it exists
Michael Brown [Mon, 24 May 2021 14:26:07 +0000 (15:26 +0100)] 
[build] Use SOURCE_DATE_EPOCH for .iso timestamps if it exists

Originally-implemented-by: Bernhard M. Wiedemann <bwiedemann@suse.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[efi] Provide an "initrd.magic" file for use by UEFI kernels
Michael Brown [Fri, 21 May 2021 13:27:27 +0000 (14:27 +0100)] 
[efi] Provide an "initrd.magic" file for use by UEFI kernels

Provide a file "initrd.magic" via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
that contains the initrd file as constructed for BIOS bzImage kernels
(including injected files with CPIO headers constructed by iPXE).

This allows BIOS and UEFI kernels to obtain the exact same initramfs
image, by adding "initrd=initrd.magic" to the kernel command line.
For example:

  kernel boot/vmlinuz initrd=initrd.magic
  initrd boot/initrd.img
  initrd boot/modules/e1000.ko      /lib/modules/e1000.ko
  initrd boot/modules/af_packet.ko  /lib/modules/af_packet.ko

Do not include the "initrd.magic" file within the root directory
listing, since doing so would break software such as wimboot that
processes all files within the root directory.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[efi] Allow for non-image-backed virtual files
Michael Brown [Tue, 18 May 2021 13:03:15 +0000 (14:03 +0100)] 
[efi] Allow for non-image-backed virtual files

Restructure the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL implementation to
allow for the existence of virtual files that are not simply backed by
a single underlying image.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[cpio] Split out bzImage initrd CPIO header construction
Michael Brown [Mon, 17 May 2021 13:57:48 +0000 (14:57 +0100)] 
[cpio] Split out bzImage initrd CPIO header construction

iPXE will construct CPIO headers for images that have a non-empty
command line, thereby allowing raw images (without CPIO headers) to be
injected into a dynamically constructed initrd.  This feature is
currently implemented within the BIOS-only bzImage format support.

Split out the CPIO header construction logic to allow for reuse in
other contexts such as in a UEFI build.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[x509] Use case-insensitive comparison for certificate names
Michael Brown [Tue, 18 May 2021 10:46:28 +0000 (11:46 +0100)] 
[x509] Use case-insensitive comparison for certificate names

DNS names are case-insensitive, and RFC 5280 (unlike RFC 3280)
mandates support for case-insensitive name comparison in X.509

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[libc] Add strncasecmp()
Michael Brown [Tue, 18 May 2021 10:45:24 +0000 (11:45 +0100)] 
[libc] Add strncasecmp()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[bnxt] Use hexadecimal values in PCI_ROM entries
Joseph [Fri, 23 Apr 2021 03:07:53 +0000 (20:07 -0700)] 
[bnxt] Use hexadecimal values in PCI_ROM entries

Use hexadecimal values instead of macros in PCI_ROM entries so Perl
script can parse them correctly.  Move PCI_ROM entries from header
file to C file.  Integrate bnxt_vf_nics array into PCI_ROM entries by
introducing BNXT_FLAG_PCI_VF flag into driver_data field.  Add
whitespaces in PCI_ROM entries for style consistency.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[intel] Add PCI ID for I219-V and -LM 10 to 15
Christian Nilsson [Thu, 14 Feb 2019 20:56:11 +0000 (21:56 +0100)] 
[intel] Add PCI ID for I219-V and -LM 10 to 15

Signed-off-by: Christian Nilsson <nikize@gmail.com>
13 months ago[image] Support archive image formats independently of "imgextract" command
Michael Brown [Wed, 12 May 2021 13:37:57 +0000 (14:37 +0100)] 
[image] Support archive image formats independently of "imgextract" command

Support for the zlib and gzip archive image formats is currently
included only if the IMAGE_ARCHIVE_CMD is used to enable the
"imgextract" command.

The ability to transparently execute a single-member archive image
without using the "imgextract" command renders this unintuitive: a
user wanting to gain the ability to boot a gzip-compressed kernel
image would expect to have to enable IMAGE_GZIP rather than

Reverse the inclusion logic, so that archive image formats must now be
enabled explicitly (via IMAGE_GZIP and/or IMAGE_ZLIB), with the
archive image management commands dragged in as needed if any archive
image formats are enabled.  The archive image management commands may
be explicitly disabled via IMAGE_ARCHIVE_CMD if necessary.

This matches the behaviour of IBMGMT_CMD and similar options, where
the relevant commands are included only when something else already
drags in the underlying feature.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[image] Propagate trust flag to extracted archive images
Michael Brown [Wed, 12 May 2021 13:13:01 +0000 (14:13 +0100)] 
[image] Propagate trust flag to extracted archive images

An extracted image is wholly derived from the original archive image.
If the original archive image has been verified and marked as trusted,
then this trust logically extends to any image extracted from it.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[image] Allow single-member archive images to be executed transparently
Michael Brown [Wed, 12 May 2021 12:54:59 +0000 (13:54 +0100)] 
[image] Allow single-member archive images to be executed transparently

Provide image_extract_exec() as a helper method to allow single-member
archive images (such as gzip compressed images) to be executed without
an explicit "imgextract" step.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[undi] Read TSC only when profiling
Michael Brown [Wed, 12 May 2021 09:55:17 +0000 (10:55 +0100)] 
[undi] Read TSC only when profiling

Avoid using the "rdtsc" instruction unless profiling is enabled.  This
allows the non-debug build of the UNDI driver to be used on a CPU such
as a 486 that does not support the TSC.

Reported-by: Nikolai Zhubr <n-a-zhubr@yandex.ru>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[rng] Check for TSC support before using RTC entropy source
Michael Brown [Wed, 12 May 2021 09:24:00 +0000 (10:24 +0100)] 
[rng] Check for TSC support before using RTC entropy source

Signed-off-by: Michael Brown <mcb30@ipxe.org>
13 months ago[prefix] Specify i486 architecture for LZMA decompressor
Michael Brown [Wed, 12 May 2021 09:09:33 +0000 (10:09 +0100)] 
[prefix] Specify i486 architecture for LZMA decompressor

The decompressor uses the i486 "bswap" instruction, but does not
require any instructions that exist only on i586 or above.  Update the
".arch" directive to reflect the requirements of the code as

Reported-by: Martin Habets <habetsm.xilinx@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>