Skip to content

Commit

Permalink
Properly locate ProDG .bss sections (partial addressing of #62) (#63)
Browse files Browse the repository at this point in the history
* Locate ProDG .bss sections (partial addressing of #62)

* Support both correct and incorrect memset calls
  • Loading branch information
ieee802dot11ac authored Jul 17, 2024
1 parent c484952 commit c3c7c2b
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions src/analysis/cfa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -597,19 +597,27 @@ pub fn locate_bss_memsets(obj: &mut ObjInfo) -> Result<Vec<(u32, u32)>> {
StepResult::Branch(branches) => {
for branch in branches {
if branch.link {
// ProDG bug? Registers are supposed to start at r3
// Some ProDG crt0.s versions use the wrong registers, some don't
if let (
GprValue::Constant(addr),
GprValue::Constant(value),
GprValue::Constant(size),
) = (vm.gpr_value(4), vm.gpr_value(5), vm.gpr_value(6))
{
) = {
if vm.gpr_value(4) == GprValue::Constant(0) {
(vm.gpr_value(3), vm.gpr_value(4), vm.gpr_value(5))
} else {
(vm.gpr_value(4), vm.gpr_value(5), vm.gpr_value(6))
}
} {
if value == 0 && size > 0 {
bss_sections.push((addr, size));
}
}
}
}
if bss_sections.len() >= 2 {
return Ok(ExecCbResult::End(()));
}
Ok(ExecCbResult::Continue)
}
}
Expand Down

0 comments on commit c3c7c2b

Please sign in to comment.