From 1d7d5e708189cdc08be2ce10f5bb92793635a39b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 17 Jan 2011 20:20:12 +0000 Subject: [PATCH] Removed PPC_MMU_ENABLED flag (no whatsnew) --- src/emu/cpu/powerpc/ppc_mem.c | 249 ++++++++++++++++------------------ 1 file changed, 116 insertions(+), 133 deletions(-) diff --git a/src/emu/cpu/powerpc/ppc_mem.c b/src/emu/cpu/powerpc/ppc_mem.c index e5fa0b9c166..9f8f5437826 100644 --- a/src/emu/cpu/powerpc/ppc_mem.c +++ b/src/emu/cpu/powerpc/ppc_mem.c @@ -119,15 +119,6 @@ enum PPC_TRANSLATE_NOEXCEPTION = 0x0004 }; -#ifdef MESS -#define PPC_MMU_ENABLED 1 -#else /* !MESS */ -/* MMU not enabled in MAME; model3 drivers don't work properly */ -#define PPC_MMU_ENABLED 0 -#endif /* MESS */ - - - static int ppc_is_protected(UINT32 pp, int flags) { if (flags & PPC_TRANSLATE_WRITE) @@ -145,153 +136,145 @@ static int ppc_is_protected(UINT32 pp, int flags) static int ppc_translate_address(offs_t *addr_ptr, int flags) { - if (PPC_MMU_ENABLED) + const BATENT *bat; + UINT32 address; + UINT32 sr, vsid, hash; + UINT32 pteg_address; + UINT32 target_pte, bl, mask; + UINT64 pte; + UINT64 *pteg_ptr[2]; + int i, hash_type; + UINT32 dsisr = DSISR_PROT; + + bat = (flags & PPC_TRANSLATE_CODE) ? ppc.ibat : ppc.dbat; + + address = *addr_ptr; + + /* first check the block address translation table */ + for (i = 0; i < 4; i++) { - const BATENT *bat; - UINT32 address; - UINT32 sr, vsid, hash; - UINT32 pteg_address; - UINT32 target_pte, bl, mask; - UINT64 pte; - UINT64 *pteg_ptr[2]; - int i, hash_type; - UINT32 dsisr = DSISR_PROT; - - bat = (flags & PPC_TRANSLATE_CODE) ? ppc.ibat : ppc.dbat; - - address = *addr_ptr; - - /* first check the block address translation table */ - for (i = 0; i < 4; i++) + if (bat[i].u & ((MSR & MSR_PR) ? 0x00000001 : 0x00000002)) { - if (bat[i].u & ((MSR & MSR_PR) ? 0x00000001 : 0x00000002)) + bl = bat[i].u & 0x00001FFC; + mask = (~bl << 15) & 0xFFFE0000; + + if ((address & mask) == (bat[i].u & 0xFFFE0000)) + { + if (ppc_is_protected(bat[i].l, flags)) + goto exception; + + *addr_ptr = (bat[i].l & 0xFFFE0000) + | (address & ((bl << 15) | 0x0001FFFF)); + return 1; + } + } + } + + /* now try page address translation */ + sr = ppc.sr[(address >> 28) & 0x0F]; + if (sr & 0x80000000) + { + /* direct store translation */ + if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0) + fatalerror("ppc: direct store translation not yet implemented"); + return 0; + } + else + { + /* is no execute is set? */ + if ((flags & PPC_TRANSLATE_CODE) && (sr & 0x10000000)) + goto exception; + + vsid = sr & 0x00FFFFFF; + hash = (vsid & 0x0007FFFF) ^ ((address >> 12) & 0xFFFF); + target_pte = (vsid << 7) | ((address >> 22) & 0x3F) | 0x80000000; + + /* we have to try both types of hashes */ + for (hash_type = 0; hash_type <= 1; hash_type++) + { + pteg_address = (ppc.sdr1 & 0xFFFF0000) + | (((ppc.sdr1 & 0x01FF) & (hash >> 10)) << 16) + | ((hash & 0x03FF) << 6); + + pteg_ptr[hash_type] = ppc->program->get_read_ptr(pteg_address); + if (pteg_ptr[hash_type]) + { + for (i = 0; i < 8; i++) + { + pte = pteg_ptr[hash_type][i]; + + /* is valid? */ + if (((pte >> 32) & 0xFFFFFFFF) == target_pte) + { + if (ppc_is_protected((UINT32) pte, flags)) + goto exception; + + *addr_ptr = ((UINT32) (pte & 0xFFFFF000)) + | (address & 0x0FFF); + return 1; + } + } + } + + hash ^= 0x7FFFF; + target_pte ^= 0x40; + } + + if (DUMP_PAGEFAULTS) + { + mame_printf_debug("PAGE FAULT: address=%08X PC=%08X SDR1=%08X MSR=%08X\n", address, ppc.pc, ppc.sdr1, ppc.msr); + mame_printf_debug("\n"); + + for (i = 0; i < 4; i++) { bl = bat[i].u & 0x00001FFC; mask = (~bl << 15) & 0xFFFE0000; - - if ((address & mask) == (bat[i].u & 0xFFFE0000)) - { - if (ppc_is_protected(bat[i].l, flags)) - goto exception; - - *addr_ptr = (bat[i].l & 0xFFFE0000) - | (address & ((bl << 15) | 0x0001FFFF)); - return 1; - } + mame_printf_debug(" BAT[%d]=%08X%08X (A & %08X = %08X)\n", i, bat[i].u, bat[i].l, + mask, bat[i].u & 0xFFFE0000); } - } + mame_printf_debug("\n"); + mame_printf_debug(" VSID=%06X HASH=%05X HASH\'=%05X\n", vsid, hash, hash ^ 0x7FFFF); - /* now try page address translation */ - sr = ppc.sr[(address >> 28) & 0x0F]; - if (sr & 0x80000000) - { - /* direct store translation */ - if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0) - fatalerror("ppc: direct store translation not yet implemented"); - return 0; - } - else - { - /* is no execute is set? */ - if ((flags & PPC_TRANSLATE_CODE) && (sr & 0x10000000)) - goto exception; - - vsid = sr & 0x00FFFFFF; - hash = (vsid & 0x0007FFFF) ^ ((address >> 12) & 0xFFFF); - target_pte = (vsid << 7) | ((address >> 22) & 0x3F) | 0x80000000; - - /* we have to try both types of hashes */ for (hash_type = 0; hash_type <= 1; hash_type++) { - pteg_address = (ppc.sdr1 & 0xFFFF0000) - | (((ppc.sdr1 & 0x01FF) & (hash >> 10)) << 16) - | ((hash & 0x03FF) << 6); - - pteg_ptr[hash_type] = ppc->program->get_read_ptr(pteg_address); if (pteg_ptr[hash_type]) { for (i = 0; i < 8; i++) { pte = pteg_ptr[hash_type][i]; - - /* is valid? */ - if (((pte >> 32) & 0xFFFFFFFF) == target_pte) - { - if (ppc_is_protected((UINT32) pte, flags)) - goto exception; - - *addr_ptr = ((UINT32) (pte & 0xFFFFF000)) - | (address & 0x0FFF); - return 1; - } - } - } - - hash ^= 0x7FFFF; - target_pte ^= 0x40; - } - - if (DUMP_PAGEFAULTS) - { - mame_printf_debug("PAGE FAULT: address=%08X PC=%08X SDR1=%08X MSR=%08X\n", address, ppc.pc, ppc.sdr1, ppc.msr); - mame_printf_debug("\n"); - - for (i = 0; i < 4; i++) - { - bl = bat[i].u & 0x00001FFC; - mask = (~bl << 15) & 0xFFFE0000; - mame_printf_debug(" BAT[%d]=%08X%08X (A & %08X = %08X)\n", i, bat[i].u, bat[i].l, - mask, bat[i].u & 0xFFFE0000); - } - mame_printf_debug("\n"); - mame_printf_debug(" VSID=%06X HASH=%05X HASH\'=%05X\n", vsid, hash, hash ^ 0x7FFFF); - - for (hash_type = 0; hash_type <= 1; hash_type++) - { - if (pteg_ptr[hash_type]) - { - for (i = 0; i < 8; i++) - { - pte = pteg_ptr[hash_type][i]; - mame_printf_debug(" PTE[%i%c]=%08X%08X\n", - i, - hash_type ? '\'' : ' ', - (unsigned) (pte >> 32), - (unsigned) (pte >> 0)); - } + mame_printf_debug(" PTE[%i%c]=%08X%08X\n", + i, + hash_type ? '\'' : ' ', + (unsigned) (pte >> 32), + (unsigned) (pte >> 0)); } } } } + } - dsisr = DSISR_PAGE; + dsisr = DSISR_PAGE; exception: - /* lookup failure - exception */ - if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0) - { - if (flags & PPC_TRANSLATE_CODE) - { - ppc_exception(EXCEPTION_ISI); - } - else - { - ppc.dar = address; - if (flags & PPC_TRANSLATE_WRITE) - ppc.dsisr = dsisr | DSISR_STORE; - else - ppc.dsisr = dsisr; - - ppc_exception(EXCEPTION_DSI); - } - } - return 0; - } - else + /* lookup failure - exception */ + if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0) { - /* MMU not enabled in MAME; model3 drivers don't work properly */ - return 1; + if (flags & PPC_TRANSLATE_CODE) + { + ppc_exception(EXCEPTION_ISI); + } + else + { + ppc.dar = address; + if (flags & PPC_TRANSLATE_WRITE) + ppc.dsisr = dsisr | DSISR_STORE; + else + ppc.dsisr = dsisr; + + ppc_exception(EXCEPTION_DSI); + } } + return 0; } static int ppc_translate_address_cb(int space, offs_t *addr)