diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-02 03:12:15 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-01 21:12:15 +0200 |
| commit | b68d46311dba9c410ed5a9339d396486958d1e5b (patch) | |
| tree | 7ca6fde3ea581df1f705b927a06a21da132c90b0 /src | |
| parent | 2c7a2082e624a78e42199d90f7d9fa90473c26c2 (diff) | |
| download | box64-b68d46311dba9c410ed5a9339d396486958d1e5b.tar.gz box64-b68d46311dba9c410ed5a9339d396486958d1e5b.zip | |
Moved more OS-dependent functions to os.h (#2491)
Diffstat (limited to 'src')
| -rw-r--r-- | src/box64context.c | 1 | ||||
| -rw-r--r-- | src/custommem.c | 1 | ||||
| -rw-r--r-- | src/dynarec/dynablock.c | 20 | ||||
| -rw-r--r-- | src/dynarec/dynarec.c | 5 | ||||
| -rw-r--r-- | src/emu/x64emu_private.h | 8 | ||||
| -rw-r--r-- | src/emu/x64run_private.c | 1 | ||||
| -rw-r--r-- | src/emu/x64tls.c | 1 | ||||
| -rw-r--r-- | src/include/box64context.h | 10 | ||||
| -rw-r--r-- | src/include/os.h | 46 | ||||
| -rw-r--r-- | src/os/os_linux.c | 10 | ||||
| -rw-r--r-- | src/tools/bridge.c | 3 |
11 files changed, 69 insertions, 37 deletions
diff --git a/src/box64context.c b/src/box64context.c index bf9ccd69..2235fd57 100644 --- a/src/box64context.c +++ b/src/box64context.c @@ -7,6 +7,7 @@ #include <sys/mman.h> #include <pthread.h> +#include "os.h" #include "box64context.h" #include "debug.h" #include "elfloader.h" diff --git a/src/custommem.c b/src/custommem.c index 6b1eb6e9..a35aab57 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -9,6 +9,7 @@ #include <syscall.h> #include <sys/personality.h> +#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 1d0498f8..3e7707a6 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -1,8 +1,6 @@ #include <stdio.h> #include <stdlib.h> #include <errno.h> -#include <setjmp.h> -#include <sys/mman.h> #include "os.h" #include "debug.h" @@ -182,17 +180,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); } /* @@ -235,7 +227,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) @@ -280,8 +272,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) { @@ -318,8 +309,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 eca8087f..8cb8b3de 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -1,7 +1,6 @@ #include <stdio.h> #include <stdlib.h> #include <errno.h> -#include <setjmp.h> #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 a9d73937..21f270f1 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 <setjmp.h> -#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 9d520e59..05d01966 100644 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -9,6 +9,7 @@ #include <sys/syscall.h> #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 4902177e..79a8ae5b 100644 --- a/src/emu/x64tls.c +++ b/src/emu/x64tls.c @@ -5,6 +5,7 @@ #include <stdio.h> #include <stdlib.h> +#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 2d554703..718d95b3 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 1387255b..819975bb 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 <setjmp.h> +#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 <setjmp.h> +#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 bfa6d6c4..e4b5b193 100644 --- a/src/os/os_linux.c +++ b/src/os/os_linux.c @@ -1,7 +1,15 @@ #include <sys/syscall.h> +#include <sched.h> #include <unistd.h> -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 3bc46713..73ea5a7b 100644 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -7,7 +7,8 @@ #include <sys/mman.h> #include <errno.h> -#include <wrappedlibs.h> +#include "os.h" +#include "wrappedlibs.h" #include "custommem.h" #include "bridge.h" #include "bridge_private.h" |