diff --git a/src/cpu/core_dyn_x86.cpp b/src/cpu/core_dyn_x86.cpp index 570a0b00..daf97fd7 100644 --- a/src/cpu/core_dyn_x86.cpp +++ b/src/cpu/core_dyn_x86.cpp @@ -226,7 +226,11 @@ restart_core: #if C_HEAVY_DEBUG if (DEBUG_HeavyIsBreakpoint()) return debugCallback; #endif - CodePageHandler * chandler=MakeCodePage(ip_page); + CodePageHandler * chandler=0; + if (GCC_UNLIKELY(MakeCodePage(ip_page,chandler))) { + CPU_Exception(cpu.exception.which,cpu.exception.error); + goto restart_core; + } if (!chandler) return CPU_Core_Normal_Run(); /* Find correct Dynamic Block to run */ CacheBlock * block=chandler->FindCacheBlock(ip_point&4095); diff --git a/src/cpu/core_dyn_x86/cache.h b/src/cpu/core_dyn_x86/cache.h index 07ff1b94..6751cad6 100644 --- a/src/cpu/core_dyn_x86/cache.h +++ b/src/cpu/core_dyn_x86/cache.h @@ -233,18 +233,23 @@ private: }; -static CodePageHandler * MakeCodePage(Bitu lin_page) { - mem_readb(lin_page << 12); //Ensure page contains memory +static bool MakeCodePage(Bitu lin_page,CodePageHandler * &cph) { + Bit8u rdval; + //Ensure page contains memory: + if (GCC_UNLIKELY(mem_readb_checked_x86(lin_page << 12,&rdval))) return true; PageHandler * handler=paging.tlb.handler[lin_page]; - if (handler->flags & PFLAG_HASCODE) return ( CodePageHandler *)handler; + if (handler->flags & PFLAG_HASCODE) { + cph=( CodePageHandler *)handler; + return false; + } if (handler->flags & PFLAG_NOCODE) { LOG_MSG("DYNX86:Can't run code in this page"); - return 0; + cph=0; return false; } Bitu phys_page=lin_page; if (!PAGING_MakePhysPage(phys_page)) { LOG_MSG("DYNX86:Can't find physpage"); - return 0; + cph=0; return false; } /* Find a free CodePage */ if (!cache.free_pages) { @@ -260,7 +265,8 @@ static CodePageHandler * MakeCodePage(Bitu lin_page) { cpagehandler->SetupAt(phys_page,handler); MEM_SetPageHandler(phys_page,1,cpagehandler); PAGING_UnlinkPages(lin_page,1); - return cpagehandler; + cph=cpagehandler; + return false; } static INLINE void cache_addunsedblock(CacheBlock * block) { diff --git a/src/cpu/core_dyn_x86/decoder.h b/src/cpu/core_dyn_x86/decoder.h index e851d6c1..ad8f7292 100644 --- a/src/cpu/core_dyn_x86/decoder.h +++ b/src/cpu/core_dyn_x86/decoder.h @@ -61,7 +61,9 @@ static Bit8u decode_fetchb(void) { if (decode.page.index>=4096) { /* Advance to the next page */ decode.active_block->page.end=4095; - decode.page.code=MakeCodePage(++decode.page.first); + /* trigger possible page fault here */ + mem_readb((++decode.page.first) << 12); + MakeCodePage(decode.page.first,decode.page.code); CacheBlock * newblock=cache_getblock(); decode.active_block->crossblock=newblock; newblock->crossblock=decode.active_block;