From 2b577443e021b2e3a3e1fcb369330c32b879081b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Fri, 2 Feb 2007 17:23:14 +0000 Subject: [PATCH] avoid selfpage removal for crossblocks when codepages run out Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2794 --- src/cpu/core_dyn_x86/cache.h | 38 +---------------------------- src/cpu/core_dyn_x86/decoder.h | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 37 deletions(-) diff --git a/src/cpu/core_dyn_x86/cache.h b/src/cpu/core_dyn_x86/cache.h index bd2b51ac..ce3f2556 100644 --- a/src/cpu/core_dyn_x86/cache.h +++ b/src/cpu/core_dyn_x86/cache.h @@ -278,42 +278,6 @@ private: }; -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) { - cph=( CodePageHandler *)handler; - return false; - } - if (handler->flags & PFLAG_NOCODE) { - LOG_MSG("DYNX86:Can't run code in this page"); - cph=0; return false; - } - Bitu phys_page=lin_page; - if (!PAGING_MakePhysPage(phys_page)) { - LOG_MSG("DYNX86:Can't find physpage"); - cph=0; return false; - } - /* Find a free CodePage */ - if (!cache.free_pages) { - cache.used_pages->ClearRelease(); - } - CodePageHandler * cpagehandler=cache.free_pages; - cache.free_pages=cache.free_pages->next; - cpagehandler->prev=cache.last_page; - cpagehandler->next=0; - if (cache.last_page) cache.last_page->next=cpagehandler; - cache.last_page=cpagehandler; - if (!cache.used_pages) cache.used_pages=cpagehandler; - cpagehandler->SetupAt(phys_page,handler); - MEM_SetPageHandler(phys_page,1,cpagehandler); - PAGING_UnlinkPages(lin_page,1); - cph=cpagehandler; - return false; -} - static INLINE void cache_addunsedblock(CacheBlock * block) { block->cache.next=cache.block.free; cache.block.free=block; @@ -502,7 +466,7 @@ static void cache_init(bool enable) { cache.last_page=0; cache.used_pages=0; /* Setup the code pages */ - for (i=0;inext=cache.free_pages; cache.free_pages=newpage; diff --git a/src/cpu/core_dyn_x86/decoder.h b/src/cpu/core_dyn_x86/decoder.h index 35cdd147..caec4c29 100644 --- a/src/cpu/core_dyn_x86/decoder.h +++ b/src/cpu/core_dyn_x86/decoder.h @@ -50,6 +50,50 @@ static struct DynDecode { DynReg * segprefix; } decode; +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) { + cph=( CodePageHandler *)handler; + return false; + } + if (handler->flags & PFLAG_NOCODE) { + LOG_MSG("DYNX86:Can't run code in this page"); + cph=0; return false; + } + Bitu phys_page=lin_page; + if (!PAGING_MakePhysPage(phys_page)) { + LOG_MSG("DYNX86:Can't find physpage"); + cph=0; return false; + } + /* Find a free CodePage */ + if (!cache.free_pages) { + if (cache.used_pages!=decode.page.code) cache.used_pages->ClearRelease(); + else { + if ((cache.used_pages->next) && (cache.used_pages->next!=decode.page.code)) + cache.used_pages->next->ClearRelease(); + else { + LOG_MSG("DYNX86:Invalid cache links"); + cache.used_pages->ClearRelease(); + } + } + } + CodePageHandler * cpagehandler=cache.free_pages; + cache.free_pages=cache.free_pages->next; + cpagehandler->prev=cache.last_page; + cpagehandler->next=0; + if (cache.last_page) cache.last_page->next=cpagehandler; + cache.last_page=cpagehandler; + if (!cache.used_pages) cache.used_pages=cpagehandler; + cpagehandler->SetupAt(phys_page,handler); + MEM_SetPageHandler(phys_page,1,cpagehandler); + PAGING_UnlinkPages(lin_page,1); + cph=cpagehandler; + return false; +} + static Bit8u decode_fetchb(void) { if (GCC_UNLIKELY(decode.page.index>=4096)) { /* Advance to the next page */