--- hatari/src/cpu/cpummu.c 2019/04/09 08:49:24 1.1.1.1 +++ hatari/src/cpu/cpummu.c 2019/04/09 08:50:18 1.1.1.2 @@ -316,7 +316,9 @@ static void mmu_bus_error(uaecptr addr, fprintf(stderr, "BUS ERROR: fc=%d w=%d log=%08x ssw=%04x PC=%08x\n", fc, write, addr, ssw, m68k_getpc()); //write_log(L"BUS ERROR: fc=%d w=%d log=%08x ssw=%04x PC=%08x\n", fc, write, addr, ssw, m68k_getpc()); + //activate_debugger(); +// THROW(2); /* Removed by Laurent */ except=2; } @@ -361,13 +363,14 @@ static uaecptr mmu_fill_atc_l2(uaecptr a } SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - desc = mmu_lookup_pagetable(addr, super, write); +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* Added by Laurent, but probably wrong way to do it */ + desc = mmu_lookup_pagetable(addr, super, write); #if DEBUG > 2 fprintf(stderr, "translate: %x,%u,%u,%u -> %x\n", addr, super, write, data, desc); #endif - RESTORE_EXCEPTION; + RESTORE_EXCEPTION; +// } /* removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; /* bus error during table search */ @@ -447,7 +450,8 @@ uaecptr REGPARAM2 mmu_translate(uaecptr l = &atc_l2[super ? 1 : 0][ATC_L2_INDEX(addr)]; mmu_fill_atc_l2(addr, super, data, write, l); if (!(data ? l->valid_data : l->valid_inst)) - except=2; +// THROW(2); /* Removed by Laurent */ + except=2; /* Added by Laurent, probably wrong way to do it */ return addr + l->phys; } @@ -537,17 +541,17 @@ uae_u16 REGPARAM2 mmu_get_word_unaligned res = (uae_u16)mmu_get_byte(addr, data, sz_word) << 8; SAVE_EXCEPTION; - -// TRY(prb) { - except = 0; - res |= mmu_get_byte(addr + 1, data, sz_word); - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* Added by Laurent, probably wrong way */ + res |= mmu_get_byte(addr + 1, data, sz_word); + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* Added by Laurent, probably wrong way */ } return res; } @@ -559,31 +563,34 @@ uae_u32 REGPARAM2 mmu_get_long_unaligned if (likely(!(addr & 1))) { res = (uae_u32)mmu_get_word(addr, data, sz_long) << 16; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - res |= mmu_get_word(addr + 2, data, sz_long); - RESTORE_EXCEPTION; +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* Added by Laurent, probably wrong way */ + res |= mmu_get_word(addr + 2, data, sz_long); + RESTORE_EXCEPTION; +// } /* Removed by Laurent CATCH(prb) { RESTORE_EXCEPTION; regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* Added by Laurent, ... */ } } else { res = (uae_u32)mmu_get_byte(addr, data, sz_long) << 8; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - res = (res | mmu_get_byte(addr + 1, data, sz_long)) << 8; - res = (res | mmu_get_byte(addr + 2, data, sz_long)) << 8; - res |= mmu_get_byte(addr + 3, data, sz_long); - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* Added by Laurent, probably wrong way */ + res = (res | mmu_get_byte(addr + 1, data, sz_long)) << 8; + res = (res | mmu_get_byte(addr + 2, data, sz_long)) << 8; + res |= mmu_get_byte(addr + 3, data, sz_long); + RESTORE_EXCEPTION; +// } /* Removed by Laurent CATCH(prb) { RESTORE_EXCEPTION; regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* Added by Laurent, ... */ } } return res; @@ -649,19 +656,19 @@ uae_u32 REGPARAM2 mmu_get_long_slow(uaec void REGPARAM2 mmu_put_long_unaligned(uaecptr addr, uae_u32 val, bool data) { SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - if (likely(!(addr & 1))) { - mmu_put_word(addr, val >> 16, data, sz_long); - mmu_put_word(addr + 2, val, data, sz_long); - } else { - mmu_put_byte(addr, val >> 24, data, sz_long); - mmu_put_byte(addr + 1, val >> 16, data, sz_long); - mmu_put_byte(addr + 2, val >> 8, data, sz_long); - mmu_put_byte(addr + 3, val, data, sz_long); - } - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* added by Laurent */ + if (likely(!(addr & 1))) { + mmu_put_word(addr, val >> 16, data, sz_long); + mmu_put_word(addr + 2, val, data, sz_long); + } else { + mmu_put_byte(addr, val >> 24, data, sz_long); + mmu_put_byte(addr + 1, val >> 16, data, sz_long); + mmu_put_byte(addr + 2, val >> 8, data, sz_long); + mmu_put_byte(addr + 3, val, data, sz_long); + } + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.wb3_data = val; @@ -669,6 +676,7 @@ void REGPARAM2 mmu_put_long_unaligned(ua regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; } +// THROW_AGAIN(prb); /* Removed by Laurent */ except=2; } } @@ -676,12 +684,12 @@ void REGPARAM2 mmu_put_long_unaligned(ua void REGPARAM2 mmu_put_word_unaligned(uaecptr addr, uae_u16 val, bool data) { SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - mmu_put_byte(addr, val >> 8, data, sz_word); - mmu_put_byte(addr + 1, val, data, sz_word); - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* added by Laurent */ + mmu_put_byte(addr, val >> 8, data, sz_word); + mmu_put_byte(addr + 1, val, data, sz_word); + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.wb3_data = val; @@ -689,7 +697,8 @@ void REGPARAM2 mmu_put_word_unaligned(ua regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; } - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* Added by Laurent */ } } @@ -771,32 +780,34 @@ uae_u32 REGPARAM2 sfc_get_long(uaecptr a if (likely(!(addr & 1))) { res = (uae_u32)mmu_get_user_word(addr, super, data, sz_long) << 16; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - res |= mmu_get_user_word(addr + 2, super, data, sz_long); - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* aded by Laurent */ + res |= mmu_get_user_word(addr + 2, super, data, sz_long); + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* added by Laurent */ } } else { res = (uae_u32)mmu_get_user_byte(addr, super, data, sz_long) << 8; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - res = (res | mmu_get_user_byte(addr + 1, super, data, sz_long)) << 8; - res = (res | mmu_get_user_byte(addr + 2, super, data, sz_long)) << 8; - res |= mmu_get_user_byte(addr + 3, super, data, sz_long); - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* aded by Laurent */ + res = (res | mmu_get_user_byte(addr + 1, super, data, sz_long)) << 8; + res = (res | mmu_get_user_byte(addr + 2, super, data, sz_long)) << 8; + res |= mmu_get_user_byte(addr + 3, super, data, sz_long); + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* added by Laurent */ } } return res; @@ -813,16 +824,17 @@ uae_u16 REGPARAM2 sfc_get_word(uaecptr a res = (uae_u16)mmu_get_user_byte(addr, super, data, sz_word) << 8; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - res |= mmu_get_user_byte(addr + 1, super, data, sz_word); - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* aded by Laurent */ + res |= mmu_get_user_byte(addr + 1, super, data, sz_word); + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* added by Laurent */ } return res; } @@ -841,21 +853,21 @@ void REGPARAM2 dfc_put_long(uaecptr addr bool data = (regs.dfc & 3) != 2; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - if (likely(!is_unaligned(addr, 4))) - mmu_put_user_long(addr, val, super, data, sz_long); - else if (likely(!(addr & 1))) { - mmu_put_user_word(addr, val >> 16, super, data, sz_long); - mmu_put_user_word(addr + 2, val, super, data, sz_long); - } else { - mmu_put_user_byte(addr, val >> 24, super, data, sz_long); - mmu_put_user_byte(addr + 1, val >> 16, super, data, sz_long); - mmu_put_user_byte(addr + 2, val >> 8, super, data, sz_long); - mmu_put_user_byte(addr + 3, val, super, data, sz_long); - } - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* aded by Laurent */ + if (likely(!is_unaligned(addr, 4))) + mmu_put_user_long(addr, val, super, data, sz_long); + else if (likely(!(addr & 1))) { + mmu_put_user_word(addr, val >> 16, super, data, sz_long); + mmu_put_user_word(addr + 2, val, super, data, sz_long); + } else { + mmu_put_user_byte(addr, val >> 24, super, data, sz_long); + mmu_put_user_byte(addr + 1, val >> 16, super, data, sz_long); + mmu_put_user_byte(addr + 2, val >> 8, super, data, sz_long); + mmu_put_user_byte(addr + 3, val, super, data, sz_long); + } + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.wb3_data = val; @@ -863,7 +875,8 @@ void REGPARAM2 dfc_put_long(uaecptr addr regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; } - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* added by Laurent */ } } @@ -873,16 +886,16 @@ void REGPARAM2 dfc_put_word(uaecptr addr bool data = (regs.dfc & 3) != 2; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - if (likely(!is_unaligned(addr, 2))) - mmu_put_user_word(addr, val, super, data, sz_word); - else { - mmu_put_user_byte(addr, val >> 8, super, data, sz_word); - mmu_put_user_byte(addr + 1, val, super, data, sz_word); - } - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* aded by Laurent */ + if (likely(!is_unaligned(addr, 2))) + mmu_put_user_word(addr, val, super, data, sz_word); + else { + mmu_put_user_byte(addr, val >> 8, super, data, sz_word); + mmu_put_user_byte(addr + 1, val, super, data, sz_word); + } + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.wb3_data = val; @@ -890,7 +903,8 @@ void REGPARAM2 dfc_put_word(uaecptr addr regs.mmu_fault_addr = addr; regs.mmu_ssw |= MMU_SSW_MA; } - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* added by Laurent */ } } @@ -900,15 +914,16 @@ void REGPARAM2 dfc_put_byte(uaecptr addr bool data = (regs.dfc & 3) != 2; SAVE_EXCEPTION; -// TRY(prb) { - except = 0; - mmu_put_user_byte(addr, val, super, data, sz_byte); - RESTORE_EXCEPTION; - +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* aded by Laurent */ + mmu_put_user_byte(addr, val, super, data, sz_byte); + RESTORE_EXCEPTION; +// } /* Removed by Laurent */ CATCH(prb) { RESTORE_EXCEPTION; regs.wb3_data = val; - except=2; +// THROW_AGAIN(prb); /* Removed by Laurent */ + except=2; /* added by Laurent */ } } @@ -948,8 +963,8 @@ void REGPARAM2 mmu_op_real(uae_u32 opcod fprintf(stderr, "PTEST%c (A%d) %08x DFC=%d\n", write ? 'W' : 'R', regno, addr, regs.dfc); mmu_flush_atc(addr, super, true); SAVE_EXCEPTION; -// TRY(prb) { - except = 0; +// TRY(prb) { /* Removed by Laurent */ + except = 0; /* aded by Laurent */ struct mmu_atc_line *l; uae_u32 desc; bool data = (regs.dfc & 3) != 2; @@ -965,7 +980,7 @@ void REGPARAM2 mmu_op_real(uae_u32 opcod MMU_MMUSR_CM|MMU_MMUSR_M|MMU_MMUSR_W); regs.mmusr |= MMU_MMUSR_R; } - +// } /* Removed by Laurent */ CATCH(prb) { regs.mmusr = MMU_MMUSR_B; }