PPU debugger: Fix functions stack bounds check

This commit is contained in:
Eladash 2020-07-03 06:18:14 +03:00 committed by Megamouse
parent 05dc6ad610
commit c98ec4d014
2 changed files with 16 additions and 4 deletions

View File

@ -511,12 +511,19 @@ std::vector<u32> ppu_thread::dump_callstack_list() const
for ( for (
u64 sp = *vm::get_super_ptr<u64>(stack_ptr); u64 sp = *vm::get_super_ptr<u64>(stack_ptr);
sp >= stack_min && std::max(sp, sp + 0x200) < stack_max; sp % 0x10 == 0u && sp >= stack_min && sp <= stack_max - ppu_stack_start_offset;
sp = *vm::get_super_ptr<u64>(static_cast<u32>(sp)) sp = *vm::get_super_ptr<u64>(static_cast<u32>(sp))
) )
{ {
const u64 addr = *vm::get_super_ptr<u64>(static_cast<u32>(sp + 16));
if (addr > UINT32_MAX || addr % 4 || !vm::check_addr(static_cast<u32>(addr), 1, vm::page_executable))
{
break;
}
// TODO: function addresses too // TODO: function addresses too
call_stack_list.push_back(*vm::get_super_ptr<u64>(static_cast<u32>(sp + 16))); call_stack_list.push_back(static_cast<u32>(addr));
} }
return call_stack_list; return call_stack_list;
@ -659,7 +666,7 @@ void ppu_thread::cpu_task()
} }
case ppu_cmd::reset_stack: case ppu_cmd::reset_stack:
{ {
cmd_pop(), gpr[1] = stack_addr + stack_size - 0x70; cmd_pop(), gpr[1] = stack_addr + stack_size - ppu_stack_start_offset;
break; break;
} }
default: default:
@ -791,7 +798,7 @@ ppu_thread::ppu_thread(const ppu_thread_params& param, std::string_view name, u3
, start_time(get_guest_system_time()) , start_time(get_guest_system_time())
, ppu_tname(stx::shared_cptr<std::string>::make(name)) , ppu_tname(stx::shared_cptr<std::string>::make(name))
{ {
gpr[1] = stack_addr + stack_size - 0x70; gpr[1] = stack_addr + stack_size - ppu_stack_start_offset;
gpr[13] = param.tls_addr; gpr[13] = param.tls_addr;

View File

@ -36,6 +36,11 @@ enum class ppu_syscall_code : u64
{ {
}; };
enum : u32
{
ppu_stack_start_offset = 0x70,
};
// ppu function descriptor // ppu function descriptor
struct ppu_func_opd_t struct ppu_func_opd_t
{ {