From ee0c24902a07c78ed939dfeee3b32f1c7a633ebb Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 26 Aug 2014 11:42:42 +0100 Subject: [util] Use PCI length field to obtain length of individual images 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 Signed-off-by: Michael Brown --- src/util/Option/ROM.pm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src/util') diff --git a/src/util/Option/ROM.pm b/src/util/Option/ROM.pm index fb37ce4b..6c396730 100644 --- a/src/util/Option/ROM.pm +++ b/src/util/Option/ROM.pm @@ -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; -- cgit v1.2.3-55-g7522