[prefix] Add .xrom prefix for a ROM that loads itself by PCI accesses
[people/pcmattman/gpxe.git] / src / util / makerom.pl
index aed3a56..68c3be9 100755 (executable)
@@ -130,14 +130,14 @@ sub writerom ($$) {
        close(R);
 }
 
        close(R);
 }
 
-sub checksum ($) {
-       my ($romref) = @_;
+sub checksum ($$) {
+       my ($romref, $romsize) = @_;
 
        substr($$romref, 6, 1) = "\x00";
 
        substr($$romref, 6, 1) = "\x00";
-       my $sum = unpack('%8C*', $$romref);
+       my $sum = unpack('%8C*', substr($$romref, 0, $romsize));
        substr($$romref, 6, 1) = chr(256 - $sum);
        # Double check
        substr($$romref, 6, 1) = chr(256 - $sum);
        # Double check
-       $sum = unpack('%8C*', $$romref);
+       $sum = unpack('%8C*', substr($$romref, 0, $romsize));
        if ($sum != 0) {
                print "Checksum fails\n"
        } elsif ($opts{'v'}) {
        if ($sum != 0) {
                print "Checksum fails\n"
        } elsif ($opts{'v'}) {
@@ -146,10 +146,10 @@ sub checksum ($) {
 }
 
 sub makerom () {
 }
 
 sub makerom () {
-       my ($rom, $romsize);
+       my ($rom, $romsize, $stubsize);
 
 
-       getopts('3xi:p:s:v', \%opts);
-       $ARGV[0] or die "Usage: $0 [-s romsize] [-i ident] [-p vendorid,deviceid] [-x] [-3] rom-file\n";
+       getopts('3xni:p:s:v', \%opts);
+       $ARGV[0] or die "Usage: $0 [-s romsize] [-i ident] [-p vendorid,deviceid] [-n] [-x] [-3] rom-file\n";
        open(R, $ARGV[0]) or die "$ARGV[0]: $!\n";
        # Read in the whole ROM in one gulp
        my $filesize = read(R, $rom, MAXROMSIZE+1);
        open(R, $ARGV[0]) or die "$ARGV[0]: $!\n";
        # Read in the whole ROM in one gulp
        my $filesize = read(R, $rom, MAXROMSIZE+1);
@@ -183,10 +183,16 @@ sub makerom () {
        }
        # Pad with 0xFF to $romsize
        $rom .= "\xFF" x ($romsize - length($rom));
        }
        # Pad with 0xFF to $romsize
        $rom .= "\xFF" x ($romsize - length($rom));
-       if ($romsize >= 128 * 1024) {
-               print "Warning: ROM size exceeds extension BIOS limit\n";
+       # If this is a stub ROM, don't force header size to the full amount
+       if (!$opts{'n'}) {
+               if ($romsize >= 128 * 1024) {
+                       print "Warning: ROM size exceeds extension BIOS limit\n";
+               }
+               substr($rom, 2, 1) = chr(($romsize / 512) % 256);
+       } else {
+               $stubsize = ord(substr($rom, 2, 1)) * 512;
+               print "Stub size is $stubsize\n" if $opts{'v'};
        }
        }
-       substr($rom, 2, 1) = chr(($romsize / 512) % 256);
        print "ROM size is $romsize\n" if $opts{'v'};
        # set the product string only if we don't have one yet
        my $pnp_hdr_offset = unpack('v', substr($rom, PNP_PTR_LOC, 2));
        print "ROM size is $romsize\n" if $opts{'v'};
        # set the product string only if we don't have one yet
        my $pnp_hdr_offset = unpack('v', substr($rom, PNP_PTR_LOC, 2));
@@ -196,7 +202,7 @@ sub makerom () {
        # 3c503 requires last two bytes to be 0x80
        substr($rom, MINROMSIZE-2, 2) = "\x80\x80"
                if ($opts{'3'} and $romsize == MINROMSIZE);
        # 3c503 requires last two bytes to be 0x80
        substr($rom, MINROMSIZE-2, 2) = "\x80\x80"
                if ($opts{'3'} and $romsize == MINROMSIZE);
-       checksum(\$rom);
+       checksum(\$rom, $opts{'n'} ? $stubsize : $romsize);
        writerom($ARGV[0], \$rom);
 }
 
        writerom($ARGV[0], \$rom);
 }
 
@@ -213,7 +219,7 @@ sub modrom () {
        print "$filesize bytes read\n" if $opts{'v'};
        pcipnpheaders(\$rom, undef);
        undiheaders(\$rom);
        print "$filesize bytes read\n" if $opts{'v'};
        pcipnpheaders(\$rom, undef);
        undiheaders(\$rom);
-       checksum(\$rom);
+       checksum(\$rom, ord(substr($rom, 2, 1)) * 512);
        writerom($ARGV[0], \$rom);
 }
 
        writerom($ARGV[0], \$rom);
 }