diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-06-11 12:09:27 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-06-11 12:09:27 +0200 |
| commit | e2f22310f4fe4d863872fadc8df656a27c4360ba (patch) | |
| tree | 040b68fa81a4f93eeda5cec1ee5caab132273c1a /src | |
| parent | 347f90f9758f31d74ae42258cd15c0c260e3305c (diff) | |
| download | box64-e2f22310f4fe4d863872fadc8df656a27c4360ba.tar.gz box64-e2f22310f4fe4d863872fadc8df656a27c4360ba.zip | |
[DYNACACHE] Made dynablock part of the dynarec memory
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynablock.c | 26 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 39 | ||||
| -rw-r--r-- | src/include/dynarec_native.h | 2 |
3 files changed, 29 insertions, 38 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index 2c935e0a..45a2b4f9 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -79,8 +79,7 @@ void FreeInvalidDynablock(dynablock_t* db, int need_lock) dynarec_log(LOG_DEBUG, "FreeInvalidDynablock(%p), db->block=%p x64=%p:%p already gone=%d\n", db, db->block, db->x64_addr, db->x64_addr+db->x64_size-1, db->gone); if(need_lock) mutex_lock(&my_context->mutex_dyndump); - FreeDynarecMap((uintptr_t)db->actual_block); - customFree(db); + FreeDynarecMap((uintptr_t)db->actual_block); // will also free db if(need_lock) mutex_unlock(&my_context->mutex_dyndump); } @@ -109,8 +108,7 @@ void FreeDynablock(dynablock_t* db, int need_lock) } if(db->previous) FreeInvalidDynablock(db->previous, 0); - FreeDynarecMap((uintptr_t)db->actual_block); - customFree(db); + FreeDynarecMap((uintptr_t)db->actual_block); // will also free db if(need_lock) mutex_unlock(&my_context->mutex_dyndump); } @@ -176,15 +174,6 @@ int FreeRangeDynablock(dynablock_t* db, uintptr_t addr, uintptr_t size) return 1; } -dynablock_t *AddNewDynablock(uintptr_t addr) -{ - dynablock_t* block; - // create and add new block - dynarec_log(LOG_VERBOSE, "Ask for DynaRec Block creation @%p\n", (void*)addr); - block = (dynablock_t*)customCalloc(1, sizeof(dynablock_t)); - return block; -} - NEW_JUMPBUFF(dynarec_jmpbuf); void cancelFillBlock() @@ -230,22 +219,15 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t return NULL; } #endif - block = AddNewDynablock(addr); - - // fill the block - block->x64_addr = (void*)addr; if (SigSetJmp(GET_JUMPBUFF(dynarec_jmpbuf), 1)) { printf_log(LOG_INFO, "FillBlock at %p triggered a segfault, canceling\n", (void*)addr); - FreeDynablock(block, 0); if(need_lock) mutex_unlock(&my_context->mutex_dyndump); return NULL; } - void* ret = FillBlock64(block, filladdr, (addr==filladdr)?0:1, is32bits, MAX_INSTS); - if(!ret) { + block = FillBlock64(filladdr, (addr==filladdr)?0:1, is32bits, MAX_INSTS); + if(!block) { dynarec_log(LOG_DEBUG, "Fillblock of block %p for %p returned an error\n", block, (void*)addr); - customFree(block); - block = NULL; } // check size if(block) { diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index 0a57db95..b6e7a86b 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -558,17 +558,21 @@ 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); -void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr, int is32bits) { - block->isize = 0; - block->done = 0; - size_t sz = 4*sizeof(void*); +dynablock_t* CreateEmptyBlock(uintptr_t addr, int is32bits) { + size_t sz = 4*sizeof(void*) + sizeof(dynablock_t); void* actual_p = (void*)AllocDynarecMap(addr, sz); void* p = actual_p + sizeof(void*); if(actual_p==NULL) { - dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", block, sz); + dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", (void*)addr, sz); CancelBlock64(0); return NULL; } + dynablock_t* block = (dynablock_t*)(actual_p+4*sizeof(void*)); + memset(block, 0, sizeof(dynablock_t)); + // fill the block + block->x64_addr = (void*)addr; + block->isize = 0; + block->done = 0; block->size = sz; block->actual_block = actual_p; block->block = p; @@ -582,7 +586,7 @@ void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr, int is32bits) { return block; } -void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bits, int inst_max) { +dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_max) { /* A Block must have this layout: @@ -599,7 +603,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit */ if(addr>=BOX64ENV(nodynarec_start) && addr<BOX64ENV(nodynarec_end)) { dynarec_log(LOG_INFO, "Create empty block in no-dynarec zone\n"); - return CreateEmptyBlock(block, addr, is32bits); + return CreateEmptyBlock(addr, is32bits); } if(current_helper) { dynarec_log(LOG_DEBUG, "Canceling dynarec FillBlock at %p as another one is going on\n", (void*)addr); @@ -618,7 +622,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit helper.gdbjit_block = box_calloc(1, sizeof(gdbjit_block_t)); #endif current_helper = &helper; - helper.dynablock = block; + helper.dynablock = NULL; helper.start = addr; uintptr_t start = addr; helper.cap = MAX_INSTS; @@ -643,7 +647,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit if(!helper.size) { dynarec_log(LOG_INFO, "Warning, null-sized dynarec block (%p)\n", (void*)addr); CancelBlock64(0); - return CreateEmptyBlock(block, addr, is32bits); + return CreateEmptyBlock(addr, is32bits); } if(!isprotectedDB(addr, 1)) { dynarec_log(LOG_INFO, "Warning, write on current page on pass0, aborting dynablock creation (%p)\n", (void*)addr); @@ -745,7 +749,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit // 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(block, addr, is32bits); + return CreateEmptyBlock(addr, is32bits); } updateYmm0s(&helper, 0, 0); UPDATE_SPECIFICS(&helper); @@ -799,15 +803,15 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit --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(block, addr, alternate, is32bits, imax); + return FillBlock64(addr, alternate, is32bits, imax); } size_t insts_rsize = (helper.insts_size+2)*sizeof(instsize_t); insts_rsize = (insts_rsize+7)&~7; // round the size... size_t arch_size = ARCH_SIZE(&helper); size_t callret_size = helper.callret_size*sizeof(callret_t); // 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; - // dynablock_t* block (arm insts) table64 jmpnext code instsize arch callrets + size_t sz = sizeof(void*) + native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize + arch_size + callret_size + sizeof(dynablock_t); + // dynablock_t* block (arm insts) table64 jmpnext code instsize arch callrets dynablock void* actual_p = (void*)AllocDynarecMap(addr, sz); void* p = (void*)(((uintptr_t)actual_p) + sizeof(void*)); void* tablestart = p + native_size; @@ -816,11 +820,16 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit void* arch = instsize + insts_rsize; void* callrets = arch + arch_size; if(actual_p==NULL) { - dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", block, sz); + dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", (void*)addr, sz); CancelBlock64(0); return NULL; } helper.block = p; + dynablock_t* block = (dynablock_t*)(callrets+callret_size); + memset(block, 0, sizeof(dynablock_t)); + // fill the block + block->x64_addr = (void*)addr; + block->isize = 0; block->actual_block = actual_p; helper.native_start = (uintptr_t)p; helper.tablestart = (uintptr_t)tablestart; @@ -946,5 +955,5 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit } current_helper = NULL; //block->done = 1; - return (void*)block; + return block; } diff --git a/src/include/dynarec_native.h b/src/include/dynarec_native.h index 6e733eeb..74e0e05a 100644 --- a/src/include/dynarec_native.h +++ b/src/include/dynarec_native.h @@ -24,6 +24,6 @@ typedef struct instsize_s instsize_t; void addInst(instsize_t* insts, size_t* size, int x64_size, int native_size); void CancelBlock64(int need_lock); -void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bits, int inst_max); +dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_max); #endif //__DYNAREC_ARM_H_ |