diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-06-16 12:07:22 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-06-16 12:07:22 +0200 |
| commit | ab6deeb319cf4389f0cfd555c8aa922300065ee6 (patch) | |
| tree | 2961681065d17f971083f92cb87bf2afc910d86a /src/dynarec | |
| parent | c1785a93ab7305e530b8c265ba230154020d0a0d (diff) | |
| download | box64-ab6deeb319cf4389f0cfd555c8aa922300065ee6.tar.gz box64-ab6deeb319cf4389f0cfd555c8aa922300065ee6.zip | |
[DYNACACHE] Added the ability to mark a maplist has having new blocks (instead of dirty block that are refreshed)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/dynablock.c | 12 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 16 |
2 files changed, 14 insertions, 14 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index 45a2b4f9..b5a81020 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -185,7 +185,7 @@ void cancelFillBlock() return NULL if block is not found / cannot be created. Don't create if create==0 */ -static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, int create, int need_lock, int is32bits) +static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, int create, int need_lock, int is32bits, int is_new) { if (hasAlternate((void*)filladdr)) return NULL; @@ -225,7 +225,7 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t mutex_unlock(&my_context->mutex_dyndump); return NULL; } - block = FillBlock64(filladdr, (addr==filladdr)?0:1, is32bits, MAX_INSTS); + block = FillBlock64(filladdr, (addr==filladdr)?0:1, is32bits, MAX_INSTS, is_new); if(!block) { dynarec_log(LOG_DEBUG, "Fillblock of block %p for %p returned an error\n", block, (void*)addr); } @@ -260,7 +260,7 @@ dynablock_t* DBGetBlock(x64emu_t* emu, uintptr_t addr, int create, int is32bits) int is_inhotpage = isInHotPage(addr); if(is_inhotpage && !BOX64ENV(dynarec_dirty)) return NULL; - dynablock_t *db = internalDBGetBlock(emu, addr, addr, create, 1, is32bits); + dynablock_t *db = internalDBGetBlock(emu, addr, addr, create, 1, is32bits, 1); if(db && db->done && db->block && getNeedTest(addr)) { if (db->always_test) SchedYield(); // just calm down... uint32_t hash = X31_hash_code(db->x64_addr, db->x64_size); @@ -273,7 +273,7 @@ dynablock_t* DBGetBlock(x64emu_t* emu, uintptr_t addr, int create, int is32bits) // Free db, it's now invalid! dynablock_t* old = InvalidDynablock(db, need_lock); // start again... (will create a new block) - db = internalDBGetBlock(emu, addr, addr, create, need_lock, is32bits); + db = internalDBGetBlock(emu, addr, addr, create, need_lock, is32bits, 0); if(db) { if(db->previous) FreeInvalidDynablock(db->previous, need_lock); @@ -312,7 +312,7 @@ dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, { dynarec_log(LOG_DEBUG, "Creating AlternateBlock at %p for %p%s\n", (void*)addr, (void*)filladdr, is32bits?" 32bits":""); int create = 1; - dynablock_t *db = internalDBGetBlock(emu, addr, filladdr, create, 1, is32bits); + dynablock_t *db = internalDBGetBlock(emu, addr, filladdr, create, 1, is32bits, 1); if(db && db->done && db->block && getNeedTest(filladdr)) { if (db->always_test) SchedYield(); // just calm down... int need_lock = mutex_trylock(&my_context->mutex_dyndump); @@ -323,7 +323,7 @@ dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, // Free db, it's now invalid! dynablock_t* old = InvalidDynablock(db, need_lock); // start again... (will create a new block) - db = internalDBGetBlock(emu, addr, filladdr, create, need_lock, is32bits); + db = internalDBGetBlock(emu, addr, filladdr, create, need_lock, is32bits, 0); if(db) { if(db->previous) FreeInvalidDynablock(db->previous, need_lock); diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index 6d777805..bba18978 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -567,9 +567,9 @@ uintptr_t native_pass1(dynarec_native_t* dyn, uintptr_t addr, int alternate, int uintptr_t native_pass2(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits, int inst_max); uintptr_t native_pass3(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits, int inst_max); -dynablock_t* CreateEmptyBlock(uintptr_t addr, int is32bits) { +dynablock_t* CreateEmptyBlock(uintptr_t addr, int is32bits, int is_new) { size_t sz = 4*sizeof(void*) + sizeof(dynablock_t); - void* actual_p = (void*)AllocDynarecMap(addr, sz); + void* actual_p = (void*)AllocDynarecMap(addr, sz, is_new); void* p = actual_p + sizeof(void*); if(actual_p==NULL) { dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", (void*)addr, sz); @@ -595,7 +595,7 @@ dynablock_t* CreateEmptyBlock(uintptr_t addr, int is32bits) { return block; } -dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_max) { +dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_max, int is_new) { /* A Block must have this layout: @@ -612,7 +612,7 @@ dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_m */ if(addr>=BOX64ENV(nodynarec_start) && addr<BOX64ENV(nodynarec_end)) { dynarec_log(LOG_INFO, "Create empty block in no-dynarec zone\n"); - return CreateEmptyBlock(addr, is32bits); + return CreateEmptyBlock(addr, is32bits, is_new); } if(current_helper) { dynarec_log(LOG_DEBUG, "Canceling dynarec FillBlock at %p as another one is going on\n", (void*)addr); @@ -660,7 +660,7 @@ dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_m if(!helper.size) { dynarec_log(LOG_INFO, "Warning, null-sized dynarec block (%p)\n", (void*)addr); CancelBlock64(0); - return CreateEmptyBlock(addr, is32bits); + return CreateEmptyBlock(addr, is32bits, is_new); } if(!isprotectedDB(addr, 1)) { dynarec_log(LOG_INFO, "Warning, write on current page on pass0, aborting dynablock creation (%p)\n", (void*)addr); @@ -762,7 +762,7 @@ dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_m // NULL block after removing dead code, how is that possible? dynarec_log(LOG_INFO, "Warning, null-sized dynarec block after trimming dead code (%p)\n", (void*)addr); CancelBlock64(0); - return CreateEmptyBlock(addr, is32bits); + return CreateEmptyBlock(addr, is32bits, is_new); } updateYmm0s(&helper, 0, 0); UPDATE_SPECIFICS(&helper); @@ -818,7 +818,7 @@ dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_m --imax; if(dyn->need_dump || BOX64ENV(dynarec_log))dynarec_log(LOG_NONE, "Dynablock oversized, with %zu (max=%zd), recomputing cutting at %d from %d\n", native_size, MAXBLOCK_SIZE, imax, helper.size); CancelBlock64(0); - return FillBlock64(addr, alternate, is32bits, imax); + return FillBlock64(addr, alternate, is32bits, imax, is_new); } size_t insts_rsize = (helper.insts_size+2)*sizeof(instsize_t); insts_rsize = (insts_rsize+7)&~7; // round the size... @@ -828,7 +828,7 @@ dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_m // ok, now allocate mapped memory, with executable flag on size_t sz = sizeof(void*) + native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize + arch_size + callret_size + sizeof(dynablock_t) + reloc_size; // dynablock_t* block (arm insts) table64 jmpnext code instsize arch callrets dynablock relocs - void* actual_p = (void*)AllocDynarecMap(addr, sz); + void* actual_p = (void*)AllocDynarecMap(addr, sz, is_new); void* p = (void*)(((uintptr_t)actual_p) + sizeof(void*)); void* tablestart = p + native_size; void* next = tablestart + helper.table64size*sizeof(uint64_t); |