diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-02 14:37:09 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-02 14:37:09 +0200 |
| commit | 7bb9dd18da19f7acaf32927c720403385065175d (patch) | |
| tree | 93d1b0d6548cf129cabd9a0457c93d401070682e /src/libtools | |
| parent | 140254f311eead840969229040c807ad3da3f177 (diff) | |
| download | box64-7bb9dd18da19f7acaf32927c720403385065175d.tar.gz box64-7bb9dd18da19f7acaf32927c720403385065175d.zip | |
[DYNAREC] Improved the fast native call path
Diffstat (limited to 'src/libtools')
| -rwxr-xr-x | src/libtools/signals.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 0e3bf721..c374a2b3 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -707,6 +707,17 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) void* rsp = NULL; #ifdef __aarch64__ void * pc = (void*)p->uc_mcontext.pc; + struct fpsimd_context *fpsimd = NULL; + // find fpsimd struct + { + struct _aarch64_ctx * ff = (struct _aarch64_ctx*)p->uc_mcontext.__reserved; + while (ff->magic && !fpsimd) { + if(ff->magic==FPSIMD_MAGIC) + fpsimd = (struct fpsimd_context*)ff; + else + ff = (struct _aarch64_ctx*)((uintptr_t)ff + ff->size); + } + } #elif defined __x86_64__ void * pc = (void*)p->uc_mcontext.gregs[X64_RIP]; #elif defined __powerpc64__ @@ -747,6 +758,12 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) ejb->emu->regs[_R13].q[0] = p->uc_mcontext.regs[23]; ejb->emu->regs[_R14].q[0] = p->uc_mcontext.regs[24]; ejb->emu->regs[_R15].q[0] = p->uc_mcontext.regs[25]; + if(fpsimd) { + ejb->emu->xmm[0].u128 = fpsimd->vregs[0]; + ejb->emu->xmm[1].u128 = fpsimd->vregs[1]; + ejb->emu->xmm[2].u128 = fpsimd->vregs[2]; + ejb->emu->xmm[3].u128 = fpsimd->vregs[3]; + } ejb->emu->ip.q[0] = getX64Address(db, (uintptr_t)pc); ejb->emu->eflags.x64 = p->uc_mcontext.regs[26]; if(addr>=db->x64_addr && addr<(db->x64_addr+db->x64_size)) { |