Annotation of qemu/roms/ipxe/src/util/catrom.pl, revision 1.1

1.1     ! root        1: #!/usr/bin/perl -w
        !             2: 
        !             3: use warnings;
        !             4: use strict;
        !             5: 
        !             6: use bytes;
        !             7: 
        !             8: use constant MAX_ROM_LEN => 1024*1024;
        !             9: use constant PCI_OFF => 0x18;
        !            10: use constant INDICATOR_OFF => 0x15;
        !            11: 
        !            12: my $total_len = 0;
        !            13: my @romfiles = @ARGV
        !            14:     or die "Usage: $0 rom-file-1 rom-file-2 ... > multi-rom-file\n";
        !            15: 
        !            16: while ( my $romfile = shift @romfiles ) {
        !            17:   my $last = @romfiles ? 0 : 1;
        !            18: 
        !            19:   open ROM, "<$romfile" or die "Could not open $romfile: $!\n";
        !            20:   my $len = read ( ROM, my $romdata, MAX_ROM_LEN )
        !            21:       or die "Could not read $romfile: $!\n";
        !            22:   close ROM;
        !            23: 
        !            24:   die "$romfile is not a ROM file\n"
        !            25:       unless substr ( $romdata, 0, 2 ) eq "\x55\xAA";
        !            26: 
        !            27:   ( my $checklen ) = unpack ( 'C', substr ( $romdata, 2, 1 ) );
        !            28:   $checklen *= 512;
        !            29:   die "$romfile has incorrect length field $checklen (should be $len)\n"
        !            30:       unless $len == $checklen;
        !            31: 
        !            32:   ( my $pci ) = unpack ( 'v', substr ( $romdata, PCI_OFF, 2 ) );
        !            33:   die "Invalid PCI offset field in $romfile\n"
        !            34:       if $pci >= $len;
        !            35:   die "No PCIR signature in $romfile\n"
        !            36:       unless substr ( $romdata, $pci, 4 ) eq "PCIR";
        !            37:   
        !            38:   ( my $indicator ) =
        !            39:       unpack ( 'C', substr ( $romdata, $pci + INDICATOR_OFF, 1 ) );
        !            40:   my $msg = sprintf ( "$romfile: indicator was %02x, ", $indicator );
        !            41:   $indicator &= ! ( 1 << 7 );
        !            42:   $indicator |= ( $last << 7 );
        !            43:   $msg .= sprintf ( "now %02x\n", $indicator );
        !            44:   substr ( $romdata, $pci + INDICATOR_OFF, 1 ) = pack ( 'C', $indicator );
        !            45:   warn $msg;
        !            46: 
        !            47:   print $romdata;
        !            48: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.