PPU debugger: report functions on registers display

This commit is contained in:
Eladash 2020-04-17 09:15:30 +03:00 committed by Ani
parent 368bd7cf02
commit 0bf73ba0bc

View file

@ -383,17 +383,45 @@ std::string ppu_thread::dump_regs() const
if (reg <= UINT32_MAX && vm::check_addr(static_cast<u32>(reg), max_str_len)) if (reg <= UINT32_MAX && vm::check_addr(static_cast<u32>(reg), max_str_len))
{ {
bool is_function = false;
u32 toc = 0;
if (const u32 reg_ptr = *vm::get_super_ptr<u32>(static_cast<u32>(reg)); if (const u32 reg_ptr = *vm::get_super_ptr<u32>(static_cast<u32>(reg));
vm::check_addr(reg_ptr, max_str_len)) vm::check_addr(reg_ptr, max_str_len))
{ {
if ((reg | reg_ptr) % 4 == 0 && vm::check_addr(reg_ptr, 4, vm::page_executable))
{
toc = *vm::get_super_ptr<u32>(static_cast<u32>(reg + 4));
if (toc % 4 == 0 && vm::check_addr(toc))
{
is_function = true;
}
}
reg = reg_ptr; reg = reg_ptr;
} }
else if (reg % 4 == 0 && vm::check_addr(reg, 4, vm::page_executable))
{
is_function = true;
}
const auto gpr_buf = vm::get_super_ptr<u8>(reg); const auto gpr_buf = vm::get_super_ptr<u8>(reg);
std::string buf_tmp(gpr_buf, gpr_buf + max_str_len); std::string buf_tmp(gpr_buf, gpr_buf + max_str_len);
if (std::isprint(static_cast<u8>(buf_tmp[0])) && std::isprint(static_cast<u8>(buf_tmp[1])) && std::isprint(static_cast<u8>(buf_tmp[2]))) if (is_function)
{
if (toc)
{
fmt::append(ret, " -> func(at=0x%x, toc=0x%x)", reg, toc);
}
else
{
fmt::append(ret, " -> function-code");
}
}
else if (std::isprint(static_cast<u8>(buf_tmp[0])) && std::isprint(static_cast<u8>(buf_tmp[1])) && std::isprint(static_cast<u8>(buf_tmp[2])))
{ {
fmt::append(ret, " -> \"%s\"", buf_tmp.c_str()); fmt::append(ret, " -> \"%s\"", buf_tmp.c_str());
} }