diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index a971bede8f..4a2108466c 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -383,17 +383,45 @@ std::string ppu_thread::dump_regs() const if (reg <= UINT32_MAX && vm::check_addr(static_cast(reg), max_str_len)) { + bool is_function = false; + u32 toc = 0; + if (const u32 reg_ptr = *vm::get_super_ptr(static_cast(reg)); 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(static_cast(reg + 4)); + + if (toc % 4 == 0 && vm::check_addr(toc)) + { + is_function = true; + } + } + 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(reg); std::string buf_tmp(gpr_buf, gpr_buf + max_str_len); - if (std::isprint(static_cast(buf_tmp[0])) && std::isprint(static_cast(buf_tmp[1])) && std::isprint(static_cast(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(buf_tmp[0])) && std::isprint(static_cast(buf_tmp[1])) && std::isprint(static_cast(buf_tmp[2]))) { fmt::append(ret, " -> \"%s\"", buf_tmp.c_str()); }