diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-17 16:33:59 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-17 16:33:59 +0200 |
| commit | 7d77a4b31f222e337e8f873da670b6e5fcdeda57 (patch) | |
| tree | 3fe3a69bd7a3e086d8bd35122240a745f5944188 /src | |
| parent | 59217ccbbe8fb81632f19bfa62d68b5dcf80732f (diff) | |
| download | box64-7d77a4b31f222e337e8f873da670b6e5fcdeda57.tar.gz box64-7d77a4b31f222e337e8f873da670b6e5fcdeda57.zip | |
[DYNAREC] Track if a dynablock is for 32bits code (for future use)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynablock_private.h | 5 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 10 |
2 files changed, 9 insertions, 6 deletions
diff --git a/src/dynarec/dynablock_private.h b/src/dynarec/dynablock_private.h index 18666e04..4bf7dd7a 100644 --- a/src/dynarec/dynablock_private.h +++ b/src/dynarec/dynablock_private.h @@ -10,14 +10,15 @@ typedef struct dynablock_s { void* block; // block-sizeof(void*) == self void* actual_block; // the actual start of the block (so block-sizeof(void*)) struct dynablock_s* previous; // a previous block that might need to be freed - int size; void* x64_addr; uintptr_t x64_size; + int size; uint32_t hash; uint8_t done; uint8_t gone; - uint8_t always_test; uint8_t dirty; // if need to be tested as soon as it's created + uint8_t always_test:1; + uint8_t is32bits:1; int isize; instsize_t* instsize; void* jmpnext; // a branch jmpnext code when block is marked diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index e7cad50d..dc0e1830 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -514,7 +514,7 @@ 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); uintptr_t native_pass3(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits); -void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr) { +void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr, int is32bits) { block->isize = 0; block->done = 0; size_t sz = 4*sizeof(void*); @@ -529,6 +529,7 @@ void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr) { block->actual_block = actual_p; block->block = p; block->jmpnext = p; + block->is32bits = is32bits; *(dynablock_t**)actual_p = block; *(void**)(p+2*sizeof(void*)) = native_epilog; CreateJmpNext(block->jmpnext, p+2*sizeof(void*)); @@ -553,7 +554,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit */ if(addr>=box64_nodynarec_start && addr<box64_nodynarec_end) { dynarec_log(LOG_INFO, "Create empty block in no-dynarec zone\n"); - return CreateEmptyBlock(block, addr); + return CreateEmptyBlock(block, addr, is32bits); } if(current_helper) { dynarec_log(LOG_DEBUG, "Canceling dynarec FillBlock at %p as another one is going on\n", (void*)addr); @@ -586,7 +587,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); + return CreateEmptyBlock(block, addr, is32bits); } if(!isprotectedDB(addr, 1)) { dynarec_log(LOG_INFO, "Warning, write on current page on pass0, aborting dynablock creation (%p)\n", (void*)addr); @@ -676,7 +677,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); + return CreateEmptyBlock(block, addr, is32bits); } updateYmm0s(&helper, 0, 0); @@ -755,6 +756,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit block->jmpnext = next+sizeof(void*); block->always_test = helper.always_test; block->dirty = block->always_test; + block->is32bits = is32bits; *(dynablock_t**)next = block; *(void**)(next+3*sizeof(void*)) = native_next; CreateJmpNext(block->jmpnext, next+3*sizeof(void*)); |