about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-15 18:24:54 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-15 18:24:54 +0100
commit8432f7d8e212c123169f198bc22df7819892a9e9 (patch)
tree6fd2693838de5acfe531f4b2d232fdb4d2a010b6 /src
parentec675564c6d27c66a03c7573e893d445677f858e (diff)
downloadbox64-8432f7d8e212c123169f198bc22df7819892a9e9.tar.gz
box64-8432f7d8e212c123169f198bc22df7819892a9e9.zip
[DYNAREC] Introduce BOX64_DYNAREC_DIRTY and some profile to use it
Diffstat (limited to 'src')
-rw-r--r--src/core.c10
-rw-r--r--src/include/debug.h1
-rw-r--r--src/libtools/signals.c2
-rw-r--r--src/tools/rcfile.c2
4 files changed, 14 insertions, 1 deletions
diff --git a/src/core.c b/src/core.c
index 530f616d..85c60500 100644
--- a/src/core.c
+++ b/src/core.c
@@ -105,6 +105,7 @@ int box64_dynarec_gdbjit = 0;
 int box64_dynarec_df = 1;
 int box64_dynarec_perf_map = 0;
 int box64_dynarec_perf_map_fd = -1;
+int box64_dynarec_dirty = 0;
 #ifdef ARM64
 int arm64_asimd = 0;
 int arm64_aes = 0;
@@ -939,6 +940,15 @@ void LoadLogEnv()
         if(!box64_dynarec_df)
             printf_log(LOG_INFO, "Dynarec will not use/generate defered flags\n");
     }
+    p = getenv("BOX64_DYNAREC_DIRTY");
+    if(p) {
+        if(strlen(p)==1) {
+            if(p[0]>='0' && p[0]<='1')
+                box64_dynarec_dirty = p[0]-'0';
+        }
+        if(box64_dynarec_dirty)
+            printf_log(LOG_INFO, "Dynarec will allow dirty block to continu running\n");
+    }
     p = getenv("BOX64_DYNAREC_ALIGNED_ATOMICS");
     if(p) {
         if(strlen(p)==1) {
diff --git a/src/include/debug.h b/src/include/debug.h
index c710a249..48843392 100644
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -46,6 +46,7 @@ extern int box64_dynarec_nativeflags;
 extern int box64_dynarec_df;
 extern int box64_dynarec_perf_map;
 extern int box64_dynarec_perf_map_fd;
+extern int box64_dynarec_dirty;
 #ifdef ARM64
 extern int arm64_asimd;
 extern int arm64_aes;
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index 46eb4d5a..d6aa7075 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -1622,7 +1622,7 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx)
         unprotectDB((uintptr_t)addr, 1, 1);    // unprotect 1 byte... But then, the whole page will be unprotected
         if(db) CheckHotPage((uintptr_t)addr);
         int db_need_test = db?getNeedTest((uintptr_t)db->x64_addr):0;
-        if(db && ((addr>=db->x64_addr && addr<(db->x64_addr+db->x64_size)) || db_need_test)) {
+        if(db && ((addr>=db->x64_addr && addr<(db->x64_addr+db->x64_size)) || (db_need_test && !box64_dynarec_dirty))) {
             emu = getEmuSignal(emu, p, db);
             // dynablock got auto-dirty! need to get out of it!!!
             if(emu->jmpbuf) {
diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c
index 061b9124..674ec52d 100644
--- a/src/tools/rcfile.c
+++ b/src/tools/rcfile.c
@@ -177,6 +177,7 @@ ENTRYSTRING_(BOX64_NODYNAREC, box64_nodynarec)                      \
 ENTRYSTRING_(BOX64_DYNAREC_TEST, box64_dynarec_test)                \
 ENTRYBOOL(BOX64_DYNAREC_MISSING, box64_dynarec_missing)             \
 ENTRYBOOL(BOX64_DYNAREC_DF, box64_dynarec_df)                       \
+ENTRYBOOL(BOX64_DYNAREC_DIRTY, box64_dynarec_dirty)                 \
 
 #else
 #define SUPER3()                                                    \
@@ -206,6 +207,7 @@ IGNORE(BOX64_NODYNAREC)                                             \
 IGNORE(BOX64_DYNAREC_TEST)                                          \
 IGNORE(BOX64_DYNAREC_MISSING)                                       \
 IGNORE(BOX64_DYNAREC_DF)                                            \
+IGNORE(BOX64_DYNAREC_DIRTY)                                         \
 
 #endif