Skip to content

Commit

Permalink
[util] Use PCI length field to obtain length of individual images
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Aug 26, 2014
1 parent 8b64cc7 commit ee0c249
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions src/util/Option/ROM.pm
Expand Up @@ -266,11 +266,10 @@ sub set {

# Split out any data belonging to the next image
delete $self->{next_image};
my $length = ( $hash->{length} * 512 );
my $pci_header = $hash->pci_header();
if ( ( $length < length $data ) &&
( defined $pci_header ) &&
if ( ( defined $pci_header ) &&
( ! ( $pci_header->{last_image} & PCI_LAST_IMAGE ) ) ) {
my $length = ( $pci_header->{image_length} * 512 );
my $remainder = substr ( $data, $length );
$data = substr ( $data, 0, $length );
$self->{next_image} = new Option::ROM;
Expand Down

0 comments on commit ee0c249

Please sign in to comment.