Annotation of qemu/roms/ipxe/src/util/swapdevids.pl, revision 1.1.1.1

1.1       root        1: #!/usr/bin/perl -w
                      2: #
                      3: #      Program to reverse the device identifier IDs in the PCIR and PnP
                      4: #      structures in a ROM for old non-compliant BIOSes
                      5: #
                      6: #      GPL, Ken Yap 2001
                      7: #
                      8: 
                      9: use bytes;
                     10: 
                     11: use IO::Seekable;
                     12: 
                     13: sub swaplocs ($$$)
                     14: {
                     15:        my ($dataref, $loc1, $loc2) = @_;
                     16:        my ($t);
                     17: 
                     18:        $t = substr($$dataref, $loc1, 1);
                     19:        substr($$dataref, $loc1, 1) = substr($$dataref, $loc2, 1);
                     20:        substr($$dataref, $loc2, 1) = $t;
                     21: }
                     22: 
                     23: sub printdevids ($$)
                     24: {
                     25:        my ($dataref, $loc) = @_;
                     26: 
                     27:        return (sprintf "%02x %02x %02x", unpack('C3', substr($$dataref, $loc, 3)));
                     28: }
                     29: 
                     30: $#ARGV >= 0 or die "Usage: $0 romimage\n";
                     31: $file = $ARGV[0];
                     32: open(F, "+<$file") or die "$file: $!\n";
                     33: binmode(F);
                     34: # Handle up to 64kB ROM images
                     35: $len = read(F, $data, 64*1024);
                     36: defined($len) or die "$file: $!\n";
                     37: substr($data, 0, 2) eq "\x55\xAA" or die "$file: Not a boot ROM image\n";
                     38: ($pci, $pnp) = unpack('v2', substr($data, 0x18, 4));
                     39: ($pci < $len and $pnp < $len) or die "$file: Not a PCI PnP ROM image\n";
                     40: (substr($data, $pci, 4) eq 'PCIR' and substr($data, $pnp, 4) eq '$PnP')
                     41:        or die "$file: No PCI and PNP structures, not a PCI PNP ROM image\n";
                     42: &swaplocs(\$data, $pci+13, $pci+15);
                     43: &swaplocs(\$data, $pnp+18, $pnp+20);
                     44: seek(F, 0, SEEK_SET) or die "$file: Cannot seek to beginning\n";
                     45: print F $data;
                     46: close(F);
                     47: print "PCI devids now: ", &printdevids(\$data, $pci+13), "\n";
                     48: print "PnP devids now: ", &printdevids(\$data, $pnp+18), "\n";
                     49: exit(0);

unix.superglobalmegacorp.com

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