Annotation of qemu/roms/ipxe/src/util/catrom.pl, revision 1.1.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.