Re: [ipxe-devel] [PATCH 2/2] [util] Add support for EFI ROM images
On 16/01/2019 16:37, Petr Borsodi wrote: The Option::ROM module recognizes and checks EFI header of image. The disrom.pl utility dumps this header if is present. Applied, thanks: http://git.ipxe.org/ipxe.git/commitdiff/de4565cbe Michael ___ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel
[ipxe-devel] [PATCH 2/2] [util] Add support for EFI ROM images
The Option::ROM module recognizes and checks EFI header of image. The disrom.pl utility dumps this header if is present. --- src/util/Option/ROM.pm | 66 +- src/util/disrom.pl | 13 + 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/util/Option/ROM.pm b/src/util/Option/ROM.pm index 7bbd6986..51831adf 100644 --- a/src/util/Option/ROM.pm +++ b/src/util/Option/ROM.pm @@ -176,9 +176,10 @@ use constant PCI_LAST_IMAGE => 0x80; use constant PNP_SIGNATURE => '$PnP'; use constant UNDI_SIGNATURE => 'UNDI'; use constant IPXE_SIGNATURE => 'iPXE'; +use constant EFI_SIGNATURE => 0x0ef1; our @EXPORT_OK = qw ( ROM_SIGNATURE PCI_SIGNATURE PCI_LAST_IMAGE - PNP_SIGNATURE UNDI_SIGNATURE IPXE_SIGNATURE ); + PNP_SIGNATURE UNDI_SIGNATURE IPXE_SIGNATURE EFI_SIGNATURE ); our %EXPORT_TAGS = ( all => [ @EXPORT_OK ] ); use constant JMP_SHORT => 0xeb; @@ -458,6 +459,25 @@ sub ipxe_header { =pod +=item C<< efi_header () >> + +Return a C object representing the ROM's EFI header, +if present. + +=cut + +sub efi_header { + my $hash = shift; + my $self = tied(%$hash); + + my $pci = $hash->pci_header (); + return undef unless defined $pci; + + return Option::ROM::EFI->new ( $self, $pci ); +} + +=pod + =item C<< next_image () >> Return a C object representing the next image within the @@ -813,4 +833,48 @@ sub fix_checksum { $hash->{checksum} = ( ( $hash->{checksum} - $hash->checksum() ) & 0xff ); } +## +# +# Option::ROM::EFI +# +## + +package Option::ROM::EFI; + +use strict; +use warnings; +use Carp; +use bytes; + +sub new { + my $class = shift; + my $rom = shift; + my $pci = shift; + + my $hash = {}; + tie %$hash, "Option::ROM::Fields", { +rom => $rom, +data => $rom->{data}, +offset => 0x00, +length => 0x18, +fields => { + signature => { offset => 0x00, length => 0x02, pack => "S" }, + init_size => { offset => 0x02, length => 0x02, pack => "S" }, + efi_signature => { offset => 0x04, length => 0x04, pack => "L" }, + efi_subsystem => { offset => 0x08, length => 0x02, pack => "S" }, + efi_machine_type => { offset => 0x0a, length => 0x02, pack => "S" }, + compression_type => { offset => 0x0c, length => 0x02, pack => "S" }, + efi_image_offset => { offset => 0x16, length => 0x02, pack => "S" }, +}, + }; + bless $hash, $class; + + my $self = tied ( %$hash ); + + return undef unless ( $hash->{efi_signature} == Option::ROM::EFI_SIGNATURE && + $pci->{code_type} == 0x03 ); + + return $hash; +} + 1; diff --git a/src/util/disrom.pl b/src/util/disrom.pl index 71eee590..6b2b3073 100755 --- a/src/util/disrom.pl +++ b/src/util/disrom.pl @@ -51,6 +51,19 @@ do { printf " %-16s 0x%04x\n", "PnP header:", $rom->{pnp_header} if ( exists $rom->{pnp_header} ); printf "\n"; + my $efi = $rom->efi_header(); + if ( $efi ) { +printf "EFI header:\n\n"; +printf " %-16s 0x%04x (%d)\n", "Init size:", + $efi->{init_size}, ( $efi->{init_size} * 512 ); +printf " %-16s 0x%08x\n", "EFI Signature:", $efi->{efi_signature}; +printf " %-16s 0x%04x\n", "EFI Subsystem:", $efi->{efi_subsystem}; +printf " %-16s 0x%04x\n", "EFI Machine type:", $efi->{efi_machine_type}; +printf " %-16s 0x%04x\n", "Compression type:", $efi->{compression_type}; +printf " %-16s 0x%04x\n", "EFI Image offset:", $efi->{efi_image_offset}; +printf "\n"; + } + my $pci = $rom->pci_header(); if ( $pci ) { printf "PCI header:\n\n"; -- 2.20.1.windows.1 ___ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel
[ipxe-devel] [PATCH 2/2] [util] Add support for EFI ROM images
The Option::ROM module recognizes and checks EFI header of image. The disrom.pl utility dumps this header if is present. --- src/util/Option/ROM.pm | 66 +- src/util/disrom.pl | 13 + 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/util/Option/ROM.pm b/src/util/Option/ROM.pm index 7bbd6986..51831adf 100644 --- a/src/util/Option/ROM.pm +++ b/src/util/Option/ROM.pm @@ -176,9 +176,10 @@ use constant PCI_LAST_IMAGE => 0x80; use constant PNP_SIGNATURE => '$PnP'; use constant UNDI_SIGNATURE => 'UNDI'; use constant IPXE_SIGNATURE => 'iPXE'; +use constant EFI_SIGNATURE => 0x0ef1; our @EXPORT_OK = qw ( ROM_SIGNATURE PCI_SIGNATURE PCI_LAST_IMAGE - PNP_SIGNATURE UNDI_SIGNATURE IPXE_SIGNATURE ); + PNP_SIGNATURE UNDI_SIGNATURE IPXE_SIGNATURE EFI_SIGNATURE ); our %EXPORT_TAGS = ( all => [ @EXPORT_OK ] ); use constant JMP_SHORT => 0xeb; @@ -458,6 +459,25 @@ sub ipxe_header { =pod +=item C<< efi_header () >> + +Return a C object representing the ROM's EFI header, +if present. + +=cut + +sub efi_header { + my $hash = shift; + my $self = tied(%$hash); + + my $pci = $hash->pci_header (); + return undef unless defined $pci; + + return Option::ROM::EFI->new ( $self, $pci ); +} + +=pod + =item C<< next_image () >> Return a C object representing the next image within the @@ -813,4 +833,48 @@ sub fix_checksum { $hash->{checksum} = ( ( $hash->{checksum} - $hash->checksum() ) & 0xff ); } +## +# +# Option::ROM::EFI +# +## + +package Option::ROM::EFI; + +use strict; +use warnings; +use Carp; +use bytes; + +sub new { + my $class = shift; + my $rom = shift; + my $pci = shift; + + my $hash = {}; + tie %$hash, "Option::ROM::Fields", { + rom => $rom, + data => $rom->{data}, + offset => 0x00, + length => 0x18, + fields => { + signature => { offset => 0x00, length => 0x02, pack => "S" }, + init_size => { offset => 0x02, length => 0x02, pack => "S" }, + efi_signature => { offset => 0x04, length => 0x04, pack => "L" }, + efi_subsystem => { offset => 0x08, length => 0x02, pack => "S" }, + efi_machine_type => { offset => 0x0a, length => 0x02, pack => "S" }, + compression_type => { offset => 0x0c, length => 0x02, pack => "S" }, + efi_image_offset => { offset => 0x16, length => 0x02, pack => "S" }, + }, + }; + bless $hash, $class; + + my $self = tied ( %$hash ); + + return undef unless ( $hash->{efi_signature} == Option::ROM::EFI_SIGNATURE && + $pci->{code_type} == 0x03 ); + + return $hash; +} + 1; diff --git a/src/util/disrom.pl b/src/util/disrom.pl index 71eee590..6b2b3073 100755 --- a/src/util/disrom.pl +++ b/src/util/disrom.pl @@ -51,6 +51,19 @@ do { printf " %-16s 0x%04x\n", "PnP header:", $rom->{pnp_header} if ( exists $rom->{pnp_header} ); printf "\n"; + my $efi = $rom->efi_header(); + if ( $efi ) { + printf "EFI header:\n\n"; + printf " %-16s 0x%04x (%d)\n", "Init size:", + $efi->{init_size}, ( $efi->{init_size} * 512 ); + printf " %-16s 0x%08x\n", "EFI Signature:", $efi->{efi_signature}; + printf " %-16s 0x%04x\n", "EFI Subsystem:", $efi->{efi_subsystem}; + printf " %-16s 0x%04x\n", "EFI Machine type:", $efi->{efi_machine_type}; + printf " %-16s 0x%04x\n", "Compression type:", $efi->{compression_type}; + printf " %-16s 0x%04x\n", "EFI Image offset:", $efi->{efi_image_offset}; + printf "\n"; + } + my $pci = $rom->pci_header(); if ( $pci ) { printf "PCI header:\n\n"; -- 2.20.1.windows.1 ___ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel