| 1113 | } |
| 1114 | |
| 1115 | bool vtlb_BackpatchLoadStore(uptr code_address, uptr fault_address) |
| 1116 | { |
| 1117 | uptr fastmem_start = (uptr)vtlbdata.fastmem_base; |
| 1118 | uptr fastmem_end = fastmem_start + 0xFFFFFFFFu; |
| 1119 | if (fault_address < fastmem_start || fault_address > fastmem_end) |
| 1120 | return false; |
| 1121 | |
| 1122 | auto iter = s_fastmem_backpatch_info.find(code_address); |
| 1123 | if (iter == s_fastmem_backpatch_info.end()) |
| 1124 | return false; |
| 1125 | |
| 1126 | const LoadstoreBackpatchInfo& info = iter->second; |
| 1127 | const u32 guest_addr = static_cast<u32>(fault_address - fastmem_start); |
| 1128 | vtlb_DynBackpatchLoadStore(code_address, info.code_size, info.guest_pc, guest_addr, |
| 1129 | info.gpr_bitmask, info.fpr_bitmask, info.address_register, info.data_register, |
| 1130 | info.size_in_bits, info.is_signed, info.is_load, info.is_fpr); |
| 1131 | |
| 1132 | // queue block for recompilation later |
| 1133 | Cpu->Clear(info.guest_pc, 1); |
| 1134 | |
| 1135 | // and store the pc in the faulting list, so that we don't emit another fastmem loadstore |
| 1136 | s_fastmem_faulting_pcs.insert(info.guest_pc); |
| 1137 | s_fastmem_backpatch_info.erase(iter); |
| 1138 | return true; |
| 1139 | } |
| 1140 | |
| 1141 | bool vtlb_IsFaultingPC(u32 guest_pc) |
| 1142 | { |
no test coverage detected