diff options
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/dynablock.c | 11 | ||||
| -rw-r--r-- | src/dynarec/dynarec.c | 11 |
2 files changed, 16 insertions, 6 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index 114479bc..d95fb829 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -171,11 +171,16 @@ dynablock_t *AddNewDynablock(uintptr_t addr) } //TODO: move this to dynrec_arm.c and track allocated structure to avoid memory leak -static __thread struct __jmp_buf_tag dynarec_jmpbuf; +static __thread JUMPBUFF dynarec_jmpbuf; +#ifdef ANDROID +#define DYN_JMPBUF dynarec_jmpbuf +#else +#define DYN_JMPBUF &dynarec_jmpbuf +#endif void cancelFillBlock() { - longjmp(&dynarec_jmpbuf, 1); + longjmp(DYN_JMPBUF, 1); } /* @@ -208,7 +213,7 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t // fill the block block->x64_addr = (void*)addr; - if(sigsetjmp(&dynarec_jmpbuf, 1)) { + if(sigsetjmp(DYN_JMPBUF, 1)) { printf_log(LOG_INFO, "FillBlock at %p triggered a segfault, canceling\n", (void*)addr); FreeDynablock(block, 0); if(need_lock) diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index 77ca980c..b832b1e5 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -103,16 +103,21 @@ void DynaCall(x64emu_t* emu, uintptr_t addr) void DynaRun(x64emu_t* emu) { // prepare setjump for signal handling - struct __jmp_buf_tag jmpbuf[1] = {0}; + JUMPBUFF jmpbuf[1] = {0}; int skip = 0; - struct __jmp_buf_tag *old_jmpbuf = emu->jmpbuf; + JUMPBUFF *old_jmpbuf = emu->jmpbuf; emu->flags.jmpbuf_ready = 0; while(!(emu->quit)) { if(!emu->jmpbuf || (emu->flags.need_jmpbuf && emu->jmpbuf!=jmpbuf)) { emu->jmpbuf = jmpbuf; emu->flags.jmpbuf_ready = 1; - if((skip=sigsetjmp(emu->jmpbuf, 1))) { + #ifdef ANDROID + if((skip=sigsetjmp(*(JUMPBUFF*)emu->jmpbuf, 1))) + #else + if((skip=sigsetjmp(emu->jmpbuf, 1))) + #endif + { printf_log(LOG_DEBUG, "Setjmp DynaRun, fs=0x%x\n", emu->segs[_FS]); #ifdef DYNAREC if(box64_dynarec_test) { |