Fix PowerPC 603 translation so it doesn't get stuck in an infinite

loop after the first fixup.
This commit is contained in:
Aaron Giles 2009-11-17 15:43:06 +00:00
parent 39957739fd
commit aeca44b1ca
2 changed files with 7 additions and 1 deletions

View File

@ -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);
}

View File

@ -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