diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-12-11 22:33:24 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-12-11 22:33:24 +0100 |
| commit | 90445f7f1d868e737e22a4cb77e17de95563cd36 (patch) | |
| tree | f3d0ea93cdf76d009b59ed95bdd394baae73caf6 /src/libtools | |
| parent | 5a298c165e794cf10bfdeb9556a49e2c993602df (diff) | |
| download | box64-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/libtools')
| -rwxr-xr-x | src/libtools/signals.c | 14 |
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; } |