iPXE - Open Source Boot Firmware

[prefix] Add .xrom prefix for a ROM that loads itself by PCI accesses
authorJoshua Oreman <oremanj@rwcr.net>
Sun, 18 Oct 2009 20:12:51 +0000 (16:12 -0400)
committerMarty Connor <mdc@etherboot.org>
Wed, 20 Jan 2010 22:46:48 +0000 (17:46 -0500)
commit06a8398422efb613b7ee4f9d8f1abcc813bb3f3b
tree81dc06685687ee84b6b168e1218852e3f6c175bf
parentfa4aec8f034f4999cf933161810b96de83ce31a7
[prefix] Add .xrom prefix for a ROM that loads itself by PCI accesses

The standard option ROM format provides a header indicating the size
of the entire ROM, which the BIOS will reserve space for, load, and
call as necessary. However, this space is strictly limited to 128k for
all ROMs. gPXE ameliorates this somewhat by reserving space for itself
in high memory and relocating the majority of its code there, but on
systems prior to PCI3 enough space must still be present to load the
ROM in the first place. Even on PCI3 systems, the BIOS often limits the
size of ROM it will load to a bit over 64kB.

These space problems can be solved by providing an artificially small
size in the ROM header: just enough to let the prefix code (at the
beginning of the ROM image) be loaded by the BIOS. To the BIOS, the
gPXE ROM will appear to be only a few kilobytes; it can then load
the rest of itself by accessing the ROM directly using the PCI
interface reserved for that task.

There are a few problems with this approach. First, gPXE needs to find
an unmapped region in memory to map the ROM so it can read from it;
this is done using the crude but effective approach of scanning high
memory (over 0xF0000000) for a sufficiently large region of all-ones
(0xFF) reads. (In x86 architecture, all-ones is returned for accesses
to memory regions that no mapped device can satisfy.) This is not
provably valid in all situations, but has worked well in practice.
More importantly, this type of ROM access can only work if the PCI ROM
BAR exists at all. NICs on physical add-in PCI cards generally must
have the BAR in order for the BIOS to be able to load their ROM, but
ISA cards and LAN-on-Motherboard cards will both fail to load gPXE
using this scheme.

Due to these uncertainties, it is recommended that .xrom only be used
when a regular .rom image is infeasible due to crowded option ROM
space. However, when it works it could allow loading gPXE images
as large as a flash chip one could find - 128kB or even higher.

Signed-off-by: Marty Connor <mdc@etherboot.org>
src/Makefile.housekeeping
src/arch/i386/Makefile.pcbios
src/arch/i386/prefix/romprefix.S
src/arch/i386/prefix/xromprefix.S [new file with mode: 0644]
src/arch/i386/scripts/i386.lds
src/util/makerom.pl