mirror of
https://github.com/ipxe/ipxe
synced 2025-12-11 05:51:37 +03:00
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>
78 lines
1.7 KiB
Makefile
78 lines
1.7 KiB
Makefile
# -*- makefile -*- : Force emacs to use Makefile mode
|
|
|
|
# The i386 linker script
|
|
#
|
|
LDSCRIPT = arch/i386/scripts/i386.lds
|
|
|
|
# Stop ld from complaining about our customised linker script
|
|
#
|
|
LDFLAGS += -N --no-check-sections
|
|
|
|
# Media types.
|
|
#
|
|
MEDIA += rom
|
|
MEDIA += hrom
|
|
MEDIA += xrom
|
|
MEDIA += pxe
|
|
MEDIA += kpxe
|
|
MEDIA += kkpxe
|
|
MEDIA += elf
|
|
MEDIA += elfd
|
|
MEDIA += lmelf
|
|
MEDIA += lmelfd
|
|
MEDIA += lkrn
|
|
MEDIA += bImage
|
|
MEDIA += dsk
|
|
MEDIA += nbi
|
|
MEDIA += hd
|
|
MEDIA += raw
|
|
MEDIA += com
|
|
MEDIA += exe
|
|
|
|
# Padding rules
|
|
#
|
|
PAD_rom = $(PADIMG) --blksize=512 --byte=0xff $@
|
|
PAD_hrom = $(PAD_rom)
|
|
PAD_xrom = $(PAD_rom)
|
|
PAD_dsk = $(PADIMG) --blksize=512 $@
|
|
PAD_hd = $(PADIMG) --blksize=32768 $@
|
|
|
|
# rule to make a non-emulation ISO boot image
|
|
NON_AUTO_MEDIA += iso
|
|
%iso: %lkrn util/geniso
|
|
$(QM)$(ECHO) " [GENISO] $@"
|
|
$(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) bash util/geniso $@ $<
|
|
|
|
# rule to make a floppy emulation ISO boot image
|
|
NON_AUTO_MEDIA += liso
|
|
%liso: %lkrn util/genliso
|
|
$(QM)$(ECHO) " [GENLISO] $@"
|
|
$(Q)bash util/genliso $@ $<
|
|
|
|
# rule to make a syslinux floppy image (mountable, bootable)
|
|
NON_AUTO_MEDIA += sdsk
|
|
%sdsk: %lkrn util/gensdsk
|
|
$(QM)$(ECHO) " [GENSDSK] $@"
|
|
$(Q)bash util/gensdsk $@ $<
|
|
|
|
# Special target for building Master Boot Record binary
|
|
$(BIN)/mbr.bin : $(BIN)/mbr.o
|
|
$(QM)$(ECHO) " [OBJCOPY] $@"
|
|
$(Q)$(OBJCOPY) -O binary $< $@
|
|
|
|
# rule to make a USB disk image
|
|
$(BIN)/usbdisk.bin : $(BIN)/usbdisk.o
|
|
$(QM)$(ECHO) " [OBJCOPY] $@"
|
|
$(Q)$(OBJCOPY) -O binary $< $@
|
|
|
|
NON_AUTO_MEDIA += usb
|
|
%usb: $(BIN)/usbdisk.bin %hd
|
|
$(QM)$(ECHO) " [FINISH] $@"
|
|
$(Q)cat $^ > $@
|
|
|
|
# Padded floppy image (e.g. for iLO)
|
|
NON_AUTO_MEDIA += pdsk
|
|
%pdsk : %dsk
|
|
$(Q)cp $< $@
|
|
$(Q)$(PADIMG) --blksize=1474560 $@
|