diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-11-18 14:18:00 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-11-18 14:18:00 +0100 |
| commit | 4f0e98ade5d37b8647cb5d39b6e5a3aded55fa2f (patch) | |
| tree | 8f0fe7ffefe4a4396a9556b1d37035da4e229ffb /src | |
| parent | 39dbfd9fd8c1cadf1a909029236dec973b190a3c (diff) | |
| download | box64-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-x | src/dynarec/dynarec_arm64_00.c | 10 | ||||
| -rwxr-xr-x | src/include/debug.h | 1 | ||||
| -rwxr-xr-x | src/librarian/library.c | 3 | ||||
| -rwxr-xr-x | src/main.c | 10 |
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,'-')) { |