about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c2
-rw-r--r--src/dynarec/dynarec.c1
-rw-r--r--src/dynarec/dynarec_native_functions.c29
-rw-r--r--src/dynarec/dynarec_native_functions.h3
-rw-r--r--src/dynarec/dynarec_native_pass.c1
-rw-r--r--src/dynarec/la64/dynarec_la64_00.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_3.c2
-rw-r--r--src/elfs/elfloader.c3
-rw-r--r--src/elfs/elfloader32.c1
-rw-r--r--src/include/bridge.h5
-rw-r--r--src/include/dynarec.h5
-rw-r--r--src/include/elfloader.h3
-rw-r--r--src/include/x64run.h8
-rw-r--r--src/include/x64test.h7
-rw-r--r--src/tools/bridge.c28
15 files changed, 51 insertions, 49 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 7c52edd0..3732bee4 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -3309,7 +3309,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 #endif
             }
             #if STEP < 2
-            if(!rex.is32bits && isNativeCall(dyn, addr+i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn))
+            if (!rex.is32bits && isNativeCall(addr + i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn))
                 tmp = dyn->insts[ninst].pass2choice = 3;
             else
                 tmp = dyn->insts[ninst].pass2choice = i32?0:1;
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c
index 44fb4247..1dca02a4 100644
--- a/src/dynarec/dynarec.c
+++ b/src/dynarec/dynarec.c
@@ -20,6 +20,7 @@
 #include "bridge.h"
 #include "dynarec_next.h"
 #include "custommem.h"
+#include "x64test.h"
 #endif
 #ifdef HAVE_TRACE
 #include "elfloader.h"
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c
index c9a116e6..46e95190 100644
--- a/src/dynarec/dynarec_native_functions.c
+++ b/src/dynarec/dynarec_native_functions.c
@@ -619,35 +619,6 @@ uint8_t geted_ib(dynarec_native_t* dyn, uintptr_t addr, int ninst, uint8_t nexto
 }
 #undef F8
 
-int isNativeCall(dynarec_native_t* dyn, uintptr_t addr, int is32bits, uintptr_t* calladdress, uint16_t* retn)
-{
-    (void)dyn;
-    if(is32bits)
-        addr &= 0xFFFFFFFFLL;
-
-#define PK(a)       *(uint8_t*)(addr+a)
-#define PK32(a)     *(int32_t*)(addr+a)
-
-    if(!addr || !getProtection(addr))
-        return 0;
-    if(PK(0)==0xff && PK(1)==0x25) {            // "absolute" jump, maybe the GOT (well, RIP relative in fact)
-        uintptr_t a1 = addr + 6 + (PK32(2));    // need to add a check to see if the address is from the GOT !
-        addr = (uintptr_t)getAlternate(*(void**)a1);
-    }
-    if(!addr || !getProtection(addr))
-        return 0;
-    onebridge_t *b = (onebridge_t*)(addr);
-    if(b->CC==0xCC && b->S=='S' && b->C=='C' && b->w!=(wrapper_t)0 && b->f!=(uintptr_t)PltResolver64) {
-        // found !
-        if(retn) *retn = (b->C3==0xC2)?b->N:0;
-        if(calladdress) *calladdress = addr+1;
-        return 1;
-    }
-    return 0;
-#undef PK32
-#undef PK
-}
-
 // AVX
 void avx_mark_zero(dynarec_native_t* dyn, int ninst, int reg)
 {
diff --git a/src/dynarec/dynarec_native_functions.h b/src/dynarec/dynarec_native_functions.h
index ad8226e6..3620fca7 100644
--- a/src/dynarec/dynarec_native_functions.h
+++ b/src/dynarec/dynarec_native_functions.h
@@ -74,9 +74,6 @@ uintptr_t fakeed(dynarec_native_t* dyn, uintptr_t addr, int ninst, uint8_t nexto
 // return Ib on a mod/rm opcode without emitting anything
 uint8_t geted_ib(dynarec_native_t* dyn, uintptr_t addr, int ninst, uint8_t nextop);
 
-// Is what pointed at addr a native call? And if yes, to what function?
-int isNativeCall(dynarec_native_t* dyn, uintptr_t addr, int is32bits, uintptr_t* calladdress, uint16_t* retn);
-
 // AVX utilities
 void avx_mark_zero(dynarec_native_t* dyn, int ninst, int reg);
 int is_avx_zero(dynarec_native_t* dyn, int ninst, int reg);
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index ba9bf9da..d6774146 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -18,6 +18,7 @@
 #include "dynarec_native.h"
 #include "custommem.h"
 #include "elfloader.h"
+#include "x64test.h"
 
 #include "dynarec_arch.h"
 #include "dynarec_helper.h"
diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c
index eabb0ac1..4e91e23a 100644
--- a/src/dynarec/la64/dynarec_la64_00.c
+++ b/src/dynarec/la64/dynarec_la64_00.c
@@ -2330,7 +2330,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
 #endif
             }
 #if STEP < 2
-            if (!rex.is32bits && isNativeCall(dyn, addr + i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn))
+            if (!rex.is32bits && isNativeCall(addr + i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn))
                 tmp = dyn->insts[ninst].pass2choice = 3;
             else
                 tmp = dyn->insts[ninst].pass2choice = 0;
diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c
index f814a75a..9b1f6660 100644
--- a/src/dynarec/rv64/dynarec_rv64_00_3.c
+++ b/src/dynarec/rv64/dynarec_rv64_00_3.c
@@ -959,7 +959,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
 #endif
             }
 #if STEP < 2
-            if (!rex.is32bits && isNativeCall(dyn, addr + i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn))
+            if (!rex.is32bits && isNativeCall(addr + i32, rex.is32bits, &dyn->insts[ninst].natcall, &dyn->insts[ninst].retn))
                 tmp = dyn->insts[ninst].pass2choice = 3;
             else
                 tmp = dyn->insts[ninst].pass2choice = i32 ? 0 : 1;
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index b9d1b297..cf00843e 100644
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -45,6 +45,8 @@ void* my__IO_2_1_stderr_ = (void*)1;
 void* my__IO_2_1_stdin_  = (void*)2;
 void* my__IO_2_1_stdout_ = (void*)3;
 
+uintptr_t pltResolver64 = ~0LL;
+
 // return the index of header (-1 if it doesn't exist)
 static int getElfIndex(box64context_t* ctx, elfheader_t* head) {
     for (int i=0; i<ctx->elfsize; ++i)
@@ -1840,7 +1842,6 @@ void* GetNativeSymbolUnversioned(void* lib, const char* name)
     return s.addr;
 }
 
-uintptr_t pltResolver64 = ~0LL;
 EXPORT void PltResolver64(x64emu_t* emu)
 {
     uintptr_t addr = Pop64(emu);
diff --git a/src/elfs/elfloader32.c b/src/elfs/elfloader32.c
index 9c5e756d..4352cfd0 100644
--- a/src/elfs/elfloader32.c
+++ b/src/elfs/elfloader32.c
@@ -21,7 +21,6 @@
 #include "elfload_dump.h"
 #include "elfloader_private.h"
 #include "librarian.h"
-#include "x64run.h"
 #include "bridge.h"
 #include "wrapper.h"
 #include "box64context.h"
diff --git a/src/include/bridge.h b/src/include/bridge.h
index 6202707d..e87e5d45 100644
--- a/src/include/bridge.h
+++ b/src/include/bridge.h
@@ -30,4 +30,7 @@ const char* getBridgeName(void* addr);
 void init_bridge_helper(void);
 void fini_bridge_helper(void);
 
-#endif //__BRIDGE_H_
\ No newline at end of file
+// Is what pointed at addr a native call? And if yes, to what function?
+int isNativeCall(uintptr_t addr, int is32bits, uintptr_t* calladdress, uint16_t* retn);
+
+#endif //__BRIDGE_H_
diff --git a/src/include/dynarec.h b/src/include/dynarec.h
index baebd72d..39360841 100644
--- a/src/include/dynarec.h
+++ b/src/include/dynarec.h
@@ -5,7 +5,4 @@ typedef struct x64emu_s x64emu_t;
 
 void DynaCall(x64emu_t* emu, uintptr_t addr); // try to use DynaRec... Fallback to EmuCall if no dynarec available
 
-void x64test_step(x64emu_t* ref, uintptr_t ip);
-void x64test_check(x64emu_t* ref, uintptr_t ip);
-
-#endif // __DYNAREC_H_
\ No newline at end of file
+#endif // __DYNAREC_H_
diff --git a/src/include/elfloader.h b/src/include/elfloader.h
index 969cb95b..4184788f 100644
--- a/src/include/elfloader.h
+++ b/src/include/elfloader.h
@@ -96,4 +96,7 @@ void* GetNativeSymbolUnversioned(void* lib, const char* name);
 
 void AddMainElfToLinkmap(elfheader_t* lib);
 
+void PltResolver32(x64emu_t* emu);
+void PltResolver64(x64emu_t* emu);
+
 #endif //__ELF_LOADER_H_
diff --git a/src/include/x64run.h b/src/include/x64run.h
index 9eed07c0..823a990c 100644
--- a/src/include/x64run.h
+++ b/src/include/x64run.h
@@ -8,12 +8,6 @@ int Run(x64emu_t *emu, int step); // 0 if run was successfull, 1 if error in x86
 int RunTest(x64test_t *test);
 void DynaRun(x64emu_t *emu);
 
-uint32_t LibSyscall(x64emu_t *emu);
-void PltResolver64(x64emu_t* emu);
-#ifdef BOX32
-void PltResolver32(x64emu_t* emu);
-#endif
-extern uintptr_t pltResolver64;
 int GetTID(void);
 
-#endif //__X64RUN_H_
\ No newline at end of file
+#endif //__X64RUN_H_
diff --git a/src/include/x64test.h b/src/include/x64test.h
new file mode 100644
index 00000000..48e2a935
--- /dev/null
+++ b/src/include/x64test.h
@@ -0,0 +1,7 @@
+#ifndef __X64TEST_H_
+#define __X64TEST_H_
+
+void x64test_step(x64emu_t* ref, uintptr_t ip);
+void x64test_check(x64emu_t* ref, uintptr_t ip);
+
+#endif // __X64TEST_H_
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index 7c697b22..3bc46713 100644
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -300,3 +300,31 @@ void fini_bridge_helper()
 {
     cleanAlternate();
 }
+
+int isNativeCall(uintptr_t addr, int is32bits, uintptr_t* calladdress, uint16_t* retn)
+{
+    if (is32bits)
+        addr &= 0xFFFFFFFFLL;
+
+#define PK(a)   *(uint8_t*)(addr + a)
+#define PK32(a) *(int32_t*)(addr + a)
+
+    if (!addr || !getProtection(addr))
+        return 0;
+    if (PK(0) == 0xff && PK(1) == 0x25) {    // "absolute" jump, maybe the GOT (well, RIP relative in fact)
+        uintptr_t a1 = addr + 6 + (PK32(2)); // need to add a check to see if the address is from the GOT !
+        addr = (uintptr_t)getAlternate(*(void**)a1);
+    }
+    if (!addr || !getProtection(addr))
+        return 0;
+    onebridge_t* b = (onebridge_t*)(addr);
+    if (b->CC == 0xCC && b->S == 'S' && b->C == 'C' && b->w != (wrapper_t)0 && b->f != (uintptr_t)PltResolver64) {
+        // found !
+        if (retn) *retn = (b->C3 == 0xC2) ? b->N : 0;
+        if (calladdress) *calladdress = addr + 1;
+        return 1;
+    }
+    return 0;
+#undef PK32
+#undef PK
+}