--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rombuild/dumpdirs.pl Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,141 @@
+#
+# Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Perl script to dump the ROM root directory
+#
+
+my $imagefile="ba_001.engbuild.img";
+my $imageoffset=0;
+
+die "Usage: checkstubs [imagefile]\n" if (@ARGV>1);
+if (@ARGV==1)
+ {
+ $imagefile = @ARGV[0];
+ $symbolfile = $imagefile;
+ }
+
+# 1. Read the root directory list
+#
+
+open IMAGE, "<$imagefile" or die "Cannot open $imagefile";
+binmode IMAGE;
+
+my $imagedata;
+my $errors=0;
+my $romrootdirectory;
+
+read IMAGE, $imagedata, 20;
+if ($imagedata =~ /^EPOC....ROM/)
+ {
+ $imageoffset -= 256; # compensate for REPRO header
+ }
+
+sub readimage
+ {
+ my ($length, $linaddr) = @_;
+ my $imagedata;
+ if ($linaddr != 0) # read from next address
+ {
+ if (!seek(IMAGE, $linaddr-$imageoffset, 0))
+ {
+ printf "Can't seek to address 0x%x\n", $linaddr;
+ $errors++;
+ return "";
+ }
+ }
+ read IMAGE, $imagedata, $length;
+ return $imagedata;
+ }
+
+sub readword
+ {
+ my ($linaddr) = @_;
+ return unpack "V", readimage(4, $linaddr);
+ }
+
+# really want read from address 0, but readword does not allow it
+# so need to read from word 1 and mask out extra byte read
+if ((readword(1) & 0x00ffffff) == 0x00EA0000)
+ {
+ printf "Kernel ROM image: %s\n\n", $imagefile;
+ $imageoffset += readword(0x8c);
+ readword(); # image size
+ $romrootdirectory = readword();
+ }
+else
+ {
+ printf "Extension ROM image: %s\n\n", $imagefile;
+ $imageoffset += readword(0x0c);
+ readword(); # image size
+ $romrootdirectory = readword();
+ }
+
+my $numroots = readword($romrootdirectory);
+printf "Rom Root Directory List at 0x%08x - %d entries\n", $romrootdirectory, $numroots;
+
+my @directories;
+my $root;
+while ($numroots)
+ {
+ my $variant = readword();
+ $root = readword();
+ $numroots -= 1;
+ printf "Variant 0x%08x @ 0x%08x\n", $variant, $root;
+ push @directories, $root;
+ }
+
+foreach $root (@directories)
+ {
+ printf "\nDirectory @ 0x%08x:\n", $root;
+ print_directory($root, "");
+ }
+
+my %seen_before;
+
+sub print_directory
+ {
+ my ($dir, $prefix) = @_;
+ if ($seen_before{$dir} == 1)
+ {
+ printf "%s ...\n", $prefix;
+ return;
+ }
+ $seen_before{$dir} = 1;
+ my $entry = $dir+4;
+ my $end = $entry+readword($dir);
+
+ while ($entry < $end)
+ {
+ my $size = readword($entry);
+ my $linaddr = readword();
+ my $attributes = unpack "C", readimage(1);
+ my $namelen = unpack "C", readimage(1);
+ my $name = readimage($namelen*2);
+ $name =~ s/(.)./$1/g; # drop high byte of Unicode characters
+
+ if ($attributes & 0x10)
+ {
+ printf "%s %08x %02x %s\\\n", $prefix, $linaddr, $attributes, $name;
+ print_directory($linaddr, "$prefix |");
+ }
+ else
+ {
+ printf "%s %08x %02x %6d %s%s\n", $prefix, $linaddr, $attributes, $size,
+ ($seen_before{$linaddr}==1?" *":""), $name;
+ $seen_before{$linaddr} = 1;
+ }
+ $entry += 10 + $namelen*2;
+ $entry = ($entry+3)&~3;
+ }
+ }