diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec.c | 1 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 29 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.h | 3 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 1 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_00.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 2 | ||||
| -rw-r--r-- | src/elfs/elfloader.c | 3 | ||||
| -rw-r--r-- | src/elfs/elfloader32.c | 1 | ||||
| -rw-r--r-- | src/include/bridge.h | 5 | ||||
| -rw-r--r-- | src/include/dynarec.h | 5 | ||||
| -rw-r--r-- | src/include/elfloader.h | 3 | ||||
| -rw-r--r-- | src/include/x64run.h | 8 | ||||
| -rw-r--r-- | src/include/x64test.h | 7 | ||||
| -rw-r--r-- | src/tools/bridge.c | 28 |
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 +} |