| 231 | } |
| 232 | |
| 233 | CodePage* KMemoryData::getOrCreateCodePage(U32 address) { |
| 234 | U32 pageIndex = address >> K_PAGE_SHIFT; |
| 235 | PageType type = mmu[pageIndex].getPageType(); |
| 236 | |
| 237 | CodePage* codePage = nullptr; |
| 238 | if (type == PageType::Code) { |
| 239 | codePage = (CodePage*)mmu[pageIndex].getPage(); |
| 240 | } else if (type == PageType::File) { |
| 241 | mmu[pageIndex].getPage()->onDemmand(&mmu[pageIndex], pageIndex); |
| 242 | return getOrCreateCodePage(address); |
| 243 | } else if (type == PageType::Ram || type == PageType::CopyOnWrite) { |
| 244 | mmu[pageIndex].setPageType(memory, pageIndex, PageType::Code); |
| 245 | onPageChanged(pageIndex); |
| 246 | } else { |
| 247 | kpanic_fmt("Unhandled code caching page type: %d", static_cast<int>(mmu[pageIndex].getPageType())); |
| 248 | codePage = nullptr; |
| 249 | } |
| 250 | return codePage; |
| 251 | } |
| 252 | #ifdef BOXEDWINE_HOST_EXCEPTIONS |
| 253 | bool KMemoryData::findOpFromJitAddress(U8* jitAddress, U32& eipOfOp) { |
| 254 | auto it = jitAddressToEip.lower_bound(jitAddress); |
no test coverage detected