about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-11-18 14:18:00 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-11-18 14:18:00 +0100
commit4f0e98ade5d37b8647cb5d39b6e5a3aded55fa2f (patch)
tree8f0fe7ffefe4a4396a9556b1d37035da4e229ffb /src
parent39dbfd9fd8c1cadf1a909029236dec973b190a3c (diff)
downloadbox64-4f0e98ade5d37b8647cb5d39b6e5a3aded55fa2f.tar.gz
box64-4f0e98ade5d37b8647cb5d39b6e5a3aded55fa2f.zip
[DYNAREC] Added an option to simulate Strong Memory Model, and auto activate it when libmonobdgcw-2.0.so is detected (should help #110 and #158 at least)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c10
-rwxr-xr-xsrc/include/debug.h1
-rwxr-xr-xsrc/librarian/library.c3
-rwxr-xr-xsrc/main.c10
4 files changed, 21 insertions, 3 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 401a30e8..917e7e4a 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -955,6 +955,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     ed = wback;
                 }
             } else {
+                if(box64_dynarec_strongmem) {
+                    DMB_ISH();
+                }
                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff, 0, rex, 0, 0);
                 LDRB_U12(x4, wback, fixedaddress);
                 ed = x4;
@@ -965,9 +968,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             INST_NAME("MOV Gd, Ed");
             nextop=F8;
             GETGD;
-            if(MODREG) {   // reg <= reg
+            if(MODREG) {
                 MOVxw_REG(gd, xRAX+(nextop&7)+(rex.b<<3));
-            } else {                    // mem <= reg
+            } else {    
+                if(box64_dynarec_strongmem) {
+                    DMB_ISH();
+                }
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, 0, 0);
                 LDRxw_U12(gd, ed, fixedaddress);
             }
diff --git a/src/include/debug.h b/src/include/debug.h
index 80288c96..0cb2be34 100755
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -14,6 +14,7 @@ extern int box64_dynarec_trace;
 extern int box64_dynarec_forced;
 extern uintptr_t box64_nodynarec_start, box64_nodynarec_end;
 extern int box64_dynarec_bigblock;
+extern int box64_dynarec_strongmem;
 #ifdef ARM64
 extern int arm64_asimd;
 extern int arm64_aes;
diff --git a/src/librarian/library.c b/src/librarian/library.c
index eb9a4459..86638591 100755
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -264,8 +264,9 @@ static int loadEmulatedLib(const char* libname, library_t *lib, box64context_t*
         printf_log(LOG_INFO, "Using emulated %s\n", libname);
         #ifdef DYNAREC
         if(libname && strstr(libname, "libmonobdwgc-2.0.so")) {
-            printf_log(LOG_INFO, "MonoBleedingEdge detected, disable Dynarec BigBlock\n");
+            printf_log(LOG_INFO, "MonoBleedingEdge detected, disable Dynarec BigBlock and enable Dynarec StrongMem\n");
             box64_dynarec_bigblock = 0;
+            box64_dynarec_strongmem = 1;
         }
         #endif
         return 1;
diff --git a/src/main.c b/src/main.c
index 034b6d6d..c5719f4e 100755
--- a/src/main.c
+++ b/src/main.c
@@ -43,6 +43,7 @@ int box64_dynarec = 1;
 int box64_dynarec_dump = 0;
 int box64_dynarec_forced = 0;
 int box64_dynarec_bigblock = 1;
+int box64_dynarec_strongmem = 0;
 uintptr_t box64_nodynarec_start = 0;
 uintptr_t box64_nodynarec_end = 0;
 #ifdef ARM64
@@ -272,6 +273,15 @@ void LoadLogEnv()
         if(!box64_dynarec_bigblock)
         printf_log(LOG_INFO, "Dynarec will not try to make big block\n");
     }
+    p = getenv("BOX64_DYNAREC_STRONGMEM");
+    if(p) {
+        if(strlen(p)==1) {
+            if(p[0]>='0' && p[0]<='1')
+                box64_dynarec_strongmem = p[0]-'0';
+        }
+        if(box64_dynarec_strongmem)
+        printf_log(LOG_INFO, "Dynarec will try to emulate a strong memory model\n");
+    }
     p = getenv("BOX64_NODYNAREC");
     if(p) {
         if (strchr(p,'-')) {