MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / HandlePageFault

Method HandlePageFault

pcsx2/vtlb.cpp:1498–1535  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1496}
1497
1498PageFaultHandler::HandlerResult PageFaultHandler::HandlePageFault(void* exception_pc, void* fault_address, bool is_write)
1499{
1500 pxAssert(eeMem);
1501
1502 u32 vaddr;
1503 if (CHECK_FASTMEM && vtlb_GetGuestAddress(reinterpret_cast<uptr>(fault_address), &vaddr))
1504 {
1505 // this was inside the fastmem area. check if it's a code page
1506 // fprintf(stderr, "Fault on fastmem %p vaddr %08X\n", info.addr, vaddr);
1507
1508 uptr ptr = (uptr)PSM(vaddr);
1509 uptr offset = (ptr - (uptr)eeMem->Main);
1510 if (ptr && m_PageProtectInfo[offset >> __pageshift].Mode == ProtMode_Write)
1511 {
1512 // fprintf(stderr, "Not backpatching code write at %08X\n", vaddr);
1513 mmap_ClearCpuBlock(offset);
1514 return HandlerResult::ContinueExecution;
1515 }
1516 else
1517 {
1518 // fprintf(stderr, "Trying backpatching vaddr %08X\n", vaddr);
1519 return vtlb_BackpatchLoadStore(reinterpret_cast<uptr>(exception_pc),
1520 reinterpret_cast<uptr>(fault_address)) ?
1521 HandlerResult::ContinueExecution :
1522 HandlerResult::ExecuteNextHandler;
1523 }
1524 }
1525 else
1526 {
1527 // get bad virtual address
1528 uptr offset = reinterpret_cast<uptr>(fault_address) - reinterpret_cast<uptr>(eeMem->Main);
1529 if (offset >= Ps2MemSize::ExposedRam)
1530 return HandlerResult::ExecuteNextHandler;
1531
1532 mmap_ClearCpuBlock(offset);
1533 return HandlerResult::ContinueExecution;
1534 }
1535}
1536
1537// Clears all block tracking statuses, manual protection flags, and write protection.
1538// This does not clear any recompiler blocks. It is assumed (and necessary) for the caller

Callers

nothing calls this directly

Calls 3

vtlb_GetGuestAddressFunction · 0.85
mmap_ClearCpuBlockFunction · 0.85
vtlb_BackpatchLoadStoreFunction · 0.85

Tested by

no test coverage detected