From b33bfb80d9fbfdfbd9e87627e7c6a2451bca9d44 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Mon, 30 Jan 2006 14:01:52 +0000 Subject: [PATCH] Add a larger cache. Allocated when the dynamic core is selected. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2461 --- src/cpu/core_dyn_x86.cpp | 13 +++-- src/cpu/core_dyn_x86/cache.h | 95 +++++++++++++++++++++++------------- src/cpu/cpu.cpp | 7 ++- 3 files changed, 75 insertions(+), 40 deletions(-) diff --git a/src/cpu/core_dyn_x86.cpp b/src/cpu/core_dyn_x86.cpp index 1aa13e98..1383116b 100644 --- a/src/cpu/core_dyn_x86.cpp +++ b/src/cpu/core_dyn_x86.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #if (C_HAVE_MPROTECT) #include @@ -46,14 +47,13 @@ #include "inout.h" #ifdef CHECKED_MEMORY_ACCESS -#define CACHE_PAGES (128*2) #define CACHE_MAXSIZE (4096*2) #else -#define CACHE_PAGES (128) #define CACHE_MAXSIZE (4096) #endif +#define CACHE_PAGES (128*8) #define CACHE_TOTAL (CACHE_PAGES*4096) -#define CACHE_BLOCKS (32*1024) +#define CACHE_BLOCKS (64*1024) #define CACHE_ALIGN (16) #define DYN_HASH_SHIFT (4) #define DYN_PAGE_HASH (4096>>DYN_HASH_SHIFT) @@ -346,11 +346,14 @@ void CPU_Core_Dyn_X86_Init(void) { DynRegs[G_SHIFT].flags=DYNFLG_HAS8|DYNFLG_HAS16; DynRegs[G_EXIT].data=0; DynRegs[G_EXIT].flags=DYNFLG_HAS16; - /* Initialize code cache and dynamic blocks */ - cache_init(); /* Init the generator */ gen_init(); return; } +void CPU_Core_Dyn_X86_Cache_Init(bool enable_cache) { + /* Initialize code cache and dynamic blocks */ + cache_init(enable_cache); +} + #endif diff --git a/src/cpu/core_dyn_x86/cache.h b/src/cpu/core_dyn_x86/cache.h index 9d307779..07ff1b94 100644 --- a/src/cpu/core_dyn_x86/cache.h +++ b/src/cpu/core_dyn_x86/cache.h @@ -44,13 +44,10 @@ static struct { #if (C_HAVE_MPROTECT) static Bit8u cache_code_link_blocks[2][16] GCC_ATTRIBUTE(aligned(PAGESIZE)); -static Bit8u cache_code[CACHE_TOTAL+CACHE_MAXSIZE] GCC_ATTRIBUTE(aligned(PAGESIZE)); #else static Bit8u cache_code_link_blocks[2][16]; -static Bit8u cache_code[CACHE_TOTAL+CACHE_MAXSIZE]; #endif -static CacheBlock cache_blocks[CACHE_BLOCKS]; static CacheBlock link_blocks[2]; class CodePageHandler :public PageHandler { @@ -393,38 +390,68 @@ static INLINE void cache_addd(Bit32u val) { static void gen_return(BlockReturn retcode); -static void cache_init(void) { - Bits i; - memset(&cache_blocks,0,sizeof(cache_blocks)); +static Bit8u * cache_code=NULL; +static CacheBlock * cache_blocks=NULL; + +/* Define temporary pagesize so the MPROTECT case and the regular case share as much code as possible */ #if (C_HAVE_MPROTECT) - mprotect(cache_code,sizeof(cache_code),PROT_WRITE|PROT_READ|PROT_EXEC); - mprotect(cache_code_link_blocks,sizeof(cache_code_link_blocks),PROT_WRITE|PROT_READ|PROT_EXEC); +#define PAGESIZE_TEMP PAGESIZE +#else +#define PAGESIZE_TEMP 1 #endif - cache.block.free=&cache_blocks[0]; - for (i=0;icache.start=&cache_code[0]; - block->cache.size=CACHE_TOTAL; - block->cache.next=0; //Last block in the list - cache.pos=&cache_code_link_blocks[0][0]; - link_blocks[0].cache.start=cache.pos; - gen_return(BR_Link1); - cache.pos=&cache_code_link_blocks[1][0]; - link_blocks[1].cache.start=cache.pos; - gen_return(BR_Link2); - cache.free_pages=0; - cache.last_page=0; - cache.used_pages=0; - /* Setup the code pages */ - for (i=0;inext=cache.free_pages; - cache.free_pages=newpage; + + +static void cache_init(bool enable) { + static bool cache_initialized = false; + Bits i; + if (enable) { + if (cache_initialized) return; + cache_initialized = true; + if (cache_blocks == NULL) { + cache_blocks=(CacheBlock*)malloc(CACHE_BLOCKS*sizeof(CacheBlock)); + if(!cache_blocks) E_Exit("Allocating cache_blocks has failed"); + memset(cache_blocks,0,sizeof(CacheBlock)*CACHE_BLOCKS); + cache.block.free=&cache_blocks[0]; + for (i=0;icache.start=&cache_code[0]; + block->cache.size=CACHE_TOTAL; + block->cache.next=0; //Last block in the list + } + /* Setup the default blocks for block linkage returns */ + cache.pos=&cache_code_link_blocks[0][0]; + link_blocks[0].cache.start=cache.pos; + gen_return(BR_Link1); + cache.pos=&cache_code_link_blocks[1][0]; + link_blocks[1].cache.start=cache.pos; + gen_return(BR_Link2); + cache.free_pages=0; + 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/cpu.cpp b/src/cpu/cpu.cpp index c67408cc..05093caf 100644 --- a/src/cpu/cpu.cpp +++ b/src/cpu/cpu.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: cpu.cpp,v 1.74 2005-08-15 14:17:20 c2woody Exp $ */ +/* $Id: cpu.cpp,v 1.75 2006-01-30 14:01:52 qbix79 Exp $ */ #include #include "dosbox.h" @@ -50,6 +50,7 @@ void CPU_Core_Full_Init(void); void CPU_Core_Normal_Init(void); void CPU_Core_Simple_Init(void); void CPU_Core_Dyn_X86_Init(void); +void CPU_Core_Dyn_X86_Cache_Init(bool enable_cache); /* In debug mode exceptions are tested and dosbox exits when @@ -1977,6 +1978,10 @@ public: else { LOG_MSG("CPU:Unknown core type %s, switcing back to normal.",core); } + +#if (C_DYNAMIC_X86) + CPU_Core_Dyn_X86_Cache_Init(!strcasecmp(core,"dynamic")); +#endif if(CPU_CycleMax <= 0) CPU_CycleMax = 2500; if(CPU_CycleUp <= 0) CPU_CycleUp = 500;