ipxe.git
3 years ago[int13] Test correct return status from INT 13 calls
Michael Brown [Thu, 26 Jan 2017 09:45:19 +0000 (09:45 +0000)] 
[int13] Test correct return status from INT 13 calls

INT 13 calls return a status value via %ah, with CF set if %ah is
non-zero (indicating an error).  Our wrappers zero the whole of %ax if
CF is clear, to allow C code (which has no easy access to CF) to
simply test for a non-zero status to detect an error.

The current code assigns the returned status to a uint8_t, effectively
testing %al rather than %ah.  Fix by treating the returned status as a
uint16_t instead.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[int13] Avoid potential division by zero
Michael Brown [Thu, 26 Jan 2017 09:31:40 +0000 (09:31 +0000)] 
[int13] Avoid potential division by zero

Avoid using a zero sector count to guess the disk geometry, since that
would result in a division by zero when calculating the number of
cylinders.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[hyperv] Provide timer based on the 10MHz time reference count MSR
Michael Brown [Thu, 26 Jan 2017 08:03:11 +0000 (08:03 +0000)] 
[hyperv] Provide timer based on the 10MHz time reference count MSR

When running on AMD platforms, the legacy hardware emulation is
extremely unreliable.  In particular, the IRQ0 timer interrupt is
likely to simply stop working, resulting in a total failure of any
code that relies on timers (such as DHCP retransmission attempts).

Work around this by using the 10MHz time counter provided by Hyper-V
via an MSR.  (This timer can be tested in KVM via the command-line
option "-cpu host,hv_time".)

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[time] Allow timer to be selected at runtime
Michael Brown [Wed, 25 Jan 2017 20:59:15 +0000 (20:59 +0000)] 
[time] Allow timer to be selected at runtime

Allow the active timer (providing udelay() and currticks()) to be
selected at runtime based on probing during the INIT_EARLY stage of
initialisation.

TICKS_PER_SEC is now a fixed compile-time constant for all builds, and
is independent of the underlying clock tick rate.  We choose the value
1024 to allow multiplications and divisions on seconds to be converted
to bit shifts.

TICKS_PER_MS is defined as 1, allowing multiplications and divisions
on milliseconds to be omitted entirely.  The 2% inaccuracy in this
definition is negligible when using the standard BIOS timer (running
at around 18.2Hz).

TIMER_RDTSC now checks for a constant TSC before claiming to be a
usable timer.  (This timer can be tested in KVM via the command-line
option "-cpu host,+invtsc".)

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[cpuid] Provide cpuid_supported() to test for supported functions
Michael Brown [Wed, 25 Jan 2017 20:57:18 +0000 (20:57 +0000)] 
[cpuid] Provide cpuid_supported() to test for supported functions

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[netdevice] Limit MTU by hardware maximum frame length
Michael Brown [Wed, 25 Jan 2017 14:48:24 +0000 (14:48 +0000)] 
[netdevice] Limit MTU by hardware maximum frame length

Separate out the concept of "hardware maximum supported frame length"
and "configured link MTU", and limit the latter according to the
former.

In networks where the DHCP-supplied link MTU is inconsistent with the
hardware or driver capabilities (e.g. a network using jumbo frames),
this will result in iPXE advertising a TCP MSS consistent with a size
that can actually be received.

Note that the term "MTU" is typically used to refer to the maximum
length excluding the link-layer headers; we adopt this usage.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[interface] Unplug interface before calling intf_close() in intf_shutdown()
Michael Brown [Wed, 25 Jan 2017 10:19:02 +0000 (10:19 +0000)] 
[interface] Unplug interface before calling intf_close() in intf_shutdown()

The call to intf_close() may result in the original interface being
reopened.  For example: when reading the capacity of a 2TB+ disk via
iSCSI, the SCSI layer will respond to the intf_close() from the READ
CAPACITY (10) command by immediately issuing a READ CAPACITY (16)
command.  The iSCSI layer happens to reuse the same interface for the
new command (since it allows only a single concurrent command).

Currently, intf_shutdown() unplugs the interface after the call to
intf_close() returns.  In the above scenario, this results in
unplugging the just-reopened interface.

Fix by transferring the interface destination (and its reference) to a
temporary interface, and so effectively performing the unplug before
making the call to intf_close().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[interface] Remove misleading comment
Michael Brown [Wed, 25 Jan 2017 10:17:48 +0000 (10:17 +0000)] 
[interface] Remove misleading comment

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[interface] Avoid unnecessary reference counting in intf_unplug()
Michael Brown [Wed, 25 Jan 2017 10:11:26 +0000 (10:11 +0000)] 
[interface] Avoid unnecessary reference counting in intf_unplug()

The null interface does not have a reference counter, so the call to
intf_get() is always redundant.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[efi] Fix building elf2efi.c when -fpic is enabled by default
Michael Brown [Wed, 25 Jan 2017 08:00:50 +0000 (08:00 +0000)] 
[efi] Fix building elf2efi.c when -fpic is enabled by default

The x86_64 EDK2 headers include a #pragma to mark all subsequent
symbol declarations and references as hidden if position-independent
code is being generated.  Since libgen.h is currently included only
after the EDK2 headers, this results in __xpg_basename() being
erroneously marked as having hidden visibility (if the compiler
defaults to building position-independent code); this eventually
results in a failure to link the elf2efi binary.

Fix by including libgen.h prior to including the EDK2 headers.

Originally-fixed-by: Doug Goldstein <cardoe@cardoe.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[pic8259] Fix definitions for "read IRR" and "read ISR" commands
Michael Brown [Wed, 25 Jan 2017 07:32:38 +0000 (07:32 +0000)] 
[pic8259] Fix definitions for "read IRR" and "read ISR" commands

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[hyperv] Ignore unsolicited VMBus messages
Michael Brown [Tue, 24 Jan 2017 15:03:10 +0000 (15:03 +0000)] 
[hyperv] Ignore unsolicited VMBus messages

In some high-end Azure instances (e.g. NC6) we may receive an
unsolicited VMBUS_OFFER_CHANNEL message for a PCIe pass-through device
some time after completing the bus enumeration.  This currently causes
apparently random failures due to unexpected VMBus message types.

Fix by ignoring any unsolicited VMBus messages.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[cloud] Show CPU vendor and model in example cloud boot scripts
Michael Brown [Tue, 24 Jan 2017 13:47:03 +0000 (13:47 +0000)] 
[cloud] Show CPU vendor and model in example cloud boot scripts

Some problems arise only when running on a specific CPU type (e.g.
non-functional timer interrupts as observed in Azure AMD instances).
Include the CPU vendor and model within the sample cloud boot scripts,
to assist in debugging such problems.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[netdevice] Allow MTU to be changed at runtime
Michael Brown [Mon, 23 Jan 2017 17:47:28 +0000 (17:47 +0000)] 
[netdevice] Allow MTU to be changed at runtime

Provide a settings applicator to modify netdev->max_pkt_len in
response to changes to the "mtu" setting (DHCP option 26).

Note that as with MAC address changes, drivers are permitted to
completely ignore any changes in the MTU value.  The net result will
be that iPXE effectively uses the smaller of either the hardware
default MTU or the software configured MTU.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[virtio] Use host-specified MTU when available
Michael Brown [Mon, 23 Jan 2017 16:32:54 +0000 (16:32 +0000)] 
[virtio] Use host-specified MTU when available

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[cloud] Add ability to retrieve Google Compute Engine metadata
Michael Brown [Mon, 23 Jan 2017 14:41:22 +0000 (14:41 +0000)] 
[cloud] Add ability to retrieve Google Compute Engine metadata

For some unspecified "security" reason, the Google Compute Engine
metadata server will refuse any requests that do not include the
non-standard HTTP header "Metadata-Flavor: Google".

Attempt to autodetect such requests (by comparing the hostname against
"metadata.google.internal"), and add the "Metadata-Flavor: Google"
header if applicable.

Enable this feature in the CONFIG=cloud build, and include a sample
embedded script allowing iPXE to boot from a script configured as
metadata via e.g.

  # Create shared boot image
  make bin/ipxe.usb CONFIG=cloud EMBED=config/cloud/gce.ipxe

  # Configure per-instance boot script
  gcloud compute instances add-metadata <instance> \
         --metadata-from-file ipxeboot=boot.ipxe

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[virtio] Use separate RX and TX empty header buffers
Michael Brown [Mon, 23 Jan 2017 13:23:31 +0000 (13:23 +0000)] 
[virtio] Use separate RX and TX empty header buffers

Some host implementations (notably Google Compute Platform) are known
to unconditionally write back VIRTIO_NET_HDR_F_DATA_VALID to
header->flags for received packets, regardless of the features
negotiated by the driver.  This breaks the transmit datapath by
effectively setting an illegal flag for all subsequent transmitted
packets.

Work around this problem by using separate empty header buffers for
the receive and transmit queues.

Debugged-by: Ladi Prosek <lprosek@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[af_packet] Add new AF_PACKET driver for Linux
David Decotigny [Fri, 20 Jan 2017 18:29:24 +0000 (10:29 -0800)] 
[af_packet] Add new AF_PACKET driver for Linux

This code largely inspired by tap.c.  Allows for testing iPXE on real
NICs from within Linux.  For example:

  make bin-x86_64-linux/af_packet.linux
  valgrind ./bin-x86_64-linux/af_packet.linux --net af_packet,if=eth3

Tested as x86_64 and i386 binary.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[build] Return const char * from uuid_ntoa()
David Decotigny [Fri, 20 Jan 2017 18:29:22 +0000 (10:29 -0800)] 
[build] Return const char * from uuid_ntoa()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[virtio] Remove queue size limit in legacy virtio
Ladi Prosek [Fri, 16 Dec 2016 13:07:08 +0000 (14:07 +0100)] 
[virtio] Remove queue size limit in legacy virtio

Virtio 0.9 implementation was limited to the maximum virtqueue size of
MAX_QUEUE_NUM and the virtio-net driver would fail to initialize on hosts
exceeding this limit.

This commit lifts the restriction by allocating the queue memory based on
the actual queue size instead of using a fixed maximum. Note that virtio
1.0 still uses the MAX_QUEUE_NUM constant to cap the size (unfortunately
this functionality is not available in virtio 0.9).

Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[virtio] Simplify virtqueue shutdown
Ladi Prosek [Fri, 16 Dec 2016 12:31:22 +0000 (13:31 +0100)] 
[virtio] Simplify virtqueue shutdown

This commit introduces virtnet_free_virtqueues called on all virtqueue
error and shutdown paths. vpm_find_vqs no longer cleans up after itself
and instead expects virtnet_free_virtqueues to be always called to undo
its effect.

Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[virtio] Cap queue size to MAX_QUEUE_NUM
Ladi Prosek [Fri, 16 Dec 2016 09:54:32 +0000 (10:54 +0100)] 
[virtio] Cap queue size to MAX_QUEUE_NUM

vpm_find_vqs incorrectly accepted the host provided queue size with no
regard to iPXE's internal limitations. Virtio 1.0 makes it possible for
the driver to override the queue size to reduce memory requirements and
iPXE is a great use case for this feature.

Also removing the extra vq->vring.num assignment which is already
handled in vring_init.

Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[build] Add %.vhd target for building VM bootable disk images
Michael Brown [Sun, 22 Jan 2017 11:22:11 +0000 (11:22 +0000)] 
[build] Add %.vhd target for building VM bootable disk images

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[ipv4] Accept unicast packets for the local network broadcast address
Michael Brown [Sun, 22 Jan 2017 09:12:52 +0000 (09:12 +0000)] 
[ipv4] Accept unicast packets for the local network broadcast address

The ISC Kea DHCP server transmits its DHCPOFFER as a unicast packet
with a broadcast IPv4 destination address (255.255.255.255).  This
combination is currently rejected by iPXE.

Fix by explicitly accepting the local network broadcast address
(255.255.255.255) as a valid unicast destination address.

Reported-by: Roy Ledochowski <roy.ledochowski@hpe.com>
Tested-by: Roy Ledochowski <roy.ledochowski@hpe.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[golan] Update Connect-IB, ConnectX-4 and ConnectX-4 Lx (Infiniband) support
Raed Salem [Thu, 8 Dec 2016 09:01:51 +0000 (11:01 +0200)] 
[golan] Update Connect-IB, ConnectX-4 and ConnectX-4 Lx (Infiniband) support

Updates:
- Nodnic: Support for arm cq doorbell via the UAR BAR
- Ensure hardware is quiescent when no interface is open - WinPE WA
- Support for clear interrupt via BAR
- Nodnic: Support for send TX doorbells via the UAR BAR
- Added ConnectX-5EX device
- Added ConnectX-5 device

Signed-off-by: Raed Salem <raeds@mellanox.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[efi] Work around temporal anomaly encountered during ExitBootServices()
Michael Brown [Wed, 7 Dec 2016 13:41:06 +0000 (13:41 +0000)] 
[efi] Work around temporal anomaly encountered during ExitBootServices()

EFI provides no clean way for device drivers to shut down in
preparation for handover to a booted operating system.  The platform
firmware simply doesn't bother to call the drivers' Stop() methods.
Instead, drivers must register an EVT_SIGNAL_EXIT_BOOT_SERVICES event
to be signalled when ExitBootServices() is called, and clean up
without any reference to the EFI driver model.

Unfortunately, all timers silently stop working when ExitBootServices()
is called.  Even more unfortunately, and for no discernible reason,
this happens before any EVT_SIGNAL_EXIT_BOOT_SERVICES events are
signalled.  The net effect of this entertaining design choice is that
any timeout loops on the shutdown path (e.g. for gracefully closing
outstanding TCP connections) may wait indefinitely.

There is no way to report failure from currticks(), since the API
lazily assumes that the host system continues to travel through time
in the usual direction.  Work around EFI's violation of this
assumption by falling back to a simple free-running monotonic counter.

Debugged-by: Maor Dickman <maord@mellanox.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[undi] Try matching UNDI ROMs in BIOS enumeration order
Michael Brown [Wed, 7 Dec 2016 07:25:44 +0000 (07:25 +0000)] 
[undi] Try matching UNDI ROMs in BIOS enumeration order

When searching for an UNDI ROM to match against a PCI device, search
in order of increasing ROM address (within the 128kB BIOS option ROM
area).  This is likely (though not guaranteed) to match the order of
the original enumeration performed by the BIOS, which is in turn
likely to match the order of enumeration on the PCI bus.

Since we load at most one UNDI ROM, the net result is that we increase
our chances of loading the ROM corresponding to the selected PCI
device (rather than loading a ROM corresponding to a higher-numbered
PCI device with the same vendor and device IDs.)

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[prefix] Include diagnostic information within progress messages
Michael Brown [Tue, 6 Dec 2016 09:38:33 +0000 (09:38 +0000)] 
[prefix] Include diagnostic information within progress messages

Include some relevant diagnostic infomation within the progress
messages generated via DEBUG=libprefix.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[prefix] Remove impossible progress message
Michael Brown [Tue, 6 Dec 2016 07:36:33 +0000 (07:36 +0000)] 
[prefix] Remove impossible progress message

The "progress" macro can be used only from within the .prefix section.
At the point of calling relocate(), we are running in .text16 and so
the near call to print_message() will end up calling a random function
somewhere in .text16.

Interestingly, this problem has remained unnoticed for some time.  It
is rare to build with DEBUG=libprefix.  In the few cases that it has
been used during development, the randomly selected function in
.text16 seems to have been a harmless no-op with no visible
side-effects (beyond the unnoticed failure to print the "relocate"
progress message).

Fix by removing the futile attempt to print a progress message before
calling relocate().

Reported-by: Raed Salem <raeds@mellanox.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[undi] Clean up driver and device name information
Michael Brown [Mon, 5 Dec 2016 15:45:17 +0000 (15:45 +0000)] 
[undi] Clean up driver and device name information

Fix the <NULL> driver name reported by "ifstat" when using the undipci
driver (due to the unnecessary extra device node inserted as a child
of the PCI device).

Remove the "UNDI-" prefix from device names since the driver name is
also now visible via "ifstat", and tidy up the device name to match
the format used by standard PCI devices.

The output from "ifstat" now resembles:

  iPXE> ifstat
  net0: 52:54:00:12:34:56 using undipci on 0000:00:03.0

  iPXE> ifstat
  net0: 52:54:00:12:34:56 using undionly on 0000:00:03.0

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[romprefix] Avoid using PMM-allocated memory in UNDI loader entry point
Michael Brown [Mon, 5 Dec 2016 14:11:00 +0000 (14:11 +0000)] 
[romprefix] Avoid using PMM-allocated memory in UNDI loader entry point

The UNDI loader entry point is very likely to be called after POST,
when there is a high chance that the PMM-allocated image source area
and decompression area have been reused by something else.

In particular, using an iPXE .iso to test a separate iPXE ROM's UNDI
loader entry point in a qemu VM is likely to crash.  SeaBIOS allocates
PMM blocks from close to the top of memory and so these blocks have a
high chance of colliding with the runtime addresses subsequently
chosen by the non-ROM iPXE by scanning the INT 15,e820 memory map.

The standard romprefix.S has no choice about relying on the
PMM-allocated image source area, since it has no other way to retrieve
its compressed payload.

In mromprefix.S, the image source area functions only as an optional
buffer used to avoid repeated reads from the (potentially slow)
expansion ROM BAR by the decompression code.  We can therefore always
set %esi=0 when calling install_prealloc from the UNDI loader entry
point, and simply fall back to reading directly from the expansion ROM
BAR.

We can always set %edi=0 when calling install_prealloc from the UNDI
loader entry point.  This will behave as though the decompression area
PMM allocation failed, and will therefore use INT 15,88 to find a
temporary decompression area somewhere close to 64MB.  This is by no
means guaranteed to be safe from collisions, but it's probably safer
on balance than the PMM-allocated address.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
3 years ago[undi] Allocate base memory before calling UNDI loader entry point
Michael Brown [Mon, 5 Dec 2016 08:50:03 +0000 (08:50 +0000)] 
[undi] Allocate base memory before calling UNDI loader entry point

Allocate base memory (by decreasing the free base memory counter)
before calling the UNDI loader entry point, to minimise surprises for
the UNDI loader code.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Add basic EFI SAN booting capability
Michael Brown [Wed, 16 Nov 2016 22:22:22 +0000 (22:22 +0000)] 
[efi] Add basic EFI SAN booting capability

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[iscsi] Avoid potential infinite loops during shutdown
Michael Brown [Wed, 16 Nov 2016 23:00:57 +0000 (23:00 +0000)] 
[iscsi] Avoid potential infinite loops during shutdown

The command and data interfaces may be connected to the same object.
Nullify the data interface before shutting down the control interface
to avoid potential infinite loops.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[interface] Provide intf_reinit() to reinitialise nullified interfaces
Michael Brown [Wed, 16 Nov 2016 22:22:13 +0000 (22:22 +0000)] 
[interface] Provide intf_reinit() to reinitialise nullified interfaces

Provide an abstraction intf_reinit() to restore the descriptor of a
previously nullified interface.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[build] Disable TIVOLI_VMM_WORKAROUND in the qemu configuration ipxe-qemu-release-v2.8.0 ipxe-qemu-release-v2.9.0
Laszlo Ersek [Wed, 26 Oct 2016 22:13:51 +0000 (00:13 +0200)] 
[build] Disable TIVOLI_VMM_WORKAROUND in the qemu configuration

This prevents KVM guests from crashing that run iPXE on host CPUs
without "unrestricted_guest" support.

Once KVM gets the FXSAVE / FXRSTOR emulation feature (*), and the
feature becomes widely available to users, we can back out this change
from iPXE.

(*) Already in progress by Radim:

    [PATCH 0/2] KVM: x86: emulate fxsave and fxrstor

    https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1258895.html
    https://www.spinics.net/lists/kernel/msg2370327.html

Cc: Bandan Das <bsd@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Greg <rollenwiese@yahoo.com>
Cc: Michael Brown <mcb30@ipxe.org>
Cc: Michael Prokop <launchpad@michael-prokop.at>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Pickford <arch@netremedies.ca>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Ref: https://bugs.archlinux.org/task/50778
Ref: https://bugs.launchpad.net/qemu/+bug/1623276
Ref: https://bugzilla.proxmox.com/show_bug.cgi?id=1182
Ref: https://bugzilla.redhat.com/show_bug.cgi?id=1356762
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[librm] Conditionalize the workaround for the Tivoli VMM's SSE garbling
Laszlo Ersek [Wed, 26 Oct 2016 22:13:50 +0000 (00:13 +0200)] 
[librm] Conditionalize the workaround for the Tivoli VMM's SSE garbling

Commit 71560d1 ("[librm] Preserve FPU, MMX and SSE state across calls
to virt_call()") added FXSAVE and FXRSTOR instructions to iPXE.  In
KVM virtual machines, these instructions execute fine as long as the
host CPU supports the "unrestricted_guest" feature (that is, it can
virtualize big real mode natively).  On older host CPUs however, KVM
has to emulate big real mode, and it currently doesn't implement
FXSAVE emulation.

Upstream QEMU rebuilt iPXE at commit 0418631 ("[thunderx] Fix
compilation with older versions of gcc") which is a descendant of
commit 71560d1 (see above).

This was done in QEMU commit ffdc5a2 ("ipxe: update submodule from
4e03af8ec to 041863191").  The resultant binaries were bundled with
the QEMU v2.7.0 release; see QEMU commit c52125a ("ipxe: update
prebuilt binaries").

This distributed the iPXE workaround for the Tivoli VMM bug to a
number of KVM users with old host CPUs, causing KVM emulation failures
(guest crashes) for them while netbooting.

Make the FXSAVE and FXRSTOR instructions conditional on a new feature
test macro called TIVOLI_VMM_WORKAROUND.  Define the macro by default.

There is prior art for an assembly file including config/general.h:
see arch/x86/prefix/romprefix.S.  Also, TIVOLI_VMM_WORKAROUND seems to
be a good fit for the "Obscure configuration options" section in
config/general.h.

Cc: Bandan Das <bsd@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Greg <rollenwiese@yahoo.com>
Cc: Michael Brown <mcb30@ipxe.org>
Cc: Michael Prokop <launchpad@michael-prokop.at>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Pickford <arch@netremedies.ca>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Ref: https://bugs.archlinux.org/task/50778
Ref: https://bugs.launchpad.net/qemu/+bug/1623276
Ref: https://bugzilla.proxmox.com/show_bug.cgi?id=1182
Ref: https://bugzilla.redhat.com/show_bug.cgi?id=1356762
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[bzimage] Fix page alignment of initrd images
Michael Brown [Fri, 28 Oct 2016 23:08:48 +0000 (00:08 +0100)] 
[bzimage] Fix page alignment of initrd images

The initrd_addr_max field represents the highest byte address that may
be used to hold initrd images, and is therefore almost certainly not
aligned to a page boundary: a typical value might be 0x7fffffff.

Fix the address calculations to ensure that the initrd images are
always aligned to a page boundary.

Reported-by: Sitsofe Wheeler <sitsofe@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Add EFI_BLOCK_IO2_PROTOCOL header and GUID definition
Michael Brown [Sun, 16 Oct 2016 22:27:50 +0000 (23:27 +0100)] 
[efi] Add EFI_BLOCK_IO2_PROTOCOL header and GUID definition

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Update to current EDK2 headers
Michael Brown [Sun, 16 Oct 2016 15:32:49 +0000 (16:32 +0100)] 
[efi] Update to current EDK2 headers

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Mark AppleNetBoot.h as a native iPXE header
Michael Brown [Sun, 16 Oct 2016 16:04:30 +0000 (17:04 +0100)] 
[efi] Mark AppleNetBoot.h as a native iPXE header

AppleNetBoot.h is not taken from the EDK2 codebase and so cannot be
imported using include/ipxe/efi/import.pl.  Mark as a native iPXE
header (by changing the include guard) to avoid breaking the import
process.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Mark permanent certificates as permanent
Michael Brown [Wed, 31 Aug 2016 16:23:42 +0000 (17:23 +0100)] 
[crypto] Mark permanent certificates as permanent

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[cmdline] Add certificate management commands
Michael Brown [Thu, 25 Aug 2016 14:40:27 +0000 (15:40 +0100)] 
[cmdline] Add certificate management commands

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Add certstat() to display basic certificate information
Michael Brown [Thu, 25 Aug 2016 14:39:43 +0000 (15:39 +0100)] 
[crypto] Add certstat() to display basic certificate information

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Allow certificates to be marked as having been added explicitly
Michael Brown [Thu, 25 Aug 2016 14:38:58 +0000 (15:38 +0100)] 
[crypto] Allow certificates to be marked as having been added explicitly

Allow certificates to be marked as having been added explicitly at run
time.  Such certificates will not be discarded via the certificate
store cache discarder.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Expose certstore_del() to explicitly remove stored certificates
Michael Brown [Wed, 31 Aug 2016 14:16:43 +0000 (15:16 +0100)] 
[crypto] Expose certstore_del() to explicitly remove stored certificates

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[list] Add list_next_entry() and list_prev_entry()
Michael Brown [Wed, 31 Aug 2016 14:05:22 +0000 (15:05 +0100)] 
[list] Add list_next_entry() and list_prev_entry()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Generalise X.509 "valid" field to a "flags" field
Michael Brown [Thu, 25 Aug 2016 14:41:57 +0000 (15:41 +0100)] 
[crypto] Generalise X.509 "valid" field to a "flags" field

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Add image_x509() to extract X.509 certificates from image
Michael Brown [Thu, 25 Aug 2016 14:35:44 +0000 (15:35 +0100)] 
[crypto] Add image_x509() to extract X.509 certificates from image

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[pixbuf] Enable PNG format by default
Michael Brown [Fri, 29 Jul 2016 14:58:59 +0000 (15:58 +0100)] 
[pixbuf] Enable PNG format by default

Enable IMAGE_PNG (but not IMAGE_PNM) by default, and drag in the
relevant objects only when image_pixbuf() is present in the binary.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[build] Remove more obsolete explicit object requirements
Michael Brown [Fri, 29 Jul 2016 14:56:10 +0000 (15:56 +0100)] 
[build] Remove more obsolete explicit object requirements

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Enable both DER and PEM formats by default
Michael Brown [Fri, 29 Jul 2016 14:40:39 +0000 (15:40 +0100)] 
[crypto] Enable both DER and PEM formats by default

Enable both IMAGE_DER and IMAGE_PEM by default, and drag in the
relevant objects only when image_asn1() is present in the binary.

This allows "imgverify" to transparently use either DER or PEM
signature files.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[build] Remove obsolete explicit object requirements
Michael Brown [Fri, 29 Jul 2016 14:18:35 +0000 (15:18 +0100)] 
[build] Remove obsolete explicit object requirements

As of commit b1caa48 ("[crypto] Support SHA-{224,384,512} in X.509
certificates"), the list of supported cryptographic algorithms is
controlled by config/crypto.h.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[image] Use image_asn1() to extract data from CMS signature images
Michael Brown [Thu, 28 Jul 2016 15:22:08 +0000 (16:22 +0100)] 
[image] Use image_asn1() to extract data from CMS signature images

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Add PEM image format
Michael Brown [Thu, 28 Jul 2016 21:51:50 +0000 (22:51 +0100)] 
[crypto] Add PEM image format

Add PEM-encoded ASN.1 as an image format.  We accept as PEM any image
containing a line starting with a "-----BEGIN" boundary marker.

We allow for PEM files containing multiple ASN.1 objects, such as a
certificate chain produced by concatenating individual certificate
files.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Add DER image format
Michael Brown [Thu, 28 Jul 2016 15:18:23 +0000 (16:18 +0100)] 
[crypto] Add DER image format

Add DER-encoded ASN.1 as an image format.  There is no fixed signature
for DER files.  We treat an image as DER if it comprises a single
valid SEQUENCE object covering the entire length of the image.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[image] Add image_asn1() to extract ASN.1 objects from image
Michael Brown [Thu, 28 Jul 2016 15:16:55 +0000 (16:16 +0100)] 
[image] Add image_asn1() to extract ASN.1 objects from image

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Allow for parsing of partial ASN.1 cursors
Michael Brown [Thu, 28 Jul 2016 14:02:15 +0000 (15:02 +0100)] 
[crypto] Allow for parsing of partial ASN.1 cursors

Allow code to create a partial ASN.1 cursor containing only the type
and length bytes, so that asn1_start() may be used to determine the
length of a large ASN.1 blob without first allocating memory to hold
the entire blob.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[crypto] Remove obsolete extern declaration for asn1_invalidate_cursor()
Michael Brown [Thu, 28 Jul 2016 14:00:26 +0000 (15:00 +0100)] 
[crypto] Remove obsolete extern declaration for asn1_invalidate_cursor()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[hyperv] Use instance UUID in device name
Michael Brown [Tue, 26 Jul 2016 15:18:53 +0000 (16:18 +0100)] 
[hyperv] Use instance UUID in device name

The Windows drivers for VMBus devices are enumerated using the
instance UUID rather than the channel number.  Include the instance
UUID within the iPXE device name to allow an iPXE network device to be
more easily associated with the corresponding Windows network device
when debugging.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Allow for multiple routers
Michael Brown [Mon, 25 Jul 2016 14:20:22 +0000 (15:20 +0100)] 
[ipv6] Allow for multiple routers

Select the IPv6 source address and corresponding router (if any) using
a very simplified version of the algorithm from RFC6724:

- Ignore any source address that has a smaller scope than the
  destination address.  For example, do not use a link-local source
  address when sending to a global destination address.

- If we have a source address which is on the same link as the
  destination address, then use that source address.

- If we are left with multiple possible source addresses, then choose
  the address with the smallest scope.  For example, if we are sending
  to a site-local destination address and we have both a global source
  address and a site-local source address, then use the site-local
  source address.

- If we are still left with multiple possible source addresses, then
  choose the address with the longest matching prefix.

For the purposes of this algorithm, we treat RFC4193 Unique Local
Addresses as having organisation-local scope.  Since we use only
link-local scope for our multicast transmissions, this approximation
should remain valid in all practical situations.

Originally-implemented-by: Thomas Bächler <thomas@archlinux.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[test] Update IPv6 tests to use okx()
Michael Brown [Mon, 25 Jul 2016 12:44:16 +0000 (13:44 +0100)] 
[test] Update IPv6 tests to use okx()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Rename ipv6_scope to ipv6_settings_scope
Michael Brown [Thu, 21 Jul 2016 14:46:51 +0000 (15:46 +0100)] 
[ipv6] Rename ipv6_scope to ipv6_settings_scope

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Create routing table based on IPv6 settings
Michael Brown [Tue, 19 Jul 2016 16:49:50 +0000 (17:49 +0100)] 
[ipv6] Create routing table based on IPv6 settings

Use the IPv6 settings to construct the routing table, in a matter
analogous to the construction of the IPv4 routing table.

This allows for manual assignment of IPv6 addresses via e.g.

  set net0/ip6 2001:ba8:0:1d4::6950:5845
  set net0/len6 64
  set net0/gateway6 fe80::226:bff:fedd:d3c0

The prefix length ("len6") may be omitted, in which case a default
prefix length of 64 will be assumed.

Multiple IPv6 addresses may be assigned manually by implicitly
creating child settings blocks.  For example:

  set net0/ip6 2001:ba8:0:1d4::6950:5845
  set net0.ula/ip6 fda4:2496:e992::6950:5845

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Match user expectations for IPv6 settings priorities
Michael Brown [Tue, 19 Jul 2016 15:57:32 +0000 (16:57 +0100)] 
[ipv6] Match user expectations for IPv6 settings priorities

A reasonable user expectation is that ${net0/ip6} should show the
"highest-priority" of the IPv6 addresses, even when multiple IPv6
addresses are active.  The expected order of priority is likely to be
manually-assigned addresses first, then stateful DHCPv6 addresses,
then SLAAC addresses, and lastly link-local addresses.

Using ${priority} to enforce an ordering is undesirable since that
would affect the priority assigned to each of the net<N> blocks as a
whole, so use the sibling ordering capability instead.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[settings] Allow settings blocks to specify a sibling ordering
Michael Brown [Tue, 19 Jul 2016 15:44:18 +0000 (16:44 +0100)] 
[settings] Allow settings blocks to specify a sibling ordering

Allow settings blocks to provide an explicit default ordering between
siblings, with lower precedence than the existing ${priority} setting.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Expose IPv6 link-local address settings
Michael Brown [Tue, 19 Jul 2016 13:16:51 +0000 (14:16 +0100)] 
[ipv6] Expose IPv6 link-local address settings

Originally-implemented-by: Hannes Reinecke <hare@suse.de>
Originally-implemented-by: Marin Hannache <git@mareo.fr>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[dhcpv6] Expose IPv6 address setting acquired through DHCPv6
Michael Brown [Tue, 19 Jul 2016 00:18:30 +0000 (01:18 +0100)] 
[dhcpv6] Expose IPv6 address setting acquired through DHCPv6

Originally-implemented-by: Hannes Reinecke <hare@suse.de>
Originally-implemented-by: Marin Hannache <git@mareo.fr>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Expose IPv6 settings acquired through NDP
Michael Brown [Mon, 18 Jul 2016 14:13:10 +0000 (15:13 +0100)] 
[ipv6] Expose IPv6 settings acquired through NDP

Expose the IPv6 address (or prefix) as ${ip6}, the prefix length as
${len6}, and the router address as ${gateway6}.

Originally-implemented-by: Hannes Reinecke <hare@suse.de>
Originally-implemented-by: Marin Hannache <git@mareo.fr>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Allow settings to comprise arbitrary subsets of NDP options
Michael Brown [Mon, 18 Jul 2016 13:37:04 +0000 (14:37 +0100)] 
[ipv6] Allow settings to comprise arbitrary subsets of NDP options

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[settings] Correctly mortalise autovivified child settings blocks
Michael Brown [Mon, 18 Jul 2016 22:52:40 +0000 (23:52 +0100)] 
[settings] Correctly mortalise autovivified child settings blocks

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Rename ipv6_scope to dhcpv6_scope
Michael Brown [Sat, 16 Jul 2016 11:42:08 +0000 (12:42 +0100)] 
[ipv6] Rename ipv6_scope to dhcpv6_scope

The settings scope ipv6_scope refers specifically to IPv6 settings
that have a corresponding DHCPv6 option.  Rename to dhcpv6_scope to
more accurately reflect this purpose.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[settings] Create space for IPv6 in settings display order
Michael Brown [Fri, 15 Jul 2016 15:52:47 +0000 (16:52 +0100)] 
[settings] Create space for IPv6 in settings display order

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv6] Perform SLAAC only during autoconfiguration
Michael Brown [Fri, 15 Jul 2016 14:49:24 +0000 (15:49 +0100)] 
[ipv6] Perform SLAAC only during autoconfiguration

We currently perform IPv6 stateless address autoconfiguration (SLAAC)
in response to any router advertisement with the relevant flags set.
This can result in the local IPv6 source address changing midway
through a TCP connection, since our connections bind only to a local
port number and do not store a local network address.

In addition, this behaviour for SLAAC is inconsistent with that for
DHCPv4 and stateful DHCPv6, both of which will be performed only as a
result of an explicit autoconfiguration action (e.g. via the default
autoboot sequence, or the "ifconf" command).

Fix by ignoring router advertisements arriving outside the context of
an ongoing autoconfiguration attempt.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[intel] Remove duplicate intelvf_mbox_queues() function
Michael Brown [Thu, 14 Jul 2016 12:51:07 +0000 (13:51 +0100)] 
[intel] Remove duplicate intelvf_mbox_queues() function

Commit db34436 ("[intel] Strip spurious VLAN tags received by virtual
function NICs") accidentally introduced two copies of the
intel[x]vf_mbox_queues() function.  Remove the unintended copy.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[intel] Strip spurious VLAN tags received by virtual function NICs
Michael Brown [Mon, 11 Jul 2016 16:14:14 +0000 (17:14 +0100)] 
[intel] Strip spurious VLAN tags received by virtual function NICs

The physical function may be configured to transparently insert a VLAN
tag into all transmitted packets.  Unfortunately, it does not
equivalently strip this same VLAN tag from all received packets.  This
behaviour may be observed in some Amazon EC2 instances with Enhanced
Networking enabled: transmissions work as expected but all packets
received by iPXE appear to have a spurious VLAN tag.

We can configure the receive queue to strip VLAN tags via the
RXDCTL.VME bit.  We need to find out from the PF driver whether or not
we should do so.

There exists a "get queue configuration" mailbox message which
contains a field labelled IXGBE_VF_TRANS_VLAN in the Linux driver.

A comment in the Linux PF driver describes this field as "notify VF of
need for VLAN tag stripping, and correct queue".  It will be filled
with a non-zero value if the PF is enforcing the use of a single VLAN
tag.  It will also be filled with a non-zero value if the PF is using
multiple traffic classes.

The Linux VF driver seems to treat this field as being simply the
number of traffic classes, and gives it no VLAN-related
interpretation.  The Linux VF driver instead handles the VLAN tag
stripping by simply assuming that any unrecognised VLAN tag ought to
be silently dropped.

We choose to strip and ignore the VLAN tag if the IXGBE_VF_TRANS_VLAN
field has a non-zero value.

Reported-by: Leonid Vasetsky <leonidv@velostrata.com>
Tested-by: Leonid Vasetsky <leonidv@velostrata.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[ipv4] Send gratuitous ARPs whenever a new IPv4 address is applied
Michael Brown [Tue, 12 Jul 2016 07:47:27 +0000 (08:47 +0100)] 
[ipv4] Send gratuitous ARPs whenever a new IPv4 address is applied

In a busy network (such as a public cloud), IPv4 addresses may be
recycled rapidly.  When this happens, unidirectional traffic (such as
UDP syslog) will succeed, but bidirectional traffic (such as TCP
connections) may fail due to stale ARP cache entries on other nodes.
The remote ARP cache expiry timeout is likely to exceed iPXE's
connection timeout, meaning that boot attempts can fail before the
problem is automatically resolved.

Fix by sending gratuitous ARPs whenever an IPv4 address is changed, to
attempt to update stale remote ARP cache entries.  Note that this is
not a guaranteed fix, since ARP is an unreliable protocol.

We avoid sending gratuitous ARPs unconditionally, since otherwise any
unrelated settings change (e.g. "set dns 192.168.0.1") would cause
unexpected gratuitous ARPs to be sent.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[intel] Add PCI device ID for I219-V/LM
Lukas Grossar [Mon, 11 Jul 2016 15:06:01 +0000 (17:06 +0200)] 
[intel] Add PCI device ID for I219-V/LM

Signed-off-by: Lukas Grossar <lukas.grossar@adfinis-sygroup.ch>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[acpi] Allow time for ACPI power off to take effect
Michael Brown [Mon, 11 Jul 2016 20:23:03 +0000 (21:23 +0100)] 
[acpi] Allow time for ACPI power off to take effect

The ACPI power off sequence may not take effect immediately.  Delay
for one second, to eliminate potentially confusing log messages such
as "Could not power off: Error 0x43902001 (http://ipx".

Reported-by: Leonid Vasetsky <leonidv@velostrata.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[acpi] Add support for ACPI power off
Michael Brown [Sun, 10 Jul 2016 18:25:26 +0000 (19:25 +0100)] 
[acpi] Add support for ACPI power off

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[rng] Check for functioning RTC interrupt
Michael Brown [Sun, 10 Jul 2016 19:36:53 +0000 (20:36 +0100)] 
[rng] Check for functioning RTC interrupt

On some platforms (observed in a small subset of Microsoft Azure
(Hyper-V) virtual machines), the RTC appears to be incapable of
generating an interrupt via the legacy PIC.  The RTC status registers
show that a periodic interrupt has been asserted, but the PIC IRR
shows that IRQ8 remains inactive.

On such systems, iPXE will currently freeze during the "iPXE
initialising devices..." message.

Work around this problem by checking that RTC interrupts are being
raised before returning from rtc_entropy_enable().  If no interrupt is
seen within 100ms, then we assume that the RTC interrupt mechanism is
broken.  In these circumstances, iPXE will continue to initialise but
any subsequent attempt to generate entropy will fail.  In particular,
HTTPS connections will fail with an error indicating that no entropy
is available.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Install the HII config access protocol on a child of the SNP handle
Laszlo Ersek [Thu, 30 Jun 2016 12:37:36 +0000 (14:37 +0200)] 
[efi] Install the HII config access protocol on a child of the SNP handle

In edk2, there are several drivers that associate HII forms (and
corresponding config access protocol instances) with each individual
network device.  (In this context, "network device" means the EFI
handle on which the SNP protocol is installed, and on which the device
path ending with the MAC() node is installed also.)  Such edk2 drivers
are, for example: Ip4Dxe, HttpBootDxe, VlanConfigDxe.

In UEFI, any given handle can carry at most one instance of a specific
protocol (see e.g. the specification of the InstallProtocolInterface()
boot service).  This implies that the class of drivers mentioned above
can't install their EFI_HII_CONFIG_ACCESS_PROTOCOL instances on the
SNP handle directly -- they would conflict with each other.
Accordingly, each of those edk2 drivers creates a "private" child
handle under the SNP handle, and installs its config access protocol
(and corresponding HII package list) on its child handle.

The device path for the child handle is traditionally derived by
appending a Hardware Vendor Device Path node after the MAC() node.
The VenHw() nodes in question consist of a GUID (by definition), and
no trailing data (by choice).  The purpose of these VenHw() nodes is
only that all the child nodes can be uniquely identified by device
path.

At the moment iPXE does not follow this pattern.  It doesn't run into
a conflict when it installs its EFI_HII_CONFIG_ACCESS_PROTOCOL
directly on the SNP handle, but that's only because iPXE is the sole
driver not following the pattern.  This behavior seems risky (one
might call it a "latent bug"); better align iPXE with the edk2 custom.

Cc: Michael Brown <mcb30@ipxe.org>
Cc: Gary Lin <glin@suse.com>
Cc: Ladi Prosek <lprosek@redhat.com>
Ref: http://thread.gmane.org/gmane.comp.bios.edk2.devel/13494/focus=13532
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ladi Prosek <lprosek@redhat.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[profile] Allow profiling to be globally enabled or disabled
Michael Brown [Tue, 5 Jul 2016 12:45:54 +0000 (13:45 +0100)] 
[profile] Allow profiling to be globally enabled or disabled

As with assertions, profiling is enabled for objects built with any
debug level (including an explicit debug level of zero).

Allow profiling to be globally enabled or disabled by adding PROFILE=1
or PROFILE=0 respectively to the build command line.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[libc] Allow assertions to be globally enabled or disabled
Michael Brown [Tue, 5 Jul 2016 12:28:51 +0000 (13:28 +0100)] 
[libc] Allow assertions to be globally enabled or disabled

Assertions are enabled for objects built with any debug level
(including an explicit debug level of zero).  It is sometimes useful
to be able to enable assertions across all objects; this currently
requires manually hacking include/assert.h.

Allow assertions to be globally enabled by adding ASSERT=1 to the
build command line.  For example:

  make bin/8086100e.mrom ASSERT=1

Similarly, allow assertions to be globally disabled by adding ASSERT=0
to the build command line.  If no ASSERT=... is specified on the
build command line, then only objects mentioned in DEBUG=... will have
assertions enabled (as is currently the case).

Note than globally enabling assertions imposes a relatively heavy
runtime penalty, primarily due to the various sanity checks performed
by list_add(), list_for_each_entry(), etc.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[debug] Allow debug messages to be initially disabled at runtime
Michael Brown [Tue, 5 Jul 2016 09:19:36 +0000 (10:19 +0100)] 
[debug] Allow debug messages to be initially disabled at runtime

Extend the DEBUG=... syntax to allow debug messages to be compiled in
but disabled by default.  For example:

  make bin/undionly.kpxe DEBUG=netdevice:3:1

would compile in the messages as for DEBUG=netdevice:3, but would set
the debug level mask so that only the DEBUG=netdevice:1 messages would
be displayed.

This allows for external code to selectively enable the additional
debug messages at runtime, without being overwhelmed by unwanted
initial noise.  For example, a developer of a new protocol may want to
temporarily enable tracing of all packets received: this can be done
by building with DEBUG=netdevice:3:1 and using

  // temporarily enable per-packet messages
  DBG_ENABLE_OBJECT ( netdevice, DBGLVL_EXTRA );
  ...
  // disable per-packet messages
  DBG_DISABLE_OBJECT ( netdevice, DBGLVL_EXTRA );

Note that unlike the usual DBG_ENABLE() and DBG_DISABLE() macros,
DBG_ENABLE_OBJECT() and DBG_DISABLE_OBJECT() will not be removed via
dead code elimination if debugging is disabled in the specified
object.  In particular, this means that using either of these macros
will always result in a symbol reference to the specified object.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[debug] Allow per-object runtime enabling/disabling of debug messages
Michael Brown [Tue, 5 Jul 2016 09:10:35 +0000 (10:10 +0100)] 
[debug] Allow per-object runtime enabling/disabling of debug messages

The DBG_ENABLE() and DBG_DISABLE() macros currently affect the debug
level of all objects that were built with debugging enabled.  This is
undesirable, since it is common to use different debug levels in each
object.

Make the debug level mask a per-object variable.  DBG_ENABLE() and
DBG_DISABLE() now control only the debug level for the containing
object (which is consistent with the intended usage across the
existing codebase).  DBG_ENABLE_OBJECT() and DBG_DISABLE_OBJECT() may
be used to control the debug level for a specified object.  For
example:

  // Enable DBG() messages from tcpip.c
  DBG_ENABLE_OBJECT ( tcpip, DBGLVL_LOG );

Note that the existence of debug messages continues to be gated by the
DEBUG=... list specified on the build command line.  If an object was
built without the relevant debug level, then DBG_ENABLE_OBJECT() will
have no effect on that object at runtime (other than to explicitly
drag in the object via a symbol reference).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[iscsi] Treat redirection failures as fatal
Michael Brown [Mon, 4 Jul 2016 15:14:22 +0000 (16:14 +0100)] 
[iscsi] Treat redirection failures as fatal

Debugged-by: Robin Smidsrød <robin@smidsrod.no>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[downloader] Treat redirection failures as fatal
Michael Brown [Mon, 4 Jul 2016 15:13:25 +0000 (16:13 +0100)] 
[downloader] Treat redirection failures as fatal

Debugged-by: Robin Smidsrød <robin@smidsrod.no>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[xfer] Send intf_close() if redirection fails
Michael Brown [Mon, 4 Jul 2016 15:10:45 +0000 (16:10 +0100)] 
[xfer] Send intf_close() if redirection fails

A redirection failure is fatal, but provides no opportunity for the
caller of xfer_[v]redirect() to report the failure since the interface
will already have been disconnected.  Fix by sending intf_close() from
within the default xfer_vredirect() handler.

Debugged-by: Robin Smidsrød <robin@smidsrod.no>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[dhcp] Automatically generate vendor class identifier string
Michael Brown [Mon, 4 Jul 2016 14:07:05 +0000 (15:07 +0100)] 
[dhcp] Automatically generate vendor class identifier string

The vendor class identifier strings in DHCP_ARCH_VENDOR_CLASS_ID are
out of sync with the (correct) client architecture values in
DHCP_ARCH_CLIENT_ARCHITECTURE.

Fix by removing all definitions of DHCP_ARCH_VENDOR_CLASS_ID, and
instead generating the vendor class identifier string automatically
based on DHCP_ARCH_CLIENT_ARCHITECTURE and DHCP_ARCH_CLIENT_NDI.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[dhcpv6] Include vendor class identifier option in DHCPv6 requests
Michael Brown [Mon, 4 Jul 2016 13:08:26 +0000 (14:08 +0100)] 
[dhcpv6] Include vendor class identifier option in DHCPv6 requests

RFC3315 defines DHCPv6 option 16 (vendor class identifier) but does
not define any direct relationship with the roughly equivalent DHCPv4
option 60.

The PXE specification predates IPv6, and the UEFI specification is
expectedly vague on the subject.  Examination of the reference EDK2
codebase suggests that the DHCPv6 vendor class identifier will be
formatted in accordance with RFC3315, using a single vendor-class-data
item in which the opaque-data field is the string as would appear in
DHCPv4 option 60.

RFC3315 requires the vendor class identifier to specify an IANA
enterprise number, as a way of disambiguating the vendor-class-data
namespace.  The EDK2 code uses the value 343, described as:

    // TODO: IANA TBD: temporarily using Intel's

Since this "TODO" has been present since at least 2010, it is probably
safe to assume that it has now become a de facto standard.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[dhcpv6] Include RFC5970 client architecture options in DHCPv6 requests
Michael Brown [Mon, 4 Jul 2016 12:18:49 +0000 (13:18 +0100)] 
[dhcpv6] Include RFC5970 client architecture options in DHCPv6 requests

RFC5970 defines DHCPv6 options 61 (client system architecture type)
and 62 (client network interface identifier), with contents equivalent
to DHCPv4 options 93 and 94 respectively.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[dhcp] Allow for variable encapsulation of architecture-specific options
Michael Brown [Mon, 4 Jul 2016 12:15:05 +0000 (13:15 +0100)] 
[dhcp] Allow for variable encapsulation of architecture-specific options

DHCPv4 and DHCPv6 share some values in common for the architecture-
specific options (such as the client system architecture type), but
use different encapsulations: DHCPv4 has a single byte for the option
length while DHCPv6 has a 16-bit field for the option length.

Move the containing DHCP_OPTION() and related wrappers from the
individual dhcp_arch.h files to dhcp.c, thus allowing for the
architecture-specific values to be reused in dhcpv6.c.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[pxe] Disable interrupts on the PIC before starting NBP
Michael Brown [Sun, 3 Jul 2016 11:52:20 +0000 (12:52 +0100)] 
[pxe] Disable interrupts on the PIC before starting NBP

Some BIOSes (observed with an HP Gen9) seem to spuriously enable
interrupts at the PIC.  This causes problems with NBPs such as GRUB
which use the UNDI API (thereby enabling interrupts on the NIC)
without first hooking an interrupt service routine.  In this
situation, the interrupt will end up being handled by the default BIOS
ISR, which will typically just send an EOI and return.  Since nothing
in this handler causes the NIC to deassert the interrupt, this will
result in an interrupt storm.

Entertainingly, some BIOSes are immune to this problem because the
default ISR sends the EOI only to the slave PIC; this effectively
disables the interrupt.

Work around this problem by disabling the interrupt on the PIC before
invoking the PXE NBP.  An NBP that expects to make use of interrupts
will need to be configuring the PIC anyway, so it is probably safe to
assume that it will explicitly reenable the interrupt.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[bios] Do not enable interrupts when printing to the console
Michael Brown [Sun, 3 Jul 2016 11:50:19 +0000 (12:50 +0100)] 
[bios] Do not enable interrupts when printing to the console

There seems to be no reason for the sti/cli pair used around each call
to INT 10.  Remove these instructions, so that printing debug messages
from within an ISR does not temporarily reenable interrupts.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Fix uninitialised data in HII IFR structures
Michael Brown [Wed, 29 Jun 2016 14:13:35 +0000 (15:13 +0100)] 
[efi] Fix uninitialised data in HII IFR structures

The HII IFR structures are allocated via realloc() rather than
zalloc(), and so are not automatically zeroed.  This results in the
presence of uninitialised and invalid data, causing crashes elsewhere
in the UEFI firmware.

Fix by explicitly zeroing the newly allocated portion of any IFR
structure in efi_ifr_op().

Debugged-by: Laszlo Ersek <lersek@redhat.com>
Debugged-by: Gary Lin <glin@suse.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[thunderx] Fix compilation with older versions of gcc
Michael Brown [Wed, 22 Jun 2016 11:04:50 +0000 (12:04 +0100)] 
[thunderx] Fix compilation with older versions of gcc

Remove redundant duplicate typedef which causes a build failure on
older gcc versions.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Do not copy garbage bytes into SNP device path MAC address
Michael Brown [Wed, 22 Jun 2016 08:07:20 +0000 (09:07 +0100)] 
[efi] Do not copy garbage bytes into SNP device path MAC address

The SNP device path includes the network device's MAC address within
the MAC_ADDR_DEVICE_PATH.MacAddress field.  We check that the
link-layer address will fit within this field, and then perform the
copy using the length of the destination buffer.

At 32 bytes, the MacAddress field is actually larger than the current
maximum iPXE link-layer address.  The copy therefore overflows the
source buffer, resulting in trailing garbage bytes being appended to
the device path's MacAddress.  This is invisible in debug messages,
since the DevicePathToText protocol will render only the length
implied by the interface type.

Fix by copying only the actual length of the link-layer address (which
we have already verified will not overflow the destination buffer).

Debugged-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[efi] Report failures to stop the EFI timer tick event
Michael Brown [Mon, 20 Jun 2016 15:08:17 +0000 (16:08 +0100)] 
[efi] Report failures to stop the EFI timer tick event

Signed-off-by: Michael Brown <mcb30@ipxe.org>
4 years ago[smsc75xx] Allow up to 100ms for reset to complete
Michael Brown [Mon, 20 Jun 2016 13:07:41 +0000 (14:07 +0100)] 
[smsc75xx] Allow up to 100ms for reset to complete

Signed-off-by: Michael Brown <mcb30@ipxe.org>