Updated slugimage to the latest upstream version, which fixes the small kernel bug which OpenWRT exposed.

SVN-Revision: 5923
This commit is contained in:
Rod Whitby 2006-12-29 03:37:34 +00:00
parent e7cd65a591
commit 21262ab671

View file

@ -410,7 +410,7 @@ sub readInFirmware {
} }
else { else {
# Slurp up the data, based on whether a header is present or not # Slurp up the data, based on whether a header and/or data is present or not
if ($_->{'header'}) { if ($_->{'header'}) {
# Read the length, and grab the data based on the length. # Read the length, and grab the data based on the length.
@ -422,6 +422,11 @@ sub readInFirmware {
$_->{'data'} = substr($firmware_buf, $_->{'offset'} + $_->{'header'}, $data_len); $_->{'data'} = substr($firmware_buf, $_->{'offset'} + $_->{'header'}, $data_len);
} }
} }
elsif ($_->{'pseudo'} and not defined $_->{'file'} and
(substr($firmware_buf, $_->{'offset'}, $_->{'size'}) eq
(pack("C", 0xff) x $_->{'size'}))) {
$debug and printf("Skipping empty pseudo partition <%s>\n", $_->{'name'});
}
else { else {
# Grab the whole partition, using the maximum size. # Grab the whole partition, using the maximum size.
@ -557,6 +562,11 @@ sub readInFirmwareParts {
sub layoutPartitions { sub layoutPartitions {
my(@partitions) = @_; my(@partitions) = @_;
# Find the kernel partition, and save a pointer to it for later use
my $kernel;
map { ($_->{'name'} eq "Kernel") && ($kernel = $_); } @partitions;
$kernel or die "Couldn't find the kernel partition\n";
# Find the last variable size partition, and save a pointer to it for later use # Find the last variable size partition, and save a pointer to it for later use
my $lastdisk; my $lastdisk;
my $directory_offset; my $directory_offset;
@ -588,66 +598,33 @@ sub layoutPartitions {
$debug and printf("Pointer is 0x%08X\n", $pointer); $debug and printf("Pointer is 0x%08X\n", $pointer);
# If this is the last variable size partition, then fill the rest of the space. # Determine the start and offset of the current partition.
if ($_->{'name'} eq $lastdisk->{'name'}) { if (defined $_->{'offset'}) {
$_->{'size'} = paddedSize($directory_offset + $flash_start - $pointer); $_->{'start'} = $flash_start + $_->{'offset'};
$debug and printf("Padding last variable partition <%s> to 0x%08X bytes\n", $_->{'name'}, $_->{'size'}); # Check for running past the defined start of the partition.
} if (($pointer > $_->{'start'}) and not $_->{'pseudo'}) {
die sprintf("Ran out of flash space before <%s> - %s too large.\n", $_->{'name'},
# Handle requests for partition creation first. sprintf("0x%05X bytes", ($pointer - $_->{'start'})));
if (defined $_->{'size'} and not defined $_->{'data'} and ($_->{'name'} ne "FIS directory")) {
# A zero size is a request to fill all available space.
if ($_->{'size'} == 0) {
# Grab the start of the FIS directory, and use all the space up to there.
$_->{'size'} = paddedSize($directory_offset + $flash_start - $pointer);
# Create an empty partition of the requested size.
$_->{'data'} = padBytes("", $_->{'size'});
$debug and printf("Creating empty partition <%s> of 0x%08X bytes\n", $_->{'name'}, $_->{'size'});
}
if (not defined $_->{'offset'}) {
# Check to make sure that the requested size is not too large.
if (($pointer + $_->{'size'}) > ($flash_start + $directory_offset)) {
die "Ran out of flash space in <", $_->{'name'}, ">\n";
}
}
else {
# Check to make sure that the requested size is not too large.
if (($_->{'offset'} + $_->{'size'}) > ($flash_start + $directory_offset)) {
die "Ran out of flash space in <", $_->{'name'}, ">\n";
}
} }
} }
# Then handle known partitions, and allocate them. # If offset is not defined, then calculate it.
if (defined $_->{'size'}) { else {
$_->{'start'} = $pointer;
$_->{'offset'} = $_->{'start'} - $flash_start;
}
# Determine the start and offset of the current partition. my $size = defined $_->{'data'} ? length($_->{'data'}) : 0;
if (defined $_->{'offset'}) {
$_->{'start'} = $flash_start + $_->{'offset'};
}
# If offset is not defined, then calculate it. # Add skip regions for the partitions with headers.
else { if ($_->{'header'} > 0) {
$_->{'start'} = $pointer; # Define the skip region for the initial Sercomm header.
$_->{'offset'} = $_->{'start'} - $flash_start; push(@{$_->{'skips'}},
} { 'offset' => 0, 'size' => $_->{'header'}, 'data' => undef });
# Allow for the Sercomm header to be prepended to the data.
$size += $_->{'header'};
my $size = defined $_->{'data'} ? length($_->{'data'}) : 0; # Determine if the partition overlaps the ramdisk boundary.
# Add skip regions for the partitions with headers.
if ($_->{'header'} > 0) {
# Define the skip region for the initial Sercomm header.
push(@{$_->{'skips'}},
{ 'offset' => 0, 'size' => $_->{'header'}, 'data' => undef });
# Allow for the Sercomm header to be prepended to the data.
$size += $_->{'header'};
}
# Determine if the partition requires a Sercomm skip region.
if (($_->{'offset'} < $ramdisk_offset) and if (($_->{'offset'} < $ramdisk_offset) and
(($_->{'offset'} + $size) > $ramdisk_offset)) { (($_->{'offset'} + $size) > $ramdisk_offset)) {
# Define the skip region for the inline Sercomm header. # Define the skip region for the inline Sercomm header.
@ -657,37 +634,65 @@ sub layoutPartitions {
# Allow for the Sercomm header to be inserted in the data. # Allow for the Sercomm header to be inserted in the data.
$size += 16; $size += 16;
} }
# Extend to another block if required.
if ($size > $_->{'size'}) {
$_->{'size'} = $size;
printf("Extending partition <%s> to 0x%08X bytes\n", $_->{'name'}, $_->{'size'});
}
# Keep the user appraised ...
$debug and printf("Allocated <%s> from 0x%08X to 0x%08X (%s / %s)\n",
$_->{'name'}, $_->{'start'}, $_->{'start'} + $_->{'size'},
($size >= $block_size ?
sprintf("%d blocks", numBlocks($size)) :
sprintf("0x%05X bytes", $size)),
($_->{'size'} >= $block_size ?
sprintf("%d blocks", numBlocks($_->{'size'})) :
sprintf("0x%05X bytes", $_->{'size'})));
# Check to make sure we have not run out of room.
if (($_->{'start'} + $_->{'size'}) > ($flash_start + $flash_len)) {
die "Ran out of flash space in <", $_->{'name'}, ">\n";
}
$debug and printf("Moving pointer from 0x%08X to 0x%08X (0x%08X + 0x%08X)\n",
$pointer, paddedSize($_->{'start'} + $_->{'size'}),
$_->{'start'}, $_->{'size'});
# Move the pointer up, in preparation for the next partition.
$pointer = paddedSize($_->{'start'} + $_->{'size'});
} }
# Partitions without headers cannot have skip regions.
elsif (($_->{'offset'} <= $ramdisk_offset) and
(($_->{'offset'} + $size) > $ramdisk_offset)) {
# Pad the kernel until it extends past the ramdisk offset.
push(@{$kernel->{'skips'}},
{ 'offset' => ($ramdisk_offset - $kernel->{'offset'}), 'size' => 16,
'data' => pack("N4", $block_size) });
$kernel->{'size'} = $ramdisk_offset - $kernel->{'offset'} + $block_size;
$kernel->{'data'} = padBytes($kernel->{'data'},
$kernel->{'size'} - $kernel->{'header'} - 16);
$_->{'offset'} = $ramdisk_offset + $block_size;
$_->{'start'} = $flash_start + $_->{'offset'};
$pointer = $_->{'start'};
$debug and printf("Extending kernel partition past ramdisk offset.\n");
}
# If this is the last variable size partition, then fill the rest of the space.
if ($_->{'name'} eq $lastdisk->{'name'}) {
$_->{'size'} = paddedSize($directory_offset + $flash_start - $pointer);
$debug and printf("Padding last variable partition <%s> to 0x%08X bytes\n", $_->{'name'}, $_->{'size'});
}
die sprintf("Partition size not defined in <%s>.\n", $_->{'name'})
unless defined $_->{'size'};
# Extend to another block if required.
if ($size > $_->{'size'}) {
if ($_->{'name'} eq $lastdisk->{'name'}) {
die sprintf("Ran out of flash space in <%s> - %s too large.\n", $_->{'name'},
sprintf("0x%05X bytes", ($size - $_->{'size'})));
}
$_->{'size'} = $size;
printf("Extending partition <%s> to 0x%08X bytes\n", $_->{'name'}, $_->{'size'});
}
# Keep the user appraised ...
$debug and printf("Allocated <%s> from 0x%08X to 0x%08X (%s / %s)\n",
$_->{'name'}, $_->{'start'}, $_->{'start'} + $_->{'size'},
($size >= $block_size ?
sprintf("%d blocks", numBlocks($size)) :
sprintf("0x%05X bytes", $size)),
($_->{'size'} >= $block_size ?
sprintf("%d blocks", numBlocks($_->{'size'})) :
sprintf("0x%05X bytes", $_->{'size'})));
# Check to make sure we have not run out of room.
if (($_->{'start'} + $_->{'size'}) > ($flash_start + $flash_len)) {
die "Ran out of flash space in <", $_->{'name'}, ">\n";
}
$debug and printf("Moving pointer from 0x%08X to 0x%08X (0x%08X + 0x%08X)\n",
$pointer, paddedSize($_->{'start'} + $_->{'size'}),
$_->{'start'}, $_->{'size'});
# Move the pointer up, in preparation for the next partition.
$pointer = paddedSize($_->{'start'} + $_->{'size'});
} @partitions; } @partitions;
return; return;
@ -916,7 +921,7 @@ sub defaultPartitions {
'offset'=>0x007f8000, 'size'=>0x00004000, 'offset'=>0x007f8000, 'size'=>0x00004000,
'variable'=>0, 'header'=>0, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0}, 'variable'=>0, 'header'=>0, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0},
{'name'=>'Microcode', 'file'=>'NPE-B', {'name'=>'Microcode', 'file'=>'NPE-B',
'offset'=>0x007fc000, 'size'=>0x00003ff0, 'offset'=>0x007fc000, 'size'=>0x00003000,
'variable'=>0, 'header'=>16, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0}, 'variable'=>0, 'header'=>16, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0},
{'name'=>'Trailer', 'file'=>'Trailer', {'name'=>'Trailer', 'file'=>'Trailer',
'offset'=>0x007ffff0, 'size'=>0x00000010, 'offset'=>0x007ffff0, 'size'=>0x00000010,
@ -1110,10 +1115,7 @@ if (defined $ramdisk) {
if (defined $size) { if (defined $size) {
$entry{'size'} = $size * $block_size; $entry{'size'} = $size * $block_size;
# Create an empty partition of the requested size. # Create an empty partition of the requested size.
$entry{'data'} = padBytes("", $entry{'size'}); $entry{'data'} = padBytes("", $entry{'size'} - $entry{'header'});
if ($entry{'header'}) {
$entry{'data'} = padBytes("", $entry{'size'} - $entry{'header'});
}
} }
\%entry; \%entry;