Assume that all loaded regions are data and simply itterate though them - avoiding needing to define a 'datazone'

asm
Hamish Coleman 8 years ago
parent 6a55cddbbf
commit 7b1297ec22

@ -1,7 +1,5 @@
load_memory 0 196608 x230.G2HT35WW.img 0 0
datazone 0x20edc 0x23c60
load_memory 0x20edc 11652 x230.G2HT35WW.img 0x20edc 0
# List of known keyboard symbols
f delayTab1 x 0x214f0

@ -153,6 +153,26 @@ sub read {
return $buf;
}
sub all_baseaddr {
my $self = shift;
my @starts;
for my $r (@{$self->{region}}) {
push @starts, $r->{phys_addr};
}
return @starts;
}
sub region_size {
my $self = shift;
my $phys_addr = shift;
my $region = $self->_addr2region($phys_addr,4);
if (!defined($region)) {
return undef;
}
return $region->{size};
}
1;
package main;
@ -189,10 +209,6 @@ sub load_configfile {
$db->{regions}->add(
eval "$a[1]", eval "$a[2]", $a[3], eval "$a[4]", $a[5]
);
} elsif (m/^datazone\s+/) {
my @a = split(/\s+/,$_);
$db->{zone}{start} = eval "$a[1]";
$db->{zone}{end} = eval "$a[2]";
} elsif (m/^f\W+/) {
my @a = split(/\W+/,$_);
# 0 1 2 3
@ -221,16 +237,20 @@ sub validate_pointer {
sub find_pointers {
my $db = shift;
my $i = $db->{zone}{start};
while ($i < $db->{zone}{end}) {
my $buf = $db->{regions}->read($i,4);
my $val = unpack("V",$buf);
if (validate_pointer($db,$val)) {
$db->{symbols}->add($val,sprintf("ptr_%08x",$val));
for my $start ($db->{regions}->all_baseaddr()) {
my $end = $start + $db->{regions}->region_size($start);
$db->{p}{src}{$i} = $val;
my $i = $start;
while ($i < $end) {
my $buf = $db->{regions}->read($i,4);
my $val = unpack("V",$buf);
if (validate_pointer($db,$val)) {
$db->{symbols}->add($val,sprintf("ptr_%08x",$val));
$db->{p}{src}{$i} = $val;
}
$i+=4;
}
$i+=4;
}
}

Loading…
Cancel
Save