12 years ago[http] Add support for HTTP Basic authentication
Michael Brown [Fri, 13 Feb 2009 15:43:17 +0000 (15:43 +0000)]
[http] Add support for HTTP Basic authentication

12 years ago[base64] Add base64 encoding functions
Michael Brown [Fri, 13 Feb 2009 14:54:13 +0000 (14:54 +0000)]
[base64] Add base64 encoding functions

12 years ago[settings] Handle errors in fetchf_uristring()
Michael Brown [Thu, 12 Feb 2009 09:16:53 +0000 (09:16 +0000)]
[settings] Handle errors in fetchf_uristring()

fetchf_uristring() was failing to handle error values from
fetch_setting(), resulting in its attempting to allocate extremely
large temporary buffers on the stack (and so overrunning the stack and
locking up the machine).

Problem reported by Shao Miller <>.

12 years ago[tls] Use our own ASN.1 routines for certificate parsing
Michael Brown [Tue, 10 Feb 2009 17:37:24 +0000 (17:37 +0000)]
[tls] Use our own ASN.1 routines for certificate parsing

Use our own, more robust, ASN.1 parsing routines to extract the RSA
public key from a server certificate.  Remove the now-unused AXTLS
ASN.1 parser.

12 years ago[crypto] Remove unused files
Michael Brown [Tue, 10 Feb 2009 15:47:44 +0000 (15:47 +0000)]
[crypto] Remove unused files

12 years ago[mtnic] Add multiport support and some minor fixes
Itay Gazit [Mon, 9 Feb 2009 12:40:48 +0000 (12:40 +0000)]
[mtnic] Add multiport support and some minor fixes

Signed-off-by: Michael Brown <>
12 years ago[sundance] Added NIC variant
Thomas Miletich [Fri, 6 Feb 2009 13:35:29 +0000 (08:35 -0500)]
[sundance] Added NIC variant

This previously unsupported NIC variant was was found to work using
the current driver:

     PCI_ROM(0x13f0, 0x0200, "ip100a", "IC+ IP100A"),

Signed-off-by: Marty Connor <>
12 years ago[pxe] Display the "Press F8" prompt rather than displaying menu with timeout
Michael Brown [Thu, 5 Feb 2009 19:29:16 +0000 (19:29 +0000)]
[pxe] Display the "Press F8" prompt rather than displaying menu with timeout

The PXE spec dictates the rather ugly feature that we have to present
a DHCP-specified prompt string to the user, then wait to see if they
press F8 before displaying the menu.

This seems to me to be a significant retrograde step from the current
situation of displaying the menu with the timeout counting down
against the default selected boot option, but apparently the lack of
the "Press F8" prompt causes some confusion.

12 years ago[pxe] Obey lists of PXE Boot Servers and associated Discovery Control bits
Michael Brown [Thu, 5 Feb 2009 09:30:32 +0000 (09:30 +0000)]
[pxe] Obey lists of PXE Boot Servers and associated Discovery Control bits

Various combinations of options 43.6, 43.7 and 43.8 dictate which
servers we send Boot Server Discovery requests to, and which servers
we should accept responses from.  Obey these options, and remove the
explicit specification of a single Boot Server from start_pxebs() and
dependent functions.

12 years ago[pxe] Skip PXE boot server discovery if directed to do so
Michael Brown [Tue, 3 Feb 2009 02:46:06 +0000 (02:46 +0000)]
[pxe] Skip PXE boot server discovery if directed to do so

Option 43.6 can direct us to skip PXE boot server discovery and just
perform a standard DHCP filename boot.

12 years ago[pxe] Fall back to broadcast if no boot server multicast address exists
Michael Brown [Tue, 3 Feb 2009 02:44:15 +0000 (02:44 +0000)]
[pxe] Fall back to broadcast if no boot server multicast address exists

fetch_ipv4_setting() will zero its IPv4 address argument if no such
setting exists, rather than leaving it untouched.

12 years ago[iobuf] Add iob_disown() and use it where it simplifies code
Michael Brown [Sun, 1 Feb 2009 18:02:28 +0000 (18:02 +0000)]
[iobuf] Add iob_disown() and use it where it simplifies code

There are many functions that take ownership of the I/O buffer they
are passed as a parameter.  The caller should not retain a pointer to
the I/O buffer.  Use iob_disown() to automatically nullify the
caller's pointer, e.g.:

    xfer_deliver_iob ( xfer, iob_disown ( iobuf ) );

This will ensure that iobuf is set to NULL for any code after the call
to xfer_deliver_iob().

iob_disown() is currently used only in places where it simplifies the
code, by avoiding an extra line explicitly setting the I/O buffer
pointer to NULL.  It should ideally be used with each call to any
function that takes ownership of an I/O buffer.  (The SSA
optimisations will ensure that use of iob_disown() gets optimised away
in cases where the caller makes no further use of the I/O buffer
pointer anyway.)

If gcc ever introduces an __attribute__((free)), indicating that use
of a function argument after a function call should generate a
warning, then we should use this to identify all applicable function
call sites, and add iob_disown() as necessary.

12 years ago[contrib] Update qemu documentation
Michael Brown [Sun, 1 Feb 2009 17:35:53 +0000 (17:35 +0000)]
[contrib] Update qemu documentation

12 years ago[dhcp] Send user class in DHCP requests
Michael Brown [Sun, 1 Feb 2009 20:06:09 +0000 (20:06 +0000)]
[dhcp] Send user class in DHCP requests

12 years ago[tftp] Guard against invalid data block numbers
Michael Brown [Sun, 1 Feb 2009 13:07:17 +0000 (13:07 +0000)]
[tftp] Guard against invalid data block numbers

A TFTP DATA packet with a block number of zero (representing a
negative offset within the file) could potentially cause problems.
Fixed by explicitly rejecting such packets.

Identified by Stefan Hajnoczi <>.

12 years ago[dhcp] Split PXE menuing code out of dhcp.c
Michael Brown [Sat, 31 Jan 2009 07:36:05 +0000 (07:36 +0000)]
[dhcp] Split PXE menuing code out of dhcp.c

The DHCP client code now implements only the mechanism of the DHCP and
PXE Boot Server protocols.  Boot Server Discovery can be initiated
manually using the "pxebs" command.  The menuing code is separated out
into a user-level function on a par with boot_root_path(), and is
entered in preference to a normal filename boot if the DHCP vendor
class is "PXEClient" and the PXE boot menu option exists.

12 years ago[settings] Avoid duplicate settings block names
Michael Brown [Sat, 31 Jan 2009 07:32:20 +0000 (07:32 +0000)]
[settings] Avoid duplicate settings block names

Automatically unregister any settings with the same name (and position
within the settings tree) as a newly registered settings block.

This functionality is generalised out from dhcp.c.

12 years ago[scsi] Cope with targets that send multiple CHECK CONDITIONS at power-on
Michael Brown [Fri, 30 Jan 2009 13:32:53 +0000 (13:32 +0000)]
[scsi] Cope with targets that send multiple CHECK CONDITIONS at power-on

Some targets send a spurious CHECK CONDITION message in response to
the first SCSI command.  We issue (and ignore the status of) an
arbitary harmless SCSI command (a READ CAPACITY (10)) in order to draw
out this response.

The Solaris Comstar target seems to send more than one spurious CHECK
CONDITION response.  Attempt up to SCSI_MAX_DUMMY_READ_CAP dummy READ
CAPACITY (10) commands before assuming that error responses are

Problem reported by Kristof Van Doorsselaere <>
and Shiva Shankar <>.

12 years ago[ui] Allow Ctrl-C to cancel wait for net device link-up
Michael Brown [Tue, 27 Jan 2009 20:09:50 +0000 (20:09 +0000)]
[ui] Allow Ctrl-C to cancel wait for net device link-up

This really ought to be handled via monojob.c and the usual Ctrl-C
mechanism that handles cancelling DHCP or file downloads.

12 years ago[dns] Append local domain to relative names
Stefan Hajnoczi [Thu, 27 Nov 2008 09:30:37 +0000 (09:30 +0000)]
[dns] Append local domain to relative names

Try to qualify relative names in the DNS resolver using the DHCP Domain
Name.  For example:

  DHCP Domain Name:
  (Relative) Name: www


Only names with no dots ('.') will be modified.  A name with one or more
dots is unchanged.

12 years ago[settings] Add fetch_string_setting_copy()
Michael Brown [Tue, 27 Jan 2009 19:13:47 +0000 (19:13 +0000)]
[settings] Add fetch_string_setting_copy()

12 years ago[tftp] Temporary fix for conveying TFTP block size to callers
Michael Brown [Tue, 27 Jan 2009 15:47:00 +0000 (15:47 +0000)]
[tftp] Temporary fix for conveying TFTP block size to callers

pxe_tftp.c assumes that the first seek on its data-transfer interface
represents the block size.  Apart from being an ugly hack, this will
also screw up file size calculation for files smaller than one block.

The proper solution would be to extend the data-transfer interface to
support the reporting of stat()-like data.  This is not going to
happen until the cost of adding interface methods is reduced (a fix I
have planned since June 2008).

In the meantime, abuse the xfer_window() method to return the block
size, since it is not being used for anything else and is vaguely

Astonishingly, having returned the incorrect TFTP blocksize via
PXENV_TFTP_OPEN for almost a year seems not to have affected any of
the test cases run during that time; this bug was found only when
someone tried running the heavily-patched version of pxegrub found in

12 years ago[dhcp] Include support for PXE boot menus
Michael Brown [Sun, 25 Jan 2009 21:16:47 +0000 (21:16 +0000)]
[dhcp] Include support for PXE boot menus

PXE dictates a mechanism for boot menuing, involving prompting the
user with a variable message, waiting for a predefined keypress,
displaying a boot menu, and waiting for a selection.

This breaks the currently desirable abstraction that DHCP is a process
that can happen in the background without any user interaction.

12 years ago[bios] Add F8 function key as a recognised BIOS keycode
Michael Brown [Sun, 25 Jan 2009 21:12:48 +0000 (21:12 +0000)]
[bios] Add F8 function key as a recognised BIOS keycode

12 years ago[console] Allow KEY_xxx constants to cover F8 function key
Michael Brown [Sun, 25 Jan 2009 21:10:48 +0000 (21:10 +0000)]
[console] Allow KEY_xxx constants to cover F8 function key

F8 is represented by the ANSI escape sequence "^[[19~", which is not
representable as a KEY_xxx constant using the current encoding scheme.
Adapt the encoding scheme to allow F8 to be represented, since PXE
requires that we may need to prompt the user to press F8.

12 years ago[dhcp] Clarify language surrounding ProxyDHCP
Michael Brown [Fri, 23 Jan 2009 01:47:33 +0000 (01:47 +0000)]
[dhcp] Clarify language surrounding ProxyDHCP

Remove the lazy assumption that ProxyDHCP == "DHCP with option 60 set
to PXEClient", and explicitly separate the notion of ProxyDHCP from
the notion of packets containing PXE options.

12 years ago[dhcp] Handle missing ProxyDHCP servers
Michael Brown [Fri, 23 Jan 2009 01:32:04 +0000 (01:32 +0000)]
[dhcp] Handle missing ProxyDHCP servers

It is possible to configure a DHCP server to hand out PXE options
without a ProxyDHCP server present.  This requires setting option 60
to "PXEClient", which will cause gPXE to attempt ProxyDHCP.

We assume in several places that dhcp->proxydhcpack is set to the
DHCPACK packet containing option 60 set to "PXEClient".  When we
transition into ProxyDHCPREQUEST, set dhcp->proxydhcpack=dhcp->dhcpack
so that this assumption holds true.

We ought to rename several references to "proxydhcp" to something more
accurate, such as "pxedhcp".  Treating a single DHCP response as
potentially both DHCPOFFER and ProxyDHCPOFFER does make the code
smaller, but the variable names get confusing.

12 years ago[dhcp] Pass PXE boot menu item to PXE Boot Server
Michael Brown [Fri, 23 Jan 2009 01:13:50 +0000 (01:13 +0000)]
[dhcp] Pass PXE boot menu item to PXE Boot Server

Pick out the first boot menu item from the boot menu (option 43.9) and
pass it to the boot server as the boot menu item (option 43.71).

Also improve DHCP debug messages to include more details of the
packets being transmitted.

12 years ago[tcp] Always set PUSH flag on TCP transmissions
Michael Brown [Wed, 21 Jan 2009 04:22:34 +0000 (04:22 +0000)]
[tcp] Always set PUSH flag on TCP transmissions

Apparently this can cause a major speedup on some iSCSI targets, which
will otherwise wait for a timer to expire before responding.  It
doesn't seem to hurt other simple TCP test cases (e.g. HTTP

Problem and solution identified by Shiva Shankar <>

12 years ago[dhcp] Add preliminary support for PXE Boot Servers
Michael Brown [Wed, 21 Jan 2009 03:43:26 +0000 (03:43 +0000)]
[dhcp] Add preliminary support for PXE Boot Servers

Some PXE configurations require us to perform a third DHCP transaction
(in addition to the real DHCP transaction and the ProxyDHCP
transaction) in order to retrieve information from a "Boot Server".

This is an experimental implementation, since the actual behaviour is
not well specified in the PXE spec.

12 years ago[tcpip] Allow for transmission to multicast IPv4 addresses
Michael Brown [Wed, 21 Jan 2009 03:40:39 +0000 (03:40 +0000)]
[tcpip] Allow for transmission to multicast IPv4 addresses

When sending to a multicast address, it may be necessary to specify
the source address explicitly, since the multicast destination address
does not provide enough information to deduce the source address via
the miniroute table.

Allow the source address specified via the data-xfer metadata to be
passed down through the TCP/IP stack to the IPv4 layer, which can use
it as a default source address.

12 years ago[ethernet] Fix eth_mc_hash() return status
Michael Brown [Wed, 21 Jan 2009 03:37:36 +0000 (03:37 +0000)]
[ethernet] Fix eth_mc_hash() return status

eth_mc_hash() was missing a return within a switch statement, and so
always falling through to the default case and returning failure.

12 years ago[dhcp] Centralise DHCP successful state transitions
Michael Brown [Wed, 21 Jan 2009 01:28:18 +0000 (01:28 +0000)]
[dhcp] Centralise DHCP successful state transitions

Move all the DHCP state transition logic into a single function
dhcp_next_state().  This will make it easier to add support for PXE
Boot Servers, since it abstracts away the difference between "mark
DHCP as complete" and "transition to boot server discovery".

12 years ago[dhcp] Allow for missing server ID in ProxyDHCPACK
Michael Brown [Wed, 21 Jan 2009 00:55:42 +0000 (00:55 +0000)]
[dhcp] Allow for missing server ID in ProxyDHCPACK

The Linux PXE server ( does not
set the server identifier in its ProxyDHCP responses.  If the server
ID is missing, do not treat this as an error.

This resolves the "vague and unsettling memory" mentioned in commit
fdb8481d ("[dhcp] Verify server identifier on ProxyDHCPACKs").

Note that we already accept ProxyDHCPOFFERs without a server
identifier; they get treated as potential BOOTP packets.

12 years ago[efi] Expose both GUIDs for the EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
Michael Brown [Mon, 12 Jan 2009 20:53:38 +0000 (20:53 +0000)]

At some point, it seems that someone decided to change the GUID for
ignore the older GUID, older EFI builds ignore the newer GUID, so we
have to expose both.

12 years ago[efi] Add an EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL interface
Michael Brown [Mon, 12 Jan 2009 05:22:40 +0000 (05:22 +0000)]

This allegedly optional interface seems to be compulsory if you want
EFI's PXE code to bother trying to use your network interface.

12 years ago[efi] Provide component name protocol and device path protocol interfaces
Michael Brown [Sat, 10 Jan 2009 00:21:38 +0000 (00:21 +0000)]
[efi] Provide component name protocol and device path protocol interfaces

Include a minimal component name protocol so that the driver name
shows up as something other than "<UNKNOWN>" in the driver list, and a
device path protocol so that the network interface shows up as a
separate device in the device list, rather than being attached
directly to the PCI device.

Incidentally, the EFI component name protocol reaches new depths for
signal-to-noise ratio in program code.  A typical instance within the
EFI development kit will use an additional 300 lines of code to
provide slightly less functionality than GNU gettext achieves with
three additional characters.

12 years ago[efi] Ensure EFI ROM checksum is zero
Michael Brown [Fri, 9 Jan 2009 20:52:26 +0000 (20:52 +0000)]
[efi] Ensure EFI ROM checksum is zero

The UEFI specification does not mention ROM checksums, and reassigns
the field typically used as a checksum byte.  The UEFI shell
"loadpcirom" utility does not verify ROM checksums, but it seems that
some UEFI BIOSes do.

12 years ago[util] Tidy up output of
Michael Brown [Fri, 9 Jan 2009 19:38:53 +0000 (19:38 +0000)]
[util] Tidy up output of

12 years ago[dhcp] Include gPXE version number within DHCP request
Michael Brown [Thu, 8 Jan 2009 08:39:05 +0000 (08:39 +0000)]
[dhcp] Include gPXE version number within DHCP request

12 years ago[main] Print an "initialising devices" banner
Michael Brown [Thu, 8 Jan 2009 03:48:30 +0000 (03:48 +0000)]
[main] Print an "initialising devices" banner

Some devices take a very long time to initialise.  This can make it
difficult to visually distinguish between the error cases of failing
to start executing C code and failing to initialise a device.

Add a "gPXE initialising devices..." message.  The trailing ellipsis
indicates to the user that this may take some time, and the presence
of the message indicates to the developer that relocation etc. all

12 years ago[efi] Add efirom utility and .efirom image format
Michael Brown [Thu, 8 Jan 2009 02:19:18 +0000 (02:19 +0000)]
[efi] Add efirom utility and .efirom image format

12 years ago[efi] Allow for .efidrv images as well as .efi images
Michael Brown [Wed, 7 Jan 2009 23:43:26 +0000 (23:43 +0000)]
[efi] Allow for .efidrv images as well as .efi images

Merge in the changes that allow for building EFI driver images (that
can be loaded using the EFI shell's "load" command) as well as EFI

12 years ago[efi] Use elf2efi utility in place of efilink
Michael Brown [Wed, 7 Jan 2009 02:05:51 +0000 (02:05 +0000)]
[efi] Use elf2efi utility in place of efilink

elf2efi converts a suitable ELF executable (containing relocation
information, and with appropriate virtual addresses) into an EFI
executable.  It is less tightly coupled with the gPXE build process
and, in particular, does not require the use of a hand-crafted PE
image header in efiprefix.S.

elf2efi correctly handles .bss sections, which significantly reduces
the size of the gPXE EFI executable.

12 years ago[build] Avoid strict-aliasing warnings when building with gcc 4.4
Michael Brown [Tue, 6 Jan 2009 03:19:23 +0000 (19:19 -0800)]
[build] Avoid strict-aliasing warnings when building with gcc 4.4

Conventional usage of the various struct sockaddr_xxx types involves
liberal use of casting, which tends to trigger strict-aliasing
warnings from gcc.  Avoid these now and in future by marking all the
relevant types with __attribute__((may_alias)).

12 years ago[efi] Inhibit harmless ld warning on unresolved symbol check
Michael Brown [Mon, 5 Jan 2009 20:54:40 +0000 (12:54 -0800)]
[efi] Inhibit harmless ld warning on unresolved symbol check

The check for unresolved symbols does not explicitly specify an output
architecture format, and so causes a warning when building an i386 EFI
binary on an x86_64 platform.  This warning is harmless, and
specifying the output architecture in multiple places is cumbersome,
so just inhibit the warning.

12 years ago[infiniband] Call ib_open() only when opening the IPoIB net device
Michael Brown [Fri, 2 Jan 2009 21:04:31 +0000 (21:04 +0000)]
[infiniband] Call ib_open() only when opening the IPoIB net device

Defer the call to ib_open() until we want to actually open the device,
rather than when the device is registered.

12 years ago[pcbios] Add additional sanity check for bogus e820 map
Marty Connor [Thu, 18 Dec 2008 04:28:27 +0000 (23:28 -0500)]
[pcbios] Add additional sanity check for bogus e820 map

At POST time some BIOSes return invalid e820 maps even though
they indicate that the data is valid.  We add a check that the first
region returned by e820 is RAM type and declare the map to be invalid
if it is not.

This extends the sanity checks from 8b20e5d ("[pcbios] Sanity-check
the INT15,e820 and INT15,e801 memory maps").

12 years ago[etherfabric] Make use of pci_bar_start() 64-bit clean
Michael Brown [Fri, 12 Dec 2008 19:18:04 +0000 (19:18 +0000)]
[etherfabric] Make use of pci_bar_start() 64-bit clean

Driver was storing the result of pci_bar_start() and pci_bar_size() in
an int, rather than an unsigned long.

(Bug was introduced in the vendor's tree in commit eac85cd "Port
etherfabric driver to net_device api".)

12 years ago[pci] Enable memory cycles in adjust_pci_device()
Michael Brown [Fri, 12 Dec 2008 19:15:00 +0000 (19:15 +0000)]
[pci] Enable memory cycles in adjust_pci_device()

adjust_pci_device() has historically enabled bus-mastering and I/O
cycles, but has never previously needed to enable memory cycles.  Some
EFI systems seem not to enable memory cycles by default, so add that
to the list of PCI command register bits that we force on.

13 years ago[e1000] Use PCI_BASE_ADDRESS_* symbols instead of integers
Marty Connor [Fri, 5 Dec 2008 14:42:46 +0000 (09:42 -0500)]
[e1000] Use PCI_BASE_ADDRESS_* symbols instead of integers

When compiling for the Linux kernel, PCI_BASE_ADDRESS_0 == 0, and
PCI_BASE_ADDRESS_1 == 1.  This is not so when compiling for gPXE.  We
must use the symbolic names rather than integers to get the correct

Bug identified and patch supplied by:

   George Chou <>

13 years ago[x86_64] Add support for compilation as an x86_64 binary
Michael Brown [Tue, 18 Nov 2008 22:30:37 +0000 (14:30 -0800)]
[x86_64] Add support for compilation as an x86_64 binary

Currently the only supported platform for x86_64 is EFI.

Building an EFI64 gPXE requires a version of gcc that supports
__attribute__((ms_abi)).  This currently means a development build of
gcc; the feature should be present when gcc 4.4 is released.

In the meantime; you can grab a suitable gcc tree from


13 years ago[hermon] Fix permissions broken in 3a799e9 ("Add PCI ID for ConnectX QDR card")
Michael Brown [Thu, 4 Dec 2008 23:27:21 +0000 (23:27 +0000)]
[hermon] Fix permissions broken in 3a799e9 ("Add PCI ID for ConnectX QDR card")

The patch file supplied for commit 3a799e9 ("[hermon] Add PCI ID for
ConnectX QDR card") accidentally marked drivers/infiniband/hermon.c as
being executable.

13 years ago[efi] Use EFI-native mechanism for accessing SMBIOS table
Michael Brown [Thu, 4 Dec 2008 23:09:48 +0000 (23:09 +0000)]
[efi] Use EFI-native mechanism for accessing SMBIOS table

EFI provides a copy of the SMBIOS table accessible via the EFI system
table, which we should use instead of manually scanning through the
F000:0000 segment.

13 years ago[efi] Allow use of EFI configuration tables
Michael Brown [Thu, 4 Dec 2008 04:04:54 +0000 (04:04 +0000)]
[efi] Allow use of EFI configuration tables

EFI passes in copies of SMBIOS and other system configuration tables
via the EFI system table.  Allow configuration tables to be requested
using a mechanism similar to the current method for requesting EFI

13 years ago[hermon] Add PCI ID for ConnectX QDR card
Michael Brown [Thu, 4 Dec 2008 20:48:53 +0000 (20:48 +0000)]
[hermon] Add PCI ID for ConnectX QDR card

Patch provided by Itay Gazit <>.

13 years ago[romprefix] Change from opt-in to opt-out when booting via INT19
Michael Brown [Thu, 4 Dec 2008 16:46:16 +0000 (16:46 +0000)]
[romprefix] Change from opt-in to opt-out when booting via INT19

On non-BBS systems, we have to hook INT 19 in order to be able to boot
from the gPXE ROM at all.  However, doing this unconditionally will
prevent the user from booting via any other devices.

Previously, the INT 19 entry point would prompt the user to press B in
order to boot from gPXE, which makes it impossible to perform an
unattended network boot.  We now prompt the user to press N to skip
booting from gPXE, which allows for unattended operation.

This should be a better match for most real-world scenarios.  Most
modern systems support BBS and so are unaffected by this change.  Very
old (non-BBS) systems tend not to have PXE ROMs by default anyway; if
the user has added a gPXE ROM then they probably do want to boot from
the network.  Newer non-BBS systems are essentially limited to IBM
servers, which will recapture the INT 19 vector anyway and implement
their own boot-ordering selection mechanism.

13 years ago[release] Update version to 0.9.6+ post release
Marty Connor [Sun, 23 Nov 2008 22:01:17 +0000 (17:01 -0500)]
[release] Update version to 0.9.6+ post release

13 years ago[release] Update version to 0.9.6 for release v0.9.6
Marty Connor [Sun, 23 Nov 2008 21:44:45 +0000 (16:44 -0500)]
[release] Update version to 0.9.6 for release

13 years ago[b44] Add driver for Broadcom bcm44xx cards
Pantelis Koukousoulas [Fri, 21 Nov 2008 21:19:37 +0000 (23:19 +0200)]
[b44] Add driver for Broadcom bcm44xx cards

This driver is based on Stefan Hajnoczi's summer work, which
is in turn based on version 1.01 of the linux b44 driver.
I just assembled the pieces and fixed/added a few pieces
here and there to make it work for my hardware.

The most major limitation is that this driver won't work
on systems with >1GB RAM due to the card not having enough
address bits for that and gPXE not working around this

Still, other than that the driver works well enough for
at least 2 users :) and the above limitation can always
be fixed when somebody wants it bad enough :)

Signed-off-by: Pantelis Koukousoulas <>
13 years ago[netdevice] Kill off the various guess_boot_netdev() functions
Michael Brown [Fri, 21 Nov 2008 20:34:42 +0000 (20:34 +0000)]
[netdevice] Kill off the various guess_boot_netdev() functions

Remove the assortment of miscellaneous hacks to guess the "network
boot device", and replace them each with a call to last_opened_netdev().

It still isn't guaranteed correct, but it won't be any worse than
before, and it will at least be consistent.

13 years ago[netdevice] Provide function to retrieve the most recently opened net device
Michael Brown [Fri, 21 Nov 2008 20:31:12 +0000 (20:31 +0000)]
[netdevice] Provide function to retrieve the most recently opened net device

There are currently four places within the codebase that use a
heuristic to guess the "boot network device", with varying degrees of
success.  Add a feature to the net device core to maintain a list of
open network devices, in order of opening, and provide a function
last_opened_netdev() to retrieve the most recently opened net device.
This should do a better job than the current assortment of
guess_boot_netdev() functions.

13 years ago[pxe] Select the correct network device on multiport cards
Michael Brown [Fri, 21 Nov 2008 19:45:05 +0000 (19:45 +0000)]
[pxe] Select the correct network device on multiport cards

When trying to find the "first open network device", it helps to
actually check the NETDEV_OPEN flag.

13 years ago[aoe] Use an AoE config query to identify the target MAC address
Michael Brown [Wed, 19 Nov 2008 21:42:33 +0000 (21:42 +0000)]
[aoe] Use an AoE config query to identify the target MAC address

The AoE spec does not specify that the source MAC address of a
received packet actually matches the MAC address of the AoE target.
In principle an AoE server can respond to an AoE request on any
interface available to it, which may not be an address configured to
accept AoE requests.

This issue is resolved by implementing AoE device discovery.  The
purpose of AoE discovery is to find out which addresses an AoE target
can use for requests.  An AoE configuration command is sent when the
AoE attach is attempted.  The AoE target must respond to that
configuration query from an interface that can accept requests.

Based on a patch from Ryan Thomas <>

13 years ago[blockdev] Move block device operations to structure block_device_operations
Laurent Vivier [Wed, 19 Nov 2008 16:31:07 +0000 (17:31 +0100)]
[blockdev] Move block device operations to structure block_device_operations

Signed-off-by: Laurent Vivier <>
13 years ago[virtio] Split virtio-net.c into several files.
Laurent Vivier [Wed, 19 Nov 2008 16:28:29 +0000 (17:28 +0100)]
[virtio] Split virtio-net.c into several files.

Signed-off-by: Laurent Vivier <>
13 years ago[virtio] Consolidate virtio-net static data into a struct vring_virtqueue
Laurent Vivier [Wed, 19 Nov 2008 16:28:28 +0000 (17:28 +0100)]
[virtio] Consolidate virtio-net static data into a struct vring_virtqueue

Signed-off-by: Laurent Vivier <>
13 years ago[virtio] Remove dependency on nic for virtio PCI functions
Laurent Vivier [Wed, 19 Nov 2008 16:28:27 +0000 (17:28 +0100)]
[virtio] Remove dependency on nic for virtio PCI functions

Signed-off-by: Laurent Vivier <>
13 years ago[virtio] Consolidate vring_get_buf() by using a buffer list to add to the vring
Laurent Vivier [Wed, 19 Nov 2008 16:28:26 +0000 (17:28 +0100)]
[virtio] Consolidate vring_get_buf() by using a buffer list to add to the vring

Signed-off-by: Laurent Vivier <>
13 years ago[virtio] Move virtio-pci.h and virtio-ring.h to include/gpxe
Laurent Vivier [Wed, 19 Nov 2008 16:28:25 +0000 (17:28 +0100)]
[virtio] Move virtio-pci.h and virtio-ring.h to include/gpxe

Signed-off-by: Laurent Vivier <>
13 years ago[x86_64] Fix assorted 64-bit compilation errors and warnings
Michael Brown [Wed, 19 Nov 2008 19:33:05 +0000 (19:33 +0000)]
[x86_64] Fix assorted 64-bit compilation errors and warnings

Remove various 32-bit assumptions scattered throughout the codebase.
The code is still not necessarily 64-bit clean, but will at least

13 years ago[build] Explicitly link efilink against -liberty
Michael Brown [Wed, 19 Nov 2008 03:47:03 +0000 (19:47 -0800)]
[build] Explicitly link efilink against -liberty

On some systems, libbfd is supplied only as a static library; linking
will fail unless -liberty is also specified.

13 years ago[efi] Add efi_strerror()
Michael Brown [Wed, 19 Nov 2008 03:45:44 +0000 (19:45 -0800)]
[efi] Add efi_strerror()

EFI_STATUS is defined as an INTN, which maps to UINT32 (i.e. unsigned
int) on i386 and UINT64 (i.e. unsigned long) on x86_64.  This would
require a cast each time the error status is printed.

Add efi_strerror() to avoid this ickiness and simultaneously enable
prettier reporting of EFI status codes.

13 years ago[i386] Move iSCSI and AoE boot code to arch/i386/interface/pcbios
Michael Brown [Wed, 19 Nov 2008 03:16:42 +0000 (19:16 -0800)]
[i386] Move iSCSI and AoE boot code to arch/i386/interface/pcbios

13 years ago[i386] Change [u]int32_t to [unsigned] int, rather than [unsigned] long
Michael Brown [Wed, 19 Nov 2008 02:22:56 +0000 (18:22 -0800)]
[i386] Change [u]int32_t to [unsigned] int, rather than [unsigned] long

This brings us in to line with Linux definitions, and also simplifies
adding x86_64 support since both platforms have 2-byte shorts, 4-byte
ints and 8-byte long longs.

13 years ago[libgcc] Make __libgcc architecture-specific
Michael Brown [Wed, 19 Nov 2008 00:37:15 +0000 (16:37 -0800)]
[libgcc] Make __libgcc architecture-specific

13 years ago[i386] Rename __cdecl to __asmcall
Michael Brown [Wed, 19 Nov 2008 00:18:32 +0000 (16:18 -0800)]
[i386] Rename __cdecl to __asmcall

__cdecl is a misleading name, since it currently encapsulates both
cdecl and regparm(0) attributes.  Rename to __asmcall.

13 years ago[pxe] Move all PXE files to arch/i386
Michael Brown [Tue, 18 Nov 2008 22:27:02 +0000 (22:27 +0000)]
[pxe] Move all PXE files to arch/i386

The initial PXE implementation in Etherboot had the goal of being
architecture-agnostic, but this goal has not been realised.

13 years ago[elf] Kill off unused <bits/elf.h> and <bits/elf_x.h> header files
Michael Brown [Tue, 18 Nov 2008 22:16:15 +0000 (22:16 +0000)]
[elf] Kill off unused <bits/elf.h> and <bits/elf_x.h> header files

13 years ago[efi] Update to latest UEFI headers
Michael Brown [Tue, 18 Nov 2008 21:54:51 +0000 (21:54 +0000)]
[efi] Update to latest UEFI headers

13 years ago[i386] Free allocated base memory on exit, if possible
Michael Brown [Tue, 18 Nov 2008 19:43:13 +0000 (19:43 +0000)]
[i386] Free allocated base memory on exit, if possible

Code paths that automatically allocate memory from the FBMS at 40:13
should also free it, if possible.

Freeing this memory will not be possible if either

  1. The FBMS has been modified since our allocation, or

  2. We have not been able to unhook one or more BIOS interrupt vectors.

13 years ago[r8169] New rtl8169 family driver
Marty Connor [Tue, 18 Nov 2008 04:04:07 +0000 (04:04 +0000)]
[r8169] New rtl8169 family driver

This is a completely rewritten version of the rtl8169 family driver
using the gPXE driver API.

13 years ago[build] Fix calculation of _filesz
Michael Brown [Tue, 18 Nov 2008 03:58:02 +0000 (19:58 -0800)]
[build] Fix calculation of _filesz

_filesz was incorrectly forced to be aligned up to MAX_ALIGN.  In a
non-compressed build, this would cause a build failure unless _filesz
happened to already be aligned to MAX_ALIGN.

13 years ago[build] Discard junk sections created by newer gcc versions
Michael Brown [Tue, 18 Nov 2008 03:46:27 +0000 (03:46 +0000)]
[build] Discard junk sections created by newer gcc versions

13 years ago[build] Keep gcc 4.4 happy
Michael Brown [Tue, 18 Nov 2008 01:52:40 +0000 (01:52 +0000)]
[build] Keep gcc 4.4 happy

gcc 4.4 adds another few warnings, and also seems to complain if we
place %ebp in the clobber list for any inline asm.

13 years ago[linda] Add missing copyright notices
Michael Brown [Tue, 18 Nov 2008 00:14:10 +0000 (00:14 +0000)]
[linda] Add missing copyright notices

13 years ago[linda] Purge references to 8051
Michael Brown [Mon, 17 Nov 2008 23:55:43 +0000 (23:55 +0000)]
[linda] Purge references to 8051

13 years ago[infiniband] Respect hop pointer when building directed route SMP return path
Michael Brown [Wed, 12 Nov 2008 15:35:45 +0000 (15:35 +0000)]
[infiniband] Respect hop pointer when building directed route SMP return path

The return path in directed route SMPs lists the egress ports in order
from SM to node, rather than from node to SM.

To write to the correct offset within the return path, we need to
parse the hop pointer.  This is held within the class-specific data
portion of the MAD header, which was previously unused by us and
defined to be a uint16_t.  Define this field to be a union type; this
requires some rearrangement of ib_mad.h and corresponding changes to

13 years ago[romprefix] Use smaller PMM allocations if possible
Michael Brown [Tue, 11 Nov 2008 20:00:13 +0000 (20:00 +0000)]
[romprefix] Use smaller PMM allocations if possible

The only way that PMM allows us to request a block in a region with
A20=0 is to ask for a block with an alignment of 2MB.  Due to the PMM
API design, the only way we can do this is to ask for a block with a
size of 2MB.

Unfortunately, some BIOSes will hit problems if we allocate a 2MB
block.  In particular, it may not be possible to enter the BIOS setup
screen; the BIOS setup code attempts a PMM allocation, fails, and
hangs the machine.

We now try allocating only as much as we need via PMM.  If the
allocated block has A20=1, we free the allocated block, double the
allocation size, and try again.  Repeat until either we obtain a block
with A20=0 or allocation fails.  (This is guaranteed to terminate by
the time we reach an allocation size of 2MB.)

13 years ago[linda] Add support for QLogic 7220-based Infiniband HCAs
Michael Brown [Fri, 7 Nov 2008 08:47:21 +0000 (08:47 +0000)]
[linda] Add support for QLogic 7220-based Infiniband HCAs

These cards very nearly support our current IB Verbs model.  There is
one minor difference: multicast packets will always be delivered by
the hardware to QP0, so the driver has to redirect them to the
appropriate QP.  This means that QP owners may see receive completions
for buffers that they never posted.  Nothing in our current codebase
will break because of this.

13 years ago[infiniband] Add raw packet parser and constructor
Michael Brown [Fri, 7 Nov 2008 08:39:40 +0000 (08:39 +0000)]
[infiniband] Add raw packet parser and constructor

This can be used with cards that require the driver to construct and
parse packet headers manually.  Headers are optionally handled
out-of-line from the packet payload, since some such cards will split
received headers into a separate ring buffer.

13 years ago[infiniband] Add a standalone subnet management agent
Michael Brown [Fri, 7 Nov 2008 05:39:42 +0000 (05:39 +0000)]
[infiniband] Add a standalone subnet management agent

This generic SMA code can be used for any cards that do not provide
firmware-based embedded SMAs.

13 years ago[ipoib] Kill off the IPoIB pseudo-header
Michael Brown [Fri, 7 Nov 2008 03:26:35 +0000 (03:26 +0000)]
[ipoib] Kill off the IPoIB pseudo-header

Some Infiniband cards will not be as accommodating as the Arbel and
Hermon cards in providing enough space for us to push a fake extra
header at the start of the received packet.  We must therefore make do
with squeezing enough information to identify source and destination
addresses into the two bytes of padding within a genuine IPoIB
link-layer header.

13 years ago[infiniband] Split subnet management agent client out into ib_smc.c
Michael Brown [Thu, 6 Nov 2008 22:31:19 +0000 (22:31 +0000)]
[infiniband] Split subnet management agent client out into ib_smc.c

Not all Infiniband cards have embedded subnet management agents.
Split out the code that communicates with such an embedded SMA into a
separate ib_smc.c file, and have drivers call ib_smc_update()
explicitly when they suspect that the answers given by the embedded
SMA may have changed.

13 years ago[infiniband] Pass address vector in receive completions
Michael Brown [Thu, 6 Nov 2008 21:20:30 +0000 (21:20 +0000)]
[infiniband] Pass address vector in receive completions

Receive completion handlers now get passed an address vector
containing the information extracted from the packet headers
(including the GRH, if present), and only the payload remains in the
I/O buffer.

This breaks the symmetry between transmit and receive completions, so
remove the ib_completer_t type and use an ib_completion_queue_operations
structure instead.

Rename the "destination QPN" and "destination LID" fields in struct
ib_address_vector to reflect its new dual usage.

Since the ib_completion structure now contains only an IB status code,
("syndrome") replace it with a generic gPXE integer status code.

13 years ago[infiniband] Maintain queue fill level as a property of a work queue
Michael Brown [Fri, 3 Oct 2008 02:04:21 +0000 (03:04 +0100)]
[infiniband] Maintain queue fill level as a property of a work queue

Both queue owners and drivers often need to keep track of the fill
level, so let's make it a generic property.

13 years ago[infiniband] Flush uncompleted work queue entries at QP teardown
Michael Brown [Thu, 2 Oct 2008 23:07:52 +0000 (00:07 +0100)]
[infiniband] Flush uncompleted work queue entries at QP teardown

Avoid leaking I/O buffers in ib_destroy_qp() by completing any
outstanding work queue entries with a generic error code.  This
requires the completion handlers to be available to ib_destroy_qp(),
which is done by making them static configuration parameters of the CQ
(set by ib_create_cq()) rather than being provided on each call to

This mimics the functionality of netdev_{tx,rx}_flush().  The netdev
flush functions would previously have been catching any I/O buffers
leaked by the IPoIB data queue (though not by the IPoIB metadata

13 years ago[ne2k_isa] Restore support for ne2k isa cards
Pantelis Koukousoulas [Sat, 8 Nov 2008 07:11:47 +0000 (09:11 +0200)]
[ne2k_isa] Restore support for ne2k isa cards

Add the simplified ne2k_isa driver.  It is just a selective copy+paste
of the relevant parts from ns8390.c plus a little trivial hacking to
make it actually work.

It is true that the code is pretty ugly, but:
  a) ns8390.c is worse
  b) It is only 372 lines and no #ifdefs
  c) It works both in qemu/bochs and in real hardware
     and we all know it is easier to cleanup working code

Hope someone will find the time to rewrite this driver properly,
but until then at least for me this is an ok solution.

Signed-off-by: Pantelis Koukousoulas <>
13 years ago[isa] Fix a small typo in isa.c.
Pantelis Koukousoulas [Fri, 7 Nov 2008 18:18:28 +0000 (20:18 +0200)]
[isa] Fix a small typo in isa.c.

With this patch ISA drivers actually get probed so they have a fair
chance of working now.

Signed-off-by: Pantelis Koukousoulas <>
13 years ago[netdevice] Retain and report detailed error breakdowns
Michael Brown [Sat, 8 Nov 2008 02:18:30 +0000 (02:18 +0000)]
[netdevice] Retain and report detailed error breakdowns

netdev_rx_err() and netdev_tx_complete_err() get passed the error
code, but currently use it only in debug messages.

Retain error numbers and frequencey counts for up to
NETDEV_MAX_UNIQUE_ERRORS (4) different errors for each of TX and RX.
This allows the "ifstat" command to report the reasons for TX/RX
errors in most cases, even in non-debug builds.