From 3820ce5755474cce51dd6d75976708fe243e3694 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Wed, 2 Apr 2025 02:59:02 +0800 Subject: [PATCH] Moved more OS-dependent functions to os.h --- src/box64context.c | 1 + src/custommem.c | 1 + src/dynarec/dynablock.c | 20 +++++------------ src/dynarec/dynarec.c | 5 ++--- src/emu/x64emu_private.h | 8 +------ src/emu/x64run_private.c | 1 + src/emu/x64tls.c | 1 + src/include/box64context.h | 10 --------- src/include/os.h | 46 ++++++++++++++++++++++++++++++++++++++ src/os/os_linux.c | 10 ++++++++- src/tools/bridge.c | 3 ++- 11 files changed, 69 insertions(+), 37 deletions(-) diff --git a/src/box64context.c b/src/box64context.c index 651c2ca109..f08cd9db9a 100644 --- a/src/box64context.c +++ b/src/box64context.c @@ -7,6 +7,7 @@ #include #include +#include "os.h" #include "box64context.h" #include "debug.h" #include "elfloader.h" diff --git a/src/custommem.c b/src/custommem.c index 6b1eb6e96a..a35aab5704 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -9,6 +9,7 @@ #include #include +#include "os.h" #include "box64context.h" #include "elfloader.h" #include "debug.h" diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index 109edf5c6c..02d10bddba 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -1,8 +1,6 @@ #include #include #include -#include -#include #include "os.h" #include "debug.h" @@ -183,17 +181,11 @@ dynablock_t *AddNewDynablock(uintptr_t addr) return block; } -//TODO: move this to dynrec_arm.c and track allocated structure to avoid memory leak -static __thread JUMPBUFF dynarec_jmpbuf; -#ifdef ANDROID -#define DYN_JMPBUF dynarec_jmpbuf -#else -#define DYN_JMPBUF &dynarec_jmpbuf -#endif +NEW_JUMPBUFF(dynarec_jmpbuf); void cancelFillBlock() { - longjmp(DYN_JMPBUF, 1); + LongJmp(GET_JUMPBUFF(dynarec_jmpbuf), 1); } /* @@ -236,7 +228,7 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t // fill the block block->x64_addr = (void*)addr; - if(sigsetjmp(DYN_JMPBUF, 1)) { + if (SigSetJmp(GET_JUMPBUFF(dynarec_jmpbuf), 1)) { printf_log(LOG_INFO, "FillBlock at %p triggered a segfault, canceling\n", (void*)addr); FreeDynablock(block, 0); if(need_lock) @@ -281,8 +273,7 @@ dynablock_t* DBGetBlock(x64emu_t* emu, uintptr_t addr, int create, int is32bits) return NULL; dynablock_t *db = internalDBGetBlock(emu, addr, addr, create, 1, is32bits); if(db && db->done && db->block && getNeedTest(addr)) { - if(db->always_test) - sched_yield(); // just calm down... + if (db->always_test) SchedYield(); // just calm down... uint32_t hash = X31_hash_code(db->x64_addr, db->x64_size); int need_lock = mutex_trylock(&my_context->mutex_dyndump); if(hash!=db->hash) { @@ -319,8 +310,7 @@ dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, int create = 1; dynablock_t *db = internalDBGetBlock(emu, addr, filladdr, create, 1, is32bits); if(db && db->done && db->block && getNeedTest(filladdr)) { - if(db->always_test) - sched_yield(); // just calm down... + if (db->always_test) SchedYield(); // just calm down... int need_lock = mutex_trylock(&my_context->mutex_dyndump); uint32_t hash = X31_hash_code(db->x64_addr, db->x64_size); if(hash!=db->hash) { diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index 0bcf945182..3f0022c0fd 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -1,7 +1,6 @@ #include #include #include -#include #include "os.h" #include "debug.h" @@ -168,9 +167,9 @@ void DynaRun(x64emu_t* emu) #endif emu->flags.jmpbuf_ready = 1; #ifdef ANDROID - if((skip=sigsetjmp(*(JUMPBUFF*)emu->jmpbuf, 1))) + if ((skip = SigSetJmp(*(JUMPBUFF*)emu->jmpbuf, 1))) #else - if((skip=sigsetjmp(emu->jmpbuf, 1))) + if ((skip = SigSetJmp(emu->jmpbuf, 1))) #endif { printf_log(LOG_DEBUG, "Setjmp DynaRun, fs=0x%x\n", emu->segs[_FS]); diff --git a/src/emu/x64emu_private.h b/src/emu/x64emu_private.h index a9d73937ff..21f270f1c4 100644 --- a/src/emu/x64emu_private.h +++ b/src/emu/x64emu_private.h @@ -2,6 +2,7 @@ #define __X86EMU_PRIVATE_H_ #include "regs.h" +#include "os.h" typedef struct box64context_s box64context_t; typedef struct x64_ucontext_s x64_ucontext_t; @@ -51,13 +52,6 @@ typedef struct emu_flags_s { uint32_t jmpbuf_ready:1; // the jmpbuf in the emu is ok and don't need refresh } emu_flags_t; -#ifdef ANDROID -#include -#define JUMPBUFF sigjmp_buf -#else -#define JUMPBUFF struct __jmp_buf_tag -#endif - #define N_SCRATCH 200 typedef struct x64emu_s { diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 4f3d5b4c6d..ec3fab7211 100644 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -9,6 +9,7 @@ #include #endif +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" diff --git a/src/emu/x64tls.c b/src/emu/x64tls.c index 4902177e60..79a8ae5bbd 100644 --- a/src/emu/x64tls.c +++ b/src/emu/x64tls.c @@ -5,6 +5,7 @@ #include #include +#include "os.h" #include "debug.h" #include "box64context.h" #include "x64emu.h" diff --git a/src/include/box64context.h b/src/include/box64context.h index 2d554703c1..718d95b345 100644 --- a/src/include/box64context.h +++ b/src/include/box64context.h @@ -240,16 +240,6 @@ typedef struct box64context_s { } box64context_t; -#ifndef USE_CUSTOM_MUTEX -#define mutex_lock(A) pthread_mutex_lock(A) -#define mutex_trylock(A) pthread_mutex_trylock(A) -#define mutex_unlock(A) pthread_mutex_unlock(A) -#else -#define mutex_lock(A) {uint32_t tid = (uint32_t)GetTID(); while(native_lock_storeifnull_d(A, tid)) sched_yield();} -#define mutex_trylock(A) native_lock_storeifnull_d(A, (uint32_t)GetTID()) -#define mutex_unlock(A) native_lock_storeifref_d(A, 0, (uint32_t)GetTID()) -#endif - extern box64context_t *my_context; // global context box64context_t *NewBox64Context(int argc); diff --git a/src/include/os.h b/src/include/os.h index 1387255bef..819975bb94 100644 --- a/src/include/os.h +++ b/src/include/os.h @@ -2,5 +2,51 @@ #define __OS_H_ int GetTID(void); +int SchedYield(void); + +#ifndef _WIN32 +#include +#define LongJmp longjmp +#define SigSetJmp sigsetjmp +#else +#define LongJmp(a, b) +#define SigSetJmp(a, b) 0 +#endif + +#ifndef USE_CUSTOM_MUTEX +#define mutex_lock(A) pthread_mutex_lock(A) +#define mutex_trylock(A) pthread_mutex_trylock(A) +#define mutex_unlock(A) pthread_mutex_unlock(A) +#else +#define mutex_lock(A) \ + do { \ + uint32_t tid = (uint32_t)GetTID(); \ + while (native_lock_storeifnull_d(A, tid)) \ + sched_yield(); \ + } while (0) +#define mutex_trylock(A) native_lock_storeifnull_d(A, (uint32_t)GetTID()) +#define mutex_unlock(A) native_lock_storeifref_d(A, 0, (uint32_t)GetTID()) +#endif + +#ifndef _WIN32 +#include +#define NEW_JUMPBUFF(name) \ + static __thread JUMPBUFF name +#ifdef ANDROID +#define JUMPBUFF sigjmp_buf +#define GET_JUMPBUFF(name) name +#else +#define JUMPBUFF struct __jmp_buf_tag +#define GET_JUMPBUFF(name) &name +#endif +#else +#define JUMPBUFF int +#define NEW_JUMPBUFF(name) +#define GET_JUMPBUFF(name) NULL +#endif + +#define PROT_READ 0x1 +#define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 #endif //__OS_H_ diff --git a/src/os/os_linux.c b/src/os/os_linux.c index bfa6d6c4ad..e4b5b1939c 100644 --- a/src/os/os_linux.c +++ b/src/os/os_linux.c @@ -1,7 +1,15 @@ #include +#include #include -int GetTID() +#include "os.h" + +int GetTID(void) { return syscall(SYS_gettid); } + +int SchedYield(void) +{ + return sched_yield(); +} diff --git a/src/tools/bridge.c b/src/tools/bridge.c index 3bc467130e..73ea5a7b21 100644 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -7,7 +7,8 @@ #include #include -#include +#include "os.h" +#include "wrappedlibs.h" #include "custommem.h" #include "bridge.h" #include "bridge_private.h"