| 457 | } |
| 458 | |
| 459 | void GoemonPreloadTlb() |
| 460 | { |
| 461 | // 0x3d5580 is the address of the TLB cache table |
| 462 | GoemonTlb* tlb = (GoemonTlb*)&eeMem->Main[0x3d5580]; |
| 463 | |
| 464 | for (u32 i = 0; i < 150; i++) |
| 465 | { |
| 466 | if (tlb[i].valid == 0x1 && tlb[i].low_add != tlb[i].high_add) |
| 467 | { |
| 468 | |
| 469 | u32 size = tlb[i].high_add - tlb[i].low_add; |
| 470 | u32 vaddr = tlb[i].low_add; |
| 471 | u32 paddr = tlb[i].physical_add; |
| 472 | |
| 473 | // TODO: The old code (commented below) seems to check specifically for handler 0. Is this really correct? |
| 474 | //if ((uptr)vtlbdata.vmap[vaddr>>VTLB_PAGE_BITS] == POINTER_SIGN_BIT) { |
| 475 | auto vmv = vtlbdata.vmap[vaddr >> VTLB_PAGE_BITS]; |
| 476 | if (vmv.isHandler(vaddr) && vmv.assumeHandlerGetID() == 0) |
| 477 | { |
| 478 | DevCon.WriteLn("GoemonPreloadTlb: Entry %d. Key %x. From V:0x%8.8x to P:0x%8.8x (%d pages)", i, tlb[i].key, vaddr, paddr, size >> VTLB_PAGE_BITS); |
| 479 | vtlb_VMap(vaddr, paddr, size); |
| 480 | vtlb_VMap(0x20000000 | vaddr, paddr, size); |
| 481 | } |
| 482 | } |
| 483 | } |
| 484 | } |
| 485 | |
| 486 | void GoemonUnloadTlb(u32 key) |
| 487 | { |
no test coverage detected