about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-12-11 22:33:24 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-12-11 22:33:24 +0100
commit90445f7f1d868e737e22a4cb77e17de95563cd36 (patch)
treef3d0ea93cdf76d009b59ed95bdd394baae73caf6 /src
parent5a298c165e794cf10bfdeb9556a49e2c993602df (diff)
downloadbox64-90445f7f1d868e737e22a4cb77e17de95563cd36.tar.gz
box64-90445f7f1d868e737e22a4cb77e17de95563cd36.zip
[DYNAREC] Small fix on unwinding of the x64 address when a signal occurs just after a NOP opcode
Diffstat (limited to 'src')
-rwxr-xr-xsrc/libtools/signals.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index b7594d24..0b4c98c5 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -425,12 +425,14 @@ uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr)
             armsz+=db->instsize[i].nat*4;
             ++i;
         } while((db->instsize[i-1].x64==15) || (db->instsize[i-1].nat==15));
-        if(arm_addr>=armaddr && arm_addr<(armaddr+armsz))
-            return x64addr;
-        armaddr+=armsz;
-        x64addr+=x64sz;
-        if(arm_addr==armaddr)
-            return x64addr;
+        // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find
+        if(armsz) {
+            if((arm_addr>=armaddr) && (arm_addr<(armaddr+armsz)))
+                return x64addr;
+            armaddr+=armsz;
+            x64addr+=x64sz;
+        } else
+            x64addr+=x64sz;
     } while(db->instsize[i].x64 || db->instsize[i].nat);
     return x64addr;
 }