about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core.c17
-rw-r--r--src/dynarec/dynarec_native_pass.c2
-rw-r--r--src/include/debug.h1
-rw-r--r--src/tools/rcfile.c28
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) {