diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/custommem.c | 16 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_native.c | 7 | ||||
| -rwxr-xr-x | src/include/debug.h | 1 | ||||
| -rwxr-xr-x | src/main.c | 13 | ||||
| -rwxr-xr-x | src/tools/bridge.c | 3 | ||||
| -rw-r--r-- | src/tools/rcfile.c | 2 |
6 files changed, 29 insertions, 13 deletions
diff --git a/src/custommem.c b/src/custommem.c index 3b31b326..a6f2693f 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1172,7 +1172,6 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) } #ifdef DYNAREC -#define HOTPAGE_STEP 16 int IsInHotPage(uintptr_t addr) { if(addr<=(1LL<<48)) return 0; @@ -1189,31 +1188,30 @@ int IsInHotPage(uintptr_t addr) { } int AreaInHotPage(uintptr_t start, uintptr_t end_) { - //dynarec_log(LOG_DEBUG, "AreaInHotPage %p -> %p => ", (void*)start, (void*)end_); uintptr_t idx = (start>>MEMPROT_SHIFT); uintptr_t end = (end_>>MEMPROT_SHIFT); if(end>=(1LL<<(48-MEMPROT_SHIFT))) end = (1LL<<(48-MEMPROT_SHIFT))-1LL; if(end<idx) { // memory addresses higher than 48bits are not tracked - //dynarec_log(LOG_DEBUG, "00\n"); return 0; } int ret = 0; for (uintptr_t i=idx; i<=end; ++i) { uint8_t *block = memprot[i>>16].hot; + int base = i&0xffff; if(block) { - uint32_t hot = block[i&0xffff]; + uint32_t hot = block[base]; if(hot) { // decrement hot - native_lock_decifnot0b(&block[i&0xffff]); - //dynarec_log(LOG_DEBUG, "1\n"); + native_lock_decifnot0b(&block[base]); ret = 1; } } else { - i+=0xffff; + i+=0xffff-base; } } - //dynarec_log(LOG_DEBUG, "0\n"); + if(ret && box64_dynarec_log>LOG_INFO) + dynarec_log(LOG_DEBUG, "BOX64: AreaInHotPage %p-%p\n", (void*)start, (void*)end_); return ret; } @@ -1227,7 +1225,7 @@ void AddHotPage(uintptr_t addr) { box_free(newblock); } } - native_lock_storeb(&memprot[idx].hot[base], HOTPAGE_STEP); + native_lock_storeb(&memprot[idx].hot[base], box64_dynarec_hotpage); } #endif diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index b4c93c74..2f58b2d8 100755 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -457,6 +457,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) { } if(!isprotectedDB(addr, 1)) { dynarec_log(LOG_INFO, "Warning, write on current page on pass0, aborting dynablock creation (%p)\n", (void*)addr); + AddHotPage(addr); CancelBlock64(); return NULL; } @@ -583,12 +584,14 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) { block->hash = X31_hash_code(block->x64_addr, block->x64_size); // Check if something changed, to abbort if it as if((block->hash != hash)) { - dynarec_log(LOG_INFO, "Warning, a block changed while beeing processed hash(%p:%ld)=%x/%x\n", block->x64_addr, block->x64_size, block->hash, hash); + dynarec_log(LOG_DEBUG, "Warning, a block changed while beeing processed hash(%p:%ld)=%x/%x\n", block->x64_addr, block->x64_size, block->hash, hash); + AddHotPage(addr); CancelBlock64(); return NULL; } if(!isprotectedDB(addr, end-addr)) { - dynarec_log(LOG_INFO, "Warning, block unprotected while beeing processed %p:%ld, cancelling\n", block->x64_addr, block->x64_size); + dynarec_log(LOG_DEBUG, "Warning, block unprotected while beeing processed %p:%ld, cancelling\n", block->x64_addr, block->x64_size); + AddHotPage(addr); CancelBlock64(); return NULL; //protectDB(addr, end-addr); diff --git a/src/include/debug.h b/src/include/debug.h index 3b45911d..815597a7 100755 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -20,6 +20,7 @@ extern int box64_dynarec_fastnan; extern int box64_dynarec_x87double; extern int box64_dynarec_safeflags; extern int box64_dynarec_callret; +extern int box64_dynarec_hotpage; #ifdef ARM64 extern int arm64_asimd; extern int arm64_aes; diff --git a/src/main.c b/src/main.c index da01c4e5..13d39784 100755 --- a/src/main.c +++ b/src/main.c @@ -52,6 +52,7 @@ int box64_dynarec_x87double = 0; int box64_dynarec_fastnan = 1; int box64_dynarec_safeflags = 1; int box64_dynarec_callret = 0; +int box64_dynarec_hotpage = 16; uintptr_t box64_nodynarec_start = 0; uintptr_t box64_nodynarec_end = 0; #ifdef ARM64 @@ -490,6 +491,18 @@ void LoadLogEnv() if(!box64_dynarec_callret) printf_log(LOG_INFO, "Dynarec will optimize CALL/RET\n"); } + p = getenv("BOX64_DYNAREC_HOTPAGE"); + if(p) { + int val = -1; + if(sscanf("%d", p, &val)==1) { + if(val>=0) + box64_dynarec_hotpage = val; + } + if(!box64_dynarec_hotpage) + printf_log(LOG_INFO, "Dynarec will have HotPage tagged for %d ticks\n", box64_dynarec_hotpage); + else + printf_log(LOG_INFO, "Dynarec will not tag HotPage\n"); + } p = getenv("BOX64_NODYNAREC"); if(p) { if (strchr(p,'-')) { diff --git a/src/tools/bridge.c b/src/tools/bridge.c index eb6939fb..5884e48a 100755 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -136,8 +136,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[sz].CC; pthread_mutex_unlock(&my_context->mutex_bridge); #ifdef DYNAREC - // only reprotect the block when stuffs are running - if(!my_context->deferedInit && box64_dynarec) + if(box64_dynarec) protectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t)); #endif #ifdef HAVE_TRACE diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c index 93ef8081..b20a88fc 100644 --- a/src/tools/rcfile.c +++ b/src/tools/rcfile.c @@ -76,6 +76,7 @@ ENTRYBOOL(BOX64_DYNAREC_X87DOUBLE, box64_dynarec_x87double) \ ENTRYBOOL(BOX64_DYNAREC_FASTNAN, box64_dynarec_fastnan) \ ENTRYINT(BOX64_DYNAREC_SAFEFLAGS, box64_dynarec_safeflags, 0, 2, 2) \ ENTRYBOOL(BOX64_DYNAREC_CALLRET, box64_dynarec_callret) \ +ENTRYINT(BOX64_DYNAREC_HOTPAGE, box64_dynarec_hotpage, 0, 255, 8) \ ENTRYSTRING_(BOX64_NODYNAREC, box64_nodynarec) \ #else @@ -89,6 +90,7 @@ IGNORE(BOX64_DYNAREC_X87DOUBLE) \ IGNORE(BOX64_DYNAREC_FASTNAN) \ IGNORE(BOX64_DYNAREC_SAFEFLAGS) \ IGNORE(BOX64_DYNAREC_CALLRET) \ +IGNORE(BOX64_DYNAREC_HOTPAGE) \ IGNORE(BOX64_NODYNAREC) \ #endif |