80ac4af8f14f162abfaf943a0920da365ca444d5
[people/asdlkf/gpxe.git] / src / util / disrom.pl
1 #!/usr/bin/perl -w
2 #
3 # Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License as
7 # published by the Free Software Foundation; either version 2 of the
8 # License, or any later version.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 use strict;
20 use warnings;
21
22 use FindBin;
23 use lib "$FindBin::Bin";
24 use Option::ROM qw ( :all );
25
26 my $romfile = shift || "-";
27 my $rom = new Option::ROM;
28 $rom->load ( $romfile );
29
30 die "Not an option ROM image\n"
31     unless $rom->{signature} == ROM_SIGNATURE;
32
33 my $romlength = ( $rom->{length} * 512 );
34 my $filelength = $rom->length;
35 die "ROM image truncated (is $filelength, should be $romlength)\n"
36     if $filelength < $romlength;
37
38 printf "ROM header:\n\n";
39 printf "  Length:\t0x%02x (%d)\n", $rom->{length}, ( $rom->{length} * 512 );
40 printf "  Checksum:\t0x%02x (0x%02x)\n", $rom->{checksum}, $rom->checksum;
41 printf "  Init:\t\t0x%04x\n", $rom->{init};
42 printf "  UNDI header:\t0x%04x\n", $rom->{undi_header};
43 printf "  PCI header:\t0x%04x\n", $rom->{pci_header};
44 printf "  PnP header:\t0x%04x\n", $rom->{pnp_header};
45 printf "\n";
46
47 my $pci = $rom->pci_header();
48 if ( $pci ) {
49   printf "PCI header:\n\n";
50   printf "  Signature:\t%s\n", $pci->{signature};
51   printf "  Vendor id:\t0x%04x\n", $pci->{vendor_id};
52   printf "  Device id:\t0x%04x\n", $pci->{device_id};
53   printf "  Device class:\t0x%02x%02x%02x\n",
54          $pci->{base_class}, $pci->{sub_class}, $pci->{prog_intf};
55   printf "  Image length:\t0x%04x (%d)\n",
56          $pci->{image_length}, ( $pci->{image_length} * 512 );
57   printf "  Runtime length:\t0x%04x (%d)\n",
58          $pci->{runtime_length}, ( $pci->{runtime_length} * 512 );
59   printf "  Config header:\t0x%04x\n", $pci->{conf_header};
60   printf "  CLP entry:\t0x%04x\n", $pci->{clp_entry};
61   printf "\n";
62 }
63
64 my $pnp = $rom->pnp_header();
65 if ( $pnp ) {
66   printf "PnP header:\n\n";
67   printf "  Signature:\t%s\n", $pnp->{signature};
68   printf "  Checksum:\t0x%02x (0x%02x)\n", $pnp->{checksum}, $pnp->checksum;
69   printf "  Manufacturer:\t0x%04x \"%s\"\n",
70          $pnp->{manufacturer}, $pnp->manufacturer;
71   printf "  Product:\t0x%04x \"%s\"\n", $pnp->{product}, $pnp->product;
72   printf "  BCV:\t\t0x%04x\n", $pnp->{bcv};
73   printf "  BDV:\t\t0x%04x\n", $pnp->{bdv};
74   printf "  BEV:\t\t0x%04x\n", $pnp->{bev};
75   printf "\n";
76 }