From aeca44b1ca0f397a558ee7f8b3432df0b663d7bb Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Tue, 17 Nov 2009 15:43:06 +0000 Subject: [PATCH] Fix PowerPC 603 translation so it doesn't get stuck in an infinite loop after the first fixup. --- src/emu/cpu/powerpc/ppccom.c | 6 ++++++ src/emu/cpu/powerpc/ppcdrc.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/emu/cpu/powerpc/ppccom.c b/src/emu/cpu/powerpc/ppccom.c index 9fb9c5cf4c3..924df6e493f 100644 --- a/src/emu/cpu/powerpc/ppccom.c +++ b/src/emu/cpu/powerpc/ppccom.c @@ -522,9 +522,15 @@ static UINT32 ppccom_translate_address_internal(powerpc_state *ppc, int intentio /* if we're simulating the 603 MMU, fill in the data and stop here */ if (ppc->cap & PPCCAP_603_MMU) { + UINT32 entry = vtlb_table(ppc->vtlb)[*address >> 12]; ppc->mmu603_cmp = 0x80000000 | ((segreg & 0xffffff) << 7) | (0 << 6) | ((*address >> 22) & 0x3f); ppc->mmu603_hash[0] = hashbase | ((hash << 6) & hashmask); ppc->mmu603_hash[1] = hashbase | ((~hash << 6) & hashmask); + if ((entry & (VTLB_FLAG_FIXED | VTLB_FLAG_VALID)) == (VTLB_FLAG_FIXED | VTLB_FLAG_VALID)) + { + *address = (entry & 0xfffff000) | (*address & 0x00000fff); + return 0x001; + } return DSISR_NOT_FOUND | ((transtype == TRANSLATE_WRITE) ? DSISR_STORE : 0); } diff --git a/src/emu/cpu/powerpc/ppcdrc.c b/src/emu/cpu/powerpc/ppcdrc.c index f2ed69b54e5..e0c4afd3ef8 100644 --- a/src/emu/cpu/powerpc/ppcdrc.c +++ b/src/emu/cpu/powerpc/ppcdrc.c @@ -1257,7 +1257,7 @@ static void static_generate_tlb_mismatch(powerpc_state *ppc) UML_MOV(block, MEM(&ppc->param0), IREG(0)); // mov [param0],i0 UML_MOV(block, MEM(&ppc->param1), IMM(TRANSLATE_FETCH)); // mov [param1],TRANSLATE_FETCH UML_CALLC(block, ppccom_tlb_fill, ppc); // callc tlbfill,ppc - UML_SHR(block, IREG(1), IREG(0), IMM(12)); // shr i1,i0,11 + UML_SHR(block, IREG(1), IREG(0), IMM(12)); // shr i1,i0,12 UML_LOAD(block, IREG(1), (void *)vtlb_table(ppc->vtlb), IREG(1), DWORD); // load i1,[vtlb],i1,dword UML_TEST(block, IREG(1), IMM(VTLB_FETCH_ALLOWED)); // test i1,VTLB_FETCH_ALLOWED UML_JMPc(block, IF_Z, isi = label++); // jmp isi,z