| 1496 | } |
| 1497 | |
| 1498 | PageFaultHandler::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 |
nothing calls this directly
no test coverage detected