summaryrefslogtreecommitdiffstats
path: root/src/util
Commit message (Collapse)AuthorAgeFilesLines
* [util] Add support for EFI ROM imagesPetr Borsodi2019-01-212-1/+78
| | | | | | | The Option::ROM module recognizes and checks EFI header of image. The disrom.pl utility dumps this header if is present. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Improve processing of ROM images in Option::ROMPetr Borsodi2019-01-212-39/+110
| | | | | | | | | | The Option::ROM module now compares the Code Type in the PCIR header to 0x00 (PC-AT) in order to check the presence of other header types (PnP, UNDI, iPXE, etc). The validity of these headers are checked not only by offset, but by range and signature checks also. The image checksum and initial size also depends on Code Type. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [zbin] Fix compiler warning with GCC 9Michael Brown2019-01-211-6/+6
| | | | | | | | GCC 9 warns that abs() may truncate its signed long argument. Fix by using labs() instead. Reported-by: Martin Liška <mliska@suse.cz> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [pci] Correct invalid base-class/sub-class/prog-if order in PCIRPetr Borsodi2019-01-152-3/+3
| | | | | | | | | PCI Configuration Space contains fields prog-if at the offset 0x09, sub-class at the offset 0x0a and base-class at the offset 0x0b (it respects little endian). PCIR structure uses these fields in the same order. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Handle R_X86_64_PLT32 from binutils 2.31Christian Hesse2018-09-171-0/+1
| | | | | | | | Starting from binutils 2.31.0 (commit bd7ab16b) x86-64 assembler generates R_X86_64_PLT32 instead of R_X86_64_PC32. Acked-by: John Jolly <jjolly@suse.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Add support for R_ARM_REL32 relocationsHeinrich Schuchardt2018-03-281-0/+1
| | | | | | | | | | | The relocation type R_ARM_REL32 is generated when building bin-arm32-efi/snp.efi using gcc 6.3 and ld 2.28. R_ARM_REL32 is a program counter (PC) relative 32 bit relocation so we can ignore it like all other PC relative relocations. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Support reversed sort ordering when generating NIC listRobin Smidsrød2018-03-211-21/+29
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Allow for building with older versions of elf.h system headerMichael Brown2017-09-241-0/+3
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Accept (and ignore) R_ARM_V4BX relocationsHeinrich Schuchardt2017-09-241-0/+1
| | | | | | | | | Relocation type R_ARM_V4BX requires no computation. It marks the location of an ARMv4 branch exchange instruction. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Fix building elf2efi.c when -fpic is enabled by defaultMichael Brown2017-01-251-1/+1
| | | | | | | | | | | | | | | 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>
* [build] Remove nested "my" declarationVinson Lee2016-06-031-1/+1
| | | | | | | | | | Fix build error with perl >= 5.23.2: Can't redeclare "my" in "my" at ./util/parserom.pl line 160 Signed-off-by: Vinson Lee <vlee@freedesktop.org> Reviewed-by: Robin Smidsrød <robin@smidsrod.no> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Allow for building with older versions of elf.h system headerMichael Brown2016-05-091-0/+22
| | | | | Reported-by: Ahmad Mahagna <ahmhad@mellanox.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [arm] Add support for 64-bit ARM (Aarch64)Michael Brown2016-05-082-0/+21
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [arm] Add support for 32-bit ARMMichael Brown2016-05-062-47/+64
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Eliminate use of libbfdMichael Brown2016-05-021-169/+294
| | | | | | | | | Parse the intermediate ELF file directly instead of using libbfd, in order to allow for cross-compiled ELF objects. As a side bonus, this eliminates libbfd as a build requirement. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [prefix] Use CRC32 to verify each block prior to decompressionMichael Brown2016-03-241-10/+42
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Add %.usb target for building EFI-bootable USB (or other) disk imagesMichael Brown2015-12-071-0/+60
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Work around broken 32-bit PE executable parsing in ImageHlp.dllMichael Brown2015-09-251-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | The Microsoft PE/COFF specification defines the MajorLinkerVersion and MinorLinkerVersion fields as "The linker major version number" and "The linker minor version number" respectively, and has nothing more to say on the matter. These fields have no significance: they do not affect the interpretation of the remainder of the file, but merely provide diagnostic information for interested humans to read. Apparently, versions 2.4 and earlier of the Microsoft linker produced binaries so incorrigibly cursed that even to attempt to parse such a binary would risk summoning a plague of enraged spiders. To protect users from unwanted arachnids, ImageHlp.dll's MapAndLoad() function will helpfully fail to map and/or load a 32-bit binary unless the linker version field indicates version 2.5 or later. (64-bit binaries are exempt from such helpfulness.) Work around the broken Microsoft ImageHlp.dll library by providing a linker version number that will satisfy the arbitrary whims of the MapAndLoad() function. This mirrors wimboot commit 670c7e2 ("[efi] Work around broken 32-bit PE executable parsing in ImageHlp.dll"). Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Minimise use of iPXE header files when building host utilitiesMichael Brown2015-09-153-3/+6
| | | | | | | | | | Avoid dragging in unnecessary iPXE header files such as <ipxe/uuid.h> and <ipxe/tables.h> when building host utilities, and ensure that FILE_LICENCE() (present in the imported EDK2 headers) expands to a no-op. Reported-by: Michael Tautschnig <mt@debian.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Search for ldlinux.c32 separately from isolinux.binMichael Brown2015-09-011-2/+1Star
| | | | | | | | | | | Some distributions (observed with Ubuntu 15.04) place ldlinux.c32 in a separate directory from isolinux.bin. Search for these files separately, and allow an alternative location of ldlinux.c32 to be provided via LDLINUX_C32=... on the make command line. Reported-by: Adrian Koshka <adriankoshcha@teknik.io> Tested-by: Adrian Koshka <adriankoshcha@teknik.io> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Populate debug directory entry FileOffset fieldMichael Brown2015-09-011-0/+19
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Fix debug directory sizeMichael Brown2015-09-011-1/+1
| | | | | | | | | The debug directory size specified in the data directory should cover only the EFI_IMAGE_DEBUG_DIRECTORY_ENTRY structure, not the whole of the .debug section. Reported-by: Andreas Hammarskjöld <junior@2PintSoftware.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Fix .ids.o creation for drivers not in the all-drivers buildMichael Brown2015-06-011-0/+1
| | | | | | | | | | | | | | Commit dc19e63 ("[build] Construct all-drivers list based on driver class") accidentally excluded the USB bus drivers from the list of files parsed in order to create PCI 3.0 device ID lists. Fix by returning $(DRIVERS) to its previous definition as a list of all driver files, and use only $(DRIVERS_ipxe) to contain the filtered list containing only those drivers which we want to include in the "all-drivers" build. Reported-by: Mary-Ann Johnson <MaryAnn.Johnson@displaylink.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Construct all-drivers list based on driver classMichael Brown2015-04-221-1/+1
| | | | | | | | | | | | The USB bus drivers (ehci.c and xhci.c) have PCI device ID tables and hence PCI_ROM() lines, but should probably not be included in the all-drivers build on this basis, since they do nothing useful unless a USB network driver is also present. Fix by constructing the all-drivers list based on the driver class (i.e. the portion of the source path immediately after "drivers/"). Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Add ability to dump PCI device ID listMichael Brown2015-04-132-0/+24
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Rewrite parserom.pl to support multiple source filesRobin Smidsrød2015-04-131-51/+244
| | | | | | | | | | | | | | | | | Running util/parserom.pl on all source files (637) one by one takes approximately 35 seconds because of the startup cost of each invocation. With the utility rewritten to support multiple source files it now takes approximately 1 second to scan all source files for ROM declarations. The --exclude-driver and --exclude-driver-class options have been added, making it possible to skip certain source files from being scanned at all. In addition --debug option has been added to more easily trace progress. Finally --help option was added to show usage information. Signed-off-by: Robin Smidsrød <robin@smidsrod.no> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Fix the REQUIRE_SYMBOL mechanismMichael Brown2015-03-051-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | At some point in the past few years, binutils became more aggressive at removing unused symbols. To function as a symbol requirement, a relocation record must now be in a section marked with @progbits and must not be in a section which gets discarded during the link (either via --gc-sections or via /DISCARD/). Update REQUIRE_SYMBOL() to generate relocation records meeting these criteria. To minimise the impact upon the final binary size, we use existing symbols (specified via the REQUIRING_SYMBOL() macro) as the relocation targets where possible. We use R_386_NONE or R_X86_64_NONE relocation types to prevent any actual unwanted relocation taking place. Where no suitable symbol exists for REQUIRING_SYMBOL() (such as in config.c), the macro PROVIDE_REQUIRING_SYMBOL() can be used to generate a one-byte-long symbol to act as the relocation target. If there are versions of binutils for which this approach fails, then the fallback will probably involve killing off REQUEST_SYMBOL(), redefining REQUIRE_SYMBOL() to use the current definition of REQUEST_SYMBOL(), and postprocessing the linked ELF file with something along the lines of "nm -u | wc -l" to check that there are no undefined symbols remaining. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [legal] Add UBDL relicensing toolMichael Brown2015-03-021-0/+169
| | | | | | | | | | | | | | | | | | | | | | | | | | | The UBDL relicensing tool (util/relicense.pl) is designed to identify files which may be relicensed under a dual GPL+UBDL licence. It uses git-blame to identify the author of each line (using the -M and -C options to track lines moved or copied between files), and relicenses files for which all authors have given permission. The relicensing tool will ignore certain types of lines identified by git-blame: - empty lines - comments - standalone opening or closing braces - "#include ..." - "return 0;" - "return rc;" - "PCI_ROM(...)" - "FILE_LICENCE(...)" These lines either contain no meaningful content (e.g. empty lines), contain only non-copyrightable facts (e.g. PCI ROM IDs) or are sufficiently common within the codebase that git-blame is likely to misattribute their origin (e.g. "return 0"). Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [legal] Add support for the Unmodified Binary Distribution LicenceMichael Brown2015-03-021-0/+13
| | | | | | | | | | | | | | | Add the text for the Unmodified Binary Distribution Licence. This Licence allows for the distribution of unmodified binaries built from publicly available source code, without imposing the obligations of the GNU General Public License upon anyone who chooses to distribute only the unmodified binaries built from that source code. See the licence text for the precise terms and conditions. Add the licence GPL2_OR_LATER_OR_UBDL to the set of licences which can be declared using FILE_LICENCE(), and add the corresponding support to licence.pl. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [zbin] Use LZMA compressionMichael Brown2015-02-251-10/+86
| | | | | | | | | | | | | | | | | | | | | | | | | | LZMA provides significantly better compression (by ~15%) than the current NRV2B algorithm. We use a raw LZMA stream (aka LZMA1) to avoid the need for code to parse the LZMA2 block headers. We use parameters {lc=2,lp=0,pb=0} to reduce the stack space required by the decompressor to acceptable levels (around 8kB). Using lc=3 or pb=2 would give marginally better compression, but at the cost of substantially increasing the required stack space. The build process now requires the liblzma headers to be present on the build system, since we do not include a copy of an LZMA compressor within the iPXE source tree. The decompressor is written from scratch (based on XZ Embedded) and is entirely self-contained within the iPXE source. The branch-call-jump (BCJ) filter used to improve the compressibility is specific to iPXE. We choose not to use liblzma's built-in BCJ filter since the algorithm is complex and undocumented. Our BCJ filter achieves approximately the same results (on typical iPXE binaries) with a substantially simpler algorithm. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Disallow R_X86_64_32 relocationsMichael Brown2015-02-121-2/+1Star
| | | | | | | | | | | | | | | | | UEFI binaries may be relocated to any location within the 64-bit address space. We compile as position-independent code with hidden visibility, which should force all relocation records to be either PC-relative (in which case no PE relocations are required) or full 64-bit relocations. There should be no R_X86_64_32 relocation records, since that would imply an invalid assumption that code could not be relocated above 4GB. Remove support for R_X86_64_32 relocation records from util/elf2efi.c, so that any such records result in a build failure rather than a potential runtime failure. Reported-by: Jan Kundrát <jkt@kde.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Add efifatbin utilityMichael Brown2014-09-102-0/+261
| | | | | | | | | | | | | | | | | Add utility for constructing EFI fat binaries (dual 32/64-bit binaries, usable only on Apple EFI systems). This utility is not part of the standard build process. To use it: make util/efifatbin bin-i386-efi/ipxe.efi bin-x86_64-efi/ipxe.efi and then ./util/efifatbin bin-*-efi/ipxe.efi fat-ipxe.efi Requested-by: Brandon Penglase <bpenglase-ipxe@spaceservices.net> Tested-by: Brandon Penglase <bpenglase-ipxe@spaceservices.net> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Use PCI length field to obtain length of individual imagesMichael Brown2014-08-261-3/+2Star
| | | | | | | | | | | | | | Option::ROM currently uses the initialisation length field (single byte at offset 0x02) to determine the length of a ROM image within a multi-image ROM file. For PCI ROM images with a code type other than 0, the initialisation length field may not be present. Fix by using the PCI header's image length field instead. Note that this does not prevent us from correctly handling ISA ROMs, since ISA ROMs do not support multiple images within a single ROM BAR anyway. Inspired-by: Swift Geek <swiftgeek@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Merge util/geniso and util/genlisoChristian Hesse2014-05-142-133/+121Star
| | | | | | | | Rework geniso and genliso to provide a single merged utility for generating ISO images. Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Avoid errors when build directory is mounted via NFSMichael Brown2014-05-131-3/+3
| | | | | Reported-by: Robin Smidsrød <robin@smidsrod.no> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Fix LABEL name for .liso imagesChristian Hesse2013-12-061-1/+1
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [build] Update build system for Syslinux 6.xChristian Hesse2013-11-151-0/+8
| | | | | | | | | Syslinux 6.x places its files into a bios subdirectory, and requires that a ldlinux.c32 module be included within the ISO image. Add the relevant search paths for isolinux.bin, and include the file ldlinux.c32 within the ISO image if it exists. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [libc] Redefine low 8 bits of error code as "platform error code"Michael Brown2013-04-191-0/+5
| | | | | | | | | | The low 8 bits of an iPXE error code are currently defined as the closest equivalent PXE error code. Generalise this scheme to platforms other than PC-BIOS by extending this definition to "closest equivalent platform error code". This allows for the possibility of returning meaningful errors via EFI APIs. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Fix building with newer binutilsMichael Brown2013-03-141-0/+2
| | | | | | | | | | Newer versions of bfd.h require definitions for the PACKAGE and PACKAGE_VERSION macros used by autotools. Work around this by manually defining these macros before including bfd.h. Originally-fixed-by: Brandon Penglase <bpenglase-ipxe@spaceservices.net> Tested-by: Brandon Penglase <bpenglase-ipxe@spaceservices.net> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [zbin] Fix size used for memset in alloc_output_fileDaniel P. Berrange2013-03-051-1/+1
| | | | | | | | | | | | | | | | The output->buf field is a pointer, not an array, so sizeof() is not applicable. We must use the allocated string length instead. Identified by gcc: util/zbin.c: In function ‘alloc_output_file’: util/zbin.c:146:37: warning: argument to ‘sizeof’ in ‘memset’ call is the same expression as the destination; did you mean to dereference it? [-Wsizeof-pointer-memaccess] memset ( output->buf, 0xff, sizeof ( output->buf ) ); Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [efi] Ensure EFI binaries comply with Authenticode requirementsMichael Brown2013-02-251-1/+4
| | | | | | | | Authenticode requires that the size of the raw file must equal the size of the OptionalHeader.SizeOfHeaders plus the sum of all sections' SizeOfRawData. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Fix uninitialised-variable warning in einfo.cMichael Brown2012-10-221-2/+3
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Fix up checksum in UNDI ROM header, if presentMichael Brown2012-08-151-0/+1
| | | | | | | | | | | The UNDI ROM header does contain a checksum byte. Apparently no-one cares about this, since iPXE has left it as zero for years without anyone noticing. Since Option::ROM now understands the UNDI ROM header, we may as well fix up the checksum byte for the sake of completeness. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Display UNDI ROM header in disrom.plMichael Brown2012-08-152-0/+96
| | | | | Requested-by: Daniel Wyatt <daniel.wyatt@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Allow for CALL NEAR in the option ROM initialisation entry pointDaniel Wyatt2012-08-151-0/+4
| | | | | | | | Option::ROM currently understands only JMP NEAR and JMP SHORT instructions in the initialisation entry point. At least one Broadcom option ROM has been observed to use a CALL NEAR instruction. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Update mergerom.pl to handle iPXE ROM headerMichael Brown2012-07-231-3/+18
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [romprefix] Report a pessimistic runtime size estimateMichael Brown2012-07-233-1/+88
| | | | | | | | | | | | | | | | PCI3.0 allows us to report a "runtime size" which can be smaller than the actual ROM size. On systems that support PMM our runtime size will be small (~2.5kB), which helps to conserve the limited option ROM space. However, there is no guarantee that the PMM allocation will succeed, and so we need to report the worst-case runtime size in the PCI header. Move the "shrunk ROM size" field from the PCI header to a new "iPXE ROM header", allowing it to be accessed by ROM-manipulation utilities such as disrom.pl. Reported-by: Anton D. Kachalov <mouse@yandex-team.ru> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [legal] Update FSF mailing address in GPL licence textsMichael Brown2012-07-2011-11/+22
| | | | | Suggested-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Avoid compiler warning on gcc 4.6Michael Brown2012-07-031-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 196751c ("[build] Enable warnings when building utilities") revealed a previously hidden compiler warning in util/nrv2b.c regarding an out-of-bounds array subscript in the code #if defined(SWD_BEST_OFF) if (s->best_pos[2] == 0) s->best_pos[2] = key + 1; #endif where best_pos[] is defined by #define SWD_BEST_OFF 1 #if defined(SWD_BEST_OFF) unsigned int best_off[ SWD_BEST_OFF ]; unsigned int best_pos[ SWD_BEST_OFF ]; #endif With SWD_BEST_OFF set to 1, it can be proven that all code paths referring to s->best_off[] and s->best_pos[] will never be executed, with the exception of the two lines above. Since these two lines alone can have no effect on execution, we can safely undefine SWD_BEST_OFF. Verified by comparing md5sums of bin/undionly.kpxe before and after the change. Signed-off-by: Michael Brown <mcb30@ipxe.org>
* [util] Update mergerom.pl to handle .mrom imagesMichael Brown2012-06-121-3/+6
| | | | Signed-off-by: Michael Brown <mcb30@ipxe.org>