about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-09-04 15:19:17 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-09-04 15:19:17 +0200
commitff7dc072d1bcdd32a4ca9a8f1bdc0e5d760f77ab (patch)
treea292e11d5f3860cd0abd9e0f07c69f049f797365 /src
parentb185afa29f8a6b8d368a161dea9de7186f3f314c (diff)
downloadbox64-ff7dc072d1bcdd32a4ca9a8f1bdc0e5d760f77ab.tar.gz
box64-ff7dc072d1bcdd32a4ca9a8f1bdc0e5d760f77ab.zip
Make StrongMem emulation level 2 stronger
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c15
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_66.c15
2 files changed, 24 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 6bee4991..b662c0e1 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -929,7 +929,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             } else {
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff, 0, rex, &lock, 0, 0);
                 STRB_U12(gd, ed, fixedaddress);
-                if(lock) {DMB_ISH();}
+                if(lock || (box64_dynarec_strongmem && 
+                 (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) {
+                    DMB_ISH();
+                }
             }
             break;
         case 0x89:
@@ -1599,7 +1602,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 u8 = F8;
                 MOV32w(x3, u8);
                 STRB_U12(x3, ed, fixedaddress);
-                if(lock) {DMB_ISH();}
+                if(lock || (box64_dynarec_strongmem && 
+                 (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) {
+                    DMB_ISH();
+                }
             }
             break;
         case 0xC7:
@@ -1614,7 +1620,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 i64 = F32S;
                 MOV64xw(x3, i64);
                 STRxw_U12(x3, ed, fixedaddress);
-                if(lock) {DMB_ISH();}
+                if(lock || (box64_dynarec_strongmem && 
+                 (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) {
+                    DMB_ISH();
+                }
             }
             break;
 
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 0d8207a7..ecdb4b1b 100755
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -444,7 +444,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             } else {

                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<1, 1, rex, &lock, 0, 0);

                 STRH_U12(gd, ed, fixedaddress);

-                if(lock) {DMB_ISH();}

+                if(lock || (box64_dynarec_strongmem && 

+                 (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) {

+                    DMB_ISH();

+                }

             }

             break;

         case 0x8B:

@@ -458,7 +461,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 }

             } else {

                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<1, 1, rex, &lock, 0, 0);

-                if(lock) {DMB_ISH();}

+                if(lock || (box64_dynarec_strongmem && 

+                 (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) {

+                    DMB_ISH();

+                }

                 LDRH_U12(x1, ed, fixedaddress);

                 BFIx(gd, x1, 0, 16);

             }

@@ -679,7 +685,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 u16 = F16;

                 MOV32w(x1, u16);

                 STRH_U12(x1, ed, fixedaddress);

-                if(lock) {DMB_ISH();}

+                if(lock || (box64_dynarec_strongmem && 

+                 (dyn->insts[ninst].x64.barrier || box64_dynarec_strongmem>1 || (dyn->insts[ninst+1].x64.barrier || dyn->insts[ninst+1].x64.jmp)))) {

+                    DMB_ISH();

+                }

             }

             break;