mirror of https://github.com/RPCS3/rpcs3.git
PPU DisAssembler: Prevent false function descriptor detection
This commit is contained in:
parent
a768855a7a
commit
b334621d76
|
@ -866,21 +866,27 @@ std::string ppu_thread::dump_regs() const
|
||||||
bool is_function = false;
|
bool is_function = false;
|
||||||
u32 toc = 0;
|
u32 toc = 0;
|
||||||
|
|
||||||
if (const u32 reg_ptr = *vm::get_super_ptr<u32>(static_cast<u32>(reg));
|
auto is_exec_code = [&](u32 addr)
|
||||||
vm::check_addr<max_str_len>(reg_ptr))
|
|
||||||
{
|
{
|
||||||
if ((reg | reg_ptr) % 4 == 0 && vm::check_addr(reg_ptr, vm::page_executable))
|
return addr % 4 == 0 && vm::check_addr(addr, vm::page_executable) && g_ppu_itype.decode(*vm::get_super_ptr<u32>(addr)) != ppu_itype::UNK;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (const u32 reg_ptr = *vm::get_super_ptr<u32>(static_cast<u32>(reg));
|
||||||
|
vm::check_addr<8>(reg_ptr) && !vm::check_addr(toc, vm::page_executable))
|
||||||
|
{
|
||||||
|
// Check executability and alignment
|
||||||
|
if (reg % 4 == 0 && is_exec_code(reg_ptr))
|
||||||
{
|
{
|
||||||
toc = *vm::get_super_ptr<u32>(static_cast<u32>(reg + 4));
|
toc = *vm::get_super_ptr<u32>(static_cast<u32>(reg + 4));
|
||||||
|
|
||||||
if (toc % 4 == 0 && vm::check_addr(toc))
|
if (toc % 4 == 0 && vm::check_addr(toc) && !vm::check_addr(toc, vm::page_executable))
|
||||||
{
|
{
|
||||||
is_function = true;
|
is_function = true;
|
||||||
reg = reg_ptr;
|
reg = reg_ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (reg % 4 == 0 && vm::check_addr(reg, vm::page_executable))
|
else if (is_exec_code(reg))
|
||||||
{
|
{
|
||||||
is_function = true;
|
is_function = true;
|
||||||
}
|
}
|
||||||
|
@ -964,7 +970,7 @@ std::string ppu_thread::dump_regs() const
|
||||||
else
|
else
|
||||||
fmt::append(ret, "Reservation Addr: none");
|
fmt::append(ret, "Reservation Addr: none");
|
||||||
|
|
||||||
fmt::append(ret, "Reservation Data (entire cache line):\n");
|
fmt::append(ret, "\nReservation Data (entire cache line):\n");
|
||||||
|
|
||||||
be_t<u32> data[32]{};
|
be_t<u32> data[32]{};
|
||||||
std::memcpy(data, rdata, sizeof(rdata)); // Show the data even if the reservation was lost inside the atomic loop
|
std::memcpy(data, rdata, sizeof(rdata)); // Show the data even if the reservation was lost inside the atomic loop
|
||||||
|
|
Loading…
Reference in New Issue