summaryrefslogtreecommitdiffstats
path: root/src/util/disrom.pl
blob: 6b2b30738728ef5de71deab2e78a9c7286c9d98d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/perl -w
#
# Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

use strict;
use warnings;

use FindBin;
use lib "$FindBin::Bin";
use Option::ROM qw ( :all );

my $romfile = shift || "-";
my $rom = new Option::ROM;
$rom->load ( $romfile );

my $index = 0;

do {
  die "Not an option ROM image\n"
      unless $rom->{signature} == ROM_SIGNATURE;

  my $romlength = ( $rom->{length} * 512 );
  my $filelength = $rom->length;
  die "ROM image truncated (is $filelength, should be $romlength)\n"
      if $filelength < $romlength;

  printf "Index: %d, offset: 0x%08x\n\n", $index++, $rom->file_offset;
  printf "ROM header:\n\n";
  printf "  %-16s 0x%02x (%d)\n", "Length:",
	 $rom->{length}, ( $rom->{length} * 512 );
  printf "  %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $rom->{checksum},
	 ( ( $rom->checksum () == 0 ) ? "" : "INCORRECT: " ), $rom->checksum () if ( exists $rom->{checksum} );
  printf "  %-16s 0x%04x\n", "Init:", $rom->{init} if ( defined $rom->{init} );
  printf "  %-16s 0x%04x\n", "UNDI header:", $rom->{undi_header} if ( exists $rom->{undi_header} );
  printf "  %-16s 0x%04x\n", "PCI header:", $rom->{pci_header};
  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";
    printf "  %-16s %s\n", "Signature:", $pci->{signature};
    printf "  %-16s 0x%04x\n", "Vendor ID:", $pci->{vendor_id};
    printf "  %-16s 0x%04x\n", "Device ID:", $pci->{device_id};
    if ( $pci->{device_list} ) {
      printf "  %-16s %s\n", "Device list:",
	     ( join ( ", ", map { sprintf "0x%04x", $_ } $pci->device_list ) );
    }
    printf "  %-16s 0x%02x%02x%02x\n", "Device class:",
	   $pci->{base_class}, $pci->{sub_class}, $pci->{prog_intf};
    printf "  %-16s 0x%04x (%d)\n", "Image length:",
	   $pci->{image_length}, ( $pci->{image_length} * 512 );
    printf "  %-16s 0x%04x (%d)\n", "Runtime length:",
	   $pci->{runtime_length}, ( $pci->{runtime_length} * 512 );
    printf "  %-16s 0x%02x\n", "Code type:", $pci->{code_type};
    if ( exists $pci->{conf_header} ) {
      printf "  %-16s 0x%04x\n", "Config header:", $pci->{conf_header};
      printf "  %-16s 0x%04x\n", "CLP entry:", $pci->{clp_entry};
    }
    printf "\n";
  }

  my $pnp = $rom->pnp_header();
  if ( $pnp ) {
    printf "PnP header:\n\n";
    printf "  %-16s %s\n", "Signature:", $pnp->{signature};
    printf "  %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $pnp->{checksum},
	   ( ( $pnp->checksum == 0 ) ? "" : "INCORRECT: " ), $pnp->checksum;
    printf "  %-16s 0x%04x \"%s\"\n", "Manufacturer:",
	   $pnp->{manufacturer}, $pnp->manufacturer;
    printf "  %-16s 0x%04x \"%s\"\n", "Product:",
	   $pnp->{product}, $pnp->product;
    printf "  %-16s 0x%04x\n", "BCV:", $pnp->{bcv};
    printf "  %-16s 0x%04x\n", "BDV:", $pnp->{bdv};
    printf "  %-16s 0x%04x\n", "BEV:", $pnp->{bev};
    printf "\n";
  }

  my $undi = $rom->undi_header();
  if ( $undi ) {
    printf "UNDI header:\n\n";
    printf "  %-16s %s\n", "Signature:", $undi->{signature};
    printf "  %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $undi->{checksum},
	   ( ( $undi->checksum == 0 ) ? "" : "INCORRECT: " ), $undi->checksum;
    printf "  %-16s %d.%d.%d\n", "UNDI version:", $undi->{version_major},
	   $undi->{version_minor}, $undi->{version_revision};
    printf "  %-16s 0x%04x\n", "Loader entry:", $undi->{loader_entry};
    printf "  %-16s 0x%04x\n", "Stack size:", $undi->{stack_size};
    printf "  %-16s 0x%04x\n", "Data size:", $undi->{data_size};
    printf "  %-16s 0x%04x\n", "Code size:", $undi->{code_size};
    printf "  %-16s %s\n", "Bus type:", $undi->{bus_type};
    printf "\n";
  }

  my $ipxe = $rom->ipxe_header();
  if ( $ipxe ) {
    printf "iPXE header:\n\n";
    printf "  %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $ipxe->{checksum},
	   ( ( $ipxe->checksum == 0 ) ? "" : "INCORRECT: " ), $ipxe->checksum;
    printf "  %-16s 0x%02x (%d)\n", "Shrunk length:",
	   $ipxe->{shrunk_length}, ( $ipxe->{shrunk_length} * 512 );
    printf "  %-16s 0x%08x\n", "Build ID:", $ipxe->{build_id};
    printf "\n";
  }

} while ( $rom = $rom->next_image );