1
0
Files
irix-657m-src/stand/arcs/IP27prom/zero_csum
2022-09-29 17:59:04 +03:00

53 lines
1.2 KiB
Perl
Executable File

#!/usr/bin/perl
#
# Computes the current checksum of a PROM's loadable sections, then
# uses the "tag" command to patch the binary so that the checksum
# becomes zero. This works because the tag number happens to go
# into a loadable section.
#
$max_prom_size = 10 * 1048576;
$convert = "../tools/convert/convert";
$tag = "/usr/sbin/tag";
if ($#ARGV < 0) {
print STDERR
"Usage: zero_csum prom_binary\n";
print STDERR
" Patches a PROM binary so that the checksum of the\n";
print STDERR
" loadable segments will be zero (according to\n";
print STDERR
" $convert -f pure).\n";
exit 1;
}
$prom_binary = $ARGV[0];
# Remove all signs of existing checksum modification, if any.
system "$tag 0 $prom_binary; $tag -c $prom_binary";
# Calculate current checksum
open(PROMDATA, "$convert -f pure $prom_binary 2> /dev/null |");
($prom_size = read(PROMDATA, $prom_data, $max_prom_size)) <= 0
&& die "Can't run: \"$convert -f pure $prom_binary\"";
close(PROMDATA);
$checksum = unpack("%8C*", $prom_data);
#printf "Patching $prom_binary to change checksum from $checksum to zero.\n";
# Tag increases byte sum by tag value (0 to 255) plus 1 ("tagged" bit).
$byte = 255 - $checksum % 256;
system "$tag $byte $prom_binary";
exit 0;