about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/box64context.c1
-rw-r--r--src/custommem.c1
-rw-r--r--src/dynarec/dynablock.c20
-rw-r--r--src/dynarec/dynarec.c5
-rw-r--r--src/emu/x64emu_private.h8
-rw-r--r--src/emu/x64run_private.c1
-rw-r--r--src/emu/x64tls.c1
-rw-r--r--src/include/box64context.h10
-rw-r--r--src/include/os.h46
-rw-r--r--src/os/os_linux.c10
-rw-r--r--src/tools/bridge.c3
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"