Allow the various sizes to vary

asm
Hamish Coleman 7 years ago
parent a1e67d3e35
commit 890d7e8252

@ -227,6 +227,9 @@ sub load_configfile {
# 0 1 2 3
# f table.00021510 1 0x00021510
$db->{symbols}->add(eval "$a[3]", $a[1]);
} elsif (m/^sizes align\W+/) {
my @a = split(/\W+/,$_);
$db->{sizes}{align} = $a[2];
}
}
}
@ -236,12 +239,12 @@ sub validate_pointer {
my $val = shift;
# Check it is aligned to 32bits
# FIXME - compare against db->{sizes}{align}, not hardcoded
if (!$val & 0x3) {
return undef;
}
my $size_ptr = 4;
if (!defined($db->{regions}->_addr2region($val,$size_ptr))) {
if (!defined($db->{regions}->_addr2region($val,$db->{sizes}{ptr}))) {
return undef;
}
@ -258,8 +261,7 @@ sub find_pointers {
my $i = $start;
while ($i < $end) {
my $size_ptr = 4;
my $buf = $db->{regions}->read($i,$size_ptr);
my $buf = $db->{regions}->read($i,$db->{sizes}{ptr});
die ("bad addr $i") if (!defined($buf));
my $val = unpack("V",$buf);
if (validate_pointer($db,$val)) {
@ -267,10 +269,9 @@ sub find_pointers {
$db->{p}{src}{$i} = $val;
$i += $size_ptr;
$i += $db->{sizes}{ptr};
} else {
my $align = 4; # FIXME - make this configurable
$i += $align;
$i += $db->{sizes}{align};
}
}
}
@ -313,19 +314,20 @@ sub glom_objects {
my $offset = 0;
while ($addr < $next_addr) {
# TODO - handle sizeof(int) != sizeof(ptr) and the addr offsets
# TODO - handle sizeof(word) != sizeof(ptr) and the addr offsets
# this will cause..
my $size_int = 4;
if (defined($db->{p}{src}{$addr})) {
$object->{p}{$offset} = $db->{p}{src}{$addr};
$object->{d}{$offset} = undef;
$addr += $db->{sizes}{ptr};
$offset += $db->{sizes}{ptr};
} else {
my $val = unpack("V",$db->{regions}->read($addr,$size_int));
my $val = unpack("V",$db->{regions}->read($addr,$db->{sizes}{word}));
$object->{d}{$offset} = $val;
$addr += $db->{sizes}{word};
$offset += $db->{sizes}{word};
}
$addr += $size_int;
$offset += $size_int;
}
}
@ -396,6 +398,12 @@ sub main() {
}
my $db = {};
# Default config values
$db->{sizes}{align} = 4;
$db->{sizes}{word} = 4;
$db->{sizes}{ptr} = 4;
$db->{symbols} = Symbols->new();
$db->{regions} = MemRegions->new();

Loading…
Cancel
Save