diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-25 22:22:22 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-25 22:22:22 +0000 |
| commit | 85da2b7e235a1d289ca957cbe926896ed882a094 (patch) | |
| tree | 7d6864e2150edde272b979cc48ac353e3cbfd274 /src | |
| parent | da7136ab7edc3ef2206b48a932352bb17c20cbc6 (diff) | |
| download | box64-85da2b7e235a1d289ca957cbe926896ed882a094.tar.gz box64-85da2b7e235a1d289ca957cbe926896ed882a094.zip | |
[DYNAREC] Some fixes and small improvment to common codeblock generator
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_native.c | 11 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_native_pass.c | 26 |
2 files changed, 26 insertions, 11 deletions
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index 887e3869..d07588ec 100755 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -520,12 +520,13 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) { // keep size of instructions for signal handling size_t insts_rsize = (helper.insts_size+2)*sizeof(instsize_t); insts_rsize = (insts_rsize+7)&~7; // round the size... + size_t native_size = (helper.native_size+7)&~7; // round the size... // ok, now allocate mapped memory, with executable flag on - size_t sz = sizeof(void*) + helper.native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize; + size_t sz = sizeof(void*) + native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize; // dynablock_t* block (arm insts) table64 jmpnext code instsize void* actual_p = (void*)AllocDynarecMap(sz); void* p = actual_p + sizeof(void*); - void* next = p + helper.native_size + helper.table64size*sizeof(uint64_t); + void* next = p + native_size + helper.table64size*sizeof(uint64_t); void* instsize = next + 4*sizeof(void*); if(actual_p==NULL) { dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, cancelling block\n", block, sz); @@ -534,7 +535,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) { } helper.block = p; helper.native_start = (uintptr_t)p; - helper.tablestart = helper.native_start + helper.native_size; + helper.tablestart = helper.native_start + native_size; helper.insts_size = 0; // reset helper.instsize = (instsize_t*)instsize; *(dynablock_t**)actual_p = block; @@ -583,8 +584,8 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) { block->block = p; block->jmpnext = next+sizeof(void*); *(dynablock_t**)next = block; - *(void**)(next+2*sizeof(void*)) = native_next; - CreateJmpNext(block->jmpnext, next+2*sizeof(void*)); + *(void**)(next+3*sizeof(void*)) = native_next; + CreateJmpNext(block->jmpnext, next+3*sizeof(void*)); block->need_test = 0; //block->x64_addr = (void*)start; block->x64_size = end-start; diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index c76c8020..d8cd21b7 100755 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -191,12 +191,14 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) } if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Extend block %p, %p -> %p (ninst=%d, jump from %d)\n", dyn, (void*)addr, (void*)next, ninst, reset_n); } else if(next && (next-addr)<box64_dynarec_forward && (getProtection(next)&PROT_READ)/*box64_dynarec_bigblock>=stopblock*/) { - dyn->forward = addr; - dyn->forward_to = next; - dyn->forward_size = dyn->size; - dyn->forward_ninst = ninst; - reset_n = -2; - ok = 1; + if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next))) { + dyn->forward = addr; + dyn->forward_to = next; + dyn->forward_size = dyn->size; + dyn->forward_ninst = ninst; + reset_n = -2; + ok = 1; + } } } #endif @@ -221,6 +223,18 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) if(ok && (ninst==dyn->size)) #endif { + #if STEP == 0 + if(dyn->forward) { + // stopping too soon + dyn->size = dyn->forward_size; + ninst = dyn->forward_ninst; + addr = dyn->forward; + dyn->forward = 0; + dyn->forward_to = 0; + dyn->forward_size = 0; + dyn->forward_ninst = 0; + } + #endif int j32; MAYUSE(j32); MESSAGE(LOG_DEBUG, "Stopping block %p (%d / %d)\n",(void*)init_addr, ninst, dyn->size); |