mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
Fix access violations reporting on RSX
and on other threads that do not have cpu_thread handler
This commit is contained in:
parent
b61492ca30
commit
25aa5f80a6
1 changed files with 15 additions and 9 deletions
|
@ -1273,7 +1273,8 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context)
|
||||||
|
|
||||||
if (cpu)
|
if (cpu)
|
||||||
{
|
{
|
||||||
if (fxm::check<page_fault_notification_entries>())
|
// TODO: Only PPU thread page fault notifications are supported
|
||||||
|
if (cpu->id_type() == 1 && fxm::check<page_fault_notification_entries>())
|
||||||
{
|
{
|
||||||
for (const auto& entry : fxm::get<page_fault_notification_entries>()->entries)
|
for (const auto& entry : fxm::get<page_fault_notification_entries>()->entries)
|
||||||
{
|
{
|
||||||
|
@ -1297,7 +1298,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context)
|
||||||
// Now, we notify the game that a page fault occurred so it can rectify it.
|
// Now, we notify the game that a page fault occurred so it can rectify it.
|
||||||
// Note, for data3, were the memory readable AND we got a page fault, it must be due to a write violation since reads are allowed.
|
// Note, for data3, were the memory readable AND we got a page fault, it must be due to a write violation since reads are allowed.
|
||||||
u64 data1 = addr;
|
u64 data1 = addr;
|
||||||
u64 data2 = ((u64)SYS_MEMORY_PAGE_FAULT_TYPE_PPU_THREAD << 32) + cpu->id; // TODO: fix hack for now that assumes PPU thread always.
|
u64 data2 = ((u64)SYS_MEMORY_PAGE_FAULT_TYPE_PPU_THREAD << 32) + cpu->id;
|
||||||
u64 data3 = vm::check_addr(addr, a_size, vm::page_readable) ? SYS_MEMORY_PAGE_FAULT_CAUSE_READ_ONLY : SYS_MEMORY_PAGE_FAULT_CAUSE_NON_MAPPED;
|
u64 data3 = vm::check_addr(addr, a_size, vm::page_readable) ? SYS_MEMORY_PAGE_FAULT_CAUSE_READ_ONLY : SYS_MEMORY_PAGE_FAULT_CAUSE_NON_MAPPED;
|
||||||
|
|
||||||
LOG_ERROR(MEMORY, "Page_fault %s location 0x%x because of %s memory", is_writing ? "writing" : "reading",
|
LOG_ERROR(MEMORY, "Page_fault %s location 0x%x because of %s memory", is_writing ? "writing" : "reading",
|
||||||
|
@ -1326,15 +1327,20 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context)
|
||||||
}
|
}
|
||||||
|
|
||||||
vm::temporary_unlock(*cpu);
|
vm::temporary_unlock(*cpu);
|
||||||
LOG_FATAL(MEMORY, "Access violation %s location 0x%x", is_writing ? "writing" : "reading", addr);
|
}
|
||||||
cpu->state += cpu_flag::dbg_pause;
|
|
||||||
cpu->check_state();
|
|
||||||
|
|
||||||
if (cpu->test_stopped())
|
LOG_FATAL(MEMORY, "Access violation %s location 0x%x", is_writing ? "writing" : "reading", addr);
|
||||||
|
Emu.Pause();
|
||||||
|
|
||||||
|
while (Emu.IsPaused())
|
||||||
|
{
|
||||||
|
thread_ctrl::wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Emu.IsStopped())
|
||||||
{
|
{
|
||||||
std::terminate();
|
std::terminate();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue