Fix PowerPC 603 translation so it doesn't get stuck in an infinite
loop after the first fixup.
This commit is contained in:
parent
39957739fd
commit
aeca44b1ca
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user