diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core.c | 17 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 2 | ||||
| -rw-r--r-- | src/include/debug.h | 1 | ||||
| -rw-r--r-- | src/tools/rcfile.c | 28 |
4 files changed, 46 insertions, 2 deletions
diff --git a/src/core.c b/src/core.c index 88a14416..3149f0b6 100644 --- a/src/core.c +++ b/src/core.c @@ -87,6 +87,8 @@ int box64_dynarec_missing = 0; int box64_dynarec_aligned_atomics = 0; uintptr_t box64_nodynarec_start = 0; uintptr_t box64_nodynarec_end = 0; +uintptr_t box64_dynarec_test_start = 0; +uintptr_t box64_dynarec_test_end = 0; #ifdef ARM64 int arm64_asimd = 0; int arm64_aes = 0; @@ -832,7 +834,22 @@ void LoadLogEnv() if(strlen(p)==1) { if(p[0]>='0' && p[0]<='2') box64_dynarec_test = p[0]-'0'; + box64_dynarec_test_start = 0x0; + box64_dynarec_test_end = 0x0; + } else if (strchr(p,'-')) { + if(sscanf(p, "%ld-%ld", &box64_dynarec_test_start, &box64_dynarec_test_end)!=2) { + if(sscanf(p, "0x%lX-0x%lX", &box64_dynarec_test_start, &box64_dynarec_test_end)!=2) + sscanf(p, "%lx-%lx", &box64_dynarec_test_start, &box64_dynarec_test_end); + } + if(box64_dynarec_test_end>box64_dynarec_test_start) { + box64_dynarec_test = 1; + printf_log(LOG_INFO, "Dynarec test in the range %p - %p\n", (void*)box64_nodynarec_start, (void*)box64_nodynarec_end); + } else { + box64_dynarec_test = 0; + printf_log(LOG_INFO, "Ignoring BOX64_NODYNAREC=%s (%p-%p)\n", p, (void*)box64_nodynarec_start, (void*)box64_nodynarec_end); + } } + if(box64_dynarec_test) { box64_dynarec_fastnan = 0; box64_dynarec_fastround = 0; diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 916d47b7..a36e0014 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -124,7 +124,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int if((dyn->insts[ninst].x64.need_before&~X_PEND) && !dyn->insts[ninst].pred_sz) { READFLAGS(dyn->insts[ninst].x64.need_before&~X_PEND); } - if(box64_dynarec_test) { + if(box64_dynarec_test && (!box64_dynarec_test_end || (ip>=box64_dynarec_test_start && ip<box64_dynarec_test_end) )) { MESSAGE(LOG_DUMP, "TEST STEP ----\n"); fpu_reflectcache(dyn, ninst, x1, x2, x3); GO_TRACE(x64test_step, 1, x5); diff --git a/src/include/debug.h b/src/include/debug.h index a6892097..f743a7e2 100644 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -21,6 +21,7 @@ extern int box64_dynarec_dump; extern int box64_dynarec_trace; extern int box64_dynarec_forced; extern uintptr_t box64_nodynarec_start, box64_nodynarec_end; +extern uintptr_t box64_dynarec_test_start, box64_dynarec_test_end; extern int box64_dynarec_bigblock; extern int box64_dynarec_forward; extern int box64_dynarec_strongmem; diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c index 4179fab6..3147cc4a 100644 --- a/src/tools/rcfile.c +++ b/src/tools/rcfile.c @@ -165,7 +165,7 @@ IGNORE(BOX64_DYNAREC_FASTPAGE) \ ENTRYBOOL(BOX64_DYNAREC_ALIGNED_ATOMICS, box64_dynarec_aligned_atomics) \ ENTRYBOOL(BOX64_DYNAREC_WAIT, box64_dynarec_wait) \ ENTRYSTRING_(BOX64_NODYNAREC, box64_nodynarec) \ -ENTRYBOOL(BOX64_DYNAREC_TEST, box64_dynarec_test) \ +ENTRYSTRING_(BOX64_DYNAREC_TEST, box64_dynarec_test) \ ENTRYBOOL(BOX64_DYNAREC_MISSING, box64_dynarec_missing) \ #else @@ -679,6 +679,32 @@ void ApplyParams(const char* name) printf_log(LOG_INFO, "Ignoring BOX64_NODYNAREC=%s (%p-%p)\n", param->box64_nodynarec, (void*)box64_nodynarec_start, (void*)box64_nodynarec_end); } } + if(param->is_box64_dynarec_test_present) { + uintptr_t no_start = 0, no_end = 0; + if(strlen(param->box64_dynarec_test)==1) { + box64_dynarec_test = param->box64_dynarec_test[0]-'0'; + box64_dynarec_test_start = 0x0; + box64_dynarec_test_end = 0x0; + if(box64_dynarec_test>2) box64_dynarec_test = 0; + } else { + int ok = 0; + if(sscanf(param->box64_dynarec_test, "0x%lX-0x%lX", &no_start, &no_end)==2) + ok = 1; + if(!ok && sscanf(param->box64_dynarec_test, "%lx-%lx", &no_start, &no_end)==2) + ok = 1; + if(!ok && sscanf(param->box64_dynarec_test, "%ld-%ld", &no_start, &no_end)==2) + ok = 1; + if(ok && no_end>no_start) { + box64_dynarec_test = 1; + box64_dynarec_test_start = no_start; + box64_dynarec_test_end = no_end; + printf_log(LOG_INFO, "Appling BOX64_DYNAREC_TEST=%p-%p\n", (void*)box64_dynarec_test_start, (void*)box64_dynarec_test_end); + } else { + box64_dynarec_test = 0; + printf_log(LOG_INFO, "Ignoring BOX64_DYNAREC_TEST=%s (%p-%p)\n", param->box64_dynarec_test, (void*)box64_dynarec_test_start, (void*)box64_dynarec_test_end); + } + } + } if(param->is_box64_dynarec_forward_present) { int forward = 0; if(sscanf(param->box64_dynarec_forward, "%d", &forward)==1) { |