diff options
Diffstat (limited to 'src')
29 files changed, 105 insertions, 106 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 0a22ac90..24f127f5 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -19,7 +19,7 @@ #include "../dynablock_private.h" #include "custommem.h" #include "alternate.h" - +#include "mysignal.h" #include "arm64_printer.h" #include "dynarec_arm64_private.h" #include "dynarec_arm64_functions.h" diff --git a/src/dynarec/arm64/dynarec_arm64_arch.c b/src/dynarec/arm64/dynarec_arm64_arch.c index 3ff8d073..0df40b2b 100644 --- a/src/dynarec/arm64/dynarec_arm64_arch.c +++ b/src/dynarec/arm64/dynarec_arm64_arch.c @@ -1,7 +1,6 @@ #include <stddef.h> #include <stdio.h> #include <signal.h> -#include <ucontext.h> #include <string.h> #include "debug.h" @@ -155,7 +154,7 @@ static int arch_build(dynarec_arm_t* dyn, int ninst, arch_build_t* arch) arch->x87 = 1; arch->x87_.delta = dyn->insts[ninst].n.x87stack; } - // opcode can handle unaligned + // opcode can handle unaligned arch->unaligned = dyn->insts[ninst].unaligned; return arch->flags + arch->x87 + arch->mmx + arch->sse + arch->ymm + arch->unaligned; } @@ -251,8 +250,6 @@ void* populate_arch(dynarec_arm_t* dyn, void* p, size_t tot_sz) return p; } -int getX64AddressInst(dynablock_t* db, uintptr_t x64pc); // define is signal.c - // NZCV N #define NZCV_N 31 // NZCV Z diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index 9a514ad1..cdfcb645 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -18,7 +18,6 @@ #include "emu/x64run_private.h" #include "emu/x87emu_private.h" #include "x64trace.h" -#include "signals.h" #include "dynarec_native.h" #include "dynarec_arm64_private.h" #include "dynarec_arm64_functions.h" @@ -1046,7 +1045,7 @@ static uint8_t getNativeFlagsUsed(dynarec_arm_t* dyn, int start, uint8_t flags) return 0; // update used flags //used_flags |= (flag2native(dyn->insts[ninst].x64.need_after)&flags); - + // go next if(!dyn->insts[ninst].x64.has_next) { // check if it's a jump to an opcode with only 1 preds, then just follow the jump @@ -1152,7 +1151,7 @@ int nativeFlagsNeedsTransform(dynarec_arm_t* dyn, int ninst) flags_x86 &= ~flags_after; if((flags_before&NF_CF) && (flags_after&NF_CF) && (nc_before!=nc_after)) return 1; - // all flags_after should be present and none remaining flags_x86 + // all flags_after should be present and none remaining flags_x86 if(((flags_before&flags_after)!=flags_after) || (flags_before&flags_x86)) return 1; return 0; diff --git a/src/dynarec/arm64/dynarec_arm64_pass3.h b/src/dynarec/arm64/dynarec_arm64_pass3.h index a0d79f30..3f5d3900 100644 --- a/src/dynarec/arm64/dynarec_arm64_pass3.h +++ b/src/dynarec/arm64/dynarec_arm64_pass3.h @@ -1,4 +1,4 @@ -#define INIT +#define INIT #define FINI \ if(ninst) \ addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); \ @@ -12,14 +12,17 @@ dyn->insts[ninst].size2 += 4; \ }while(0) -#define MESSAGE(A, ...) if(BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__) +#define MESSAGE(A, ...) \ + do { \ + if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__); \ + } while (0) #define NEW_INST \ if(ninst) { \ if(dyn->insts[ninst].address!=(uintptr_t)dyn->block-(uintptr_t)dyn->native_start) dyn->abort = 1; \ addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); \ dyn->insts[ninst].ymm0_pass3 = dyn->ymm_zero; \ } -#define INST_EPILOG +#define INST_EPILOG #define INST_NAME(name) inst_name_pass3(dyn, ninst, name, rex) #define TABLE64(A, V) {int val64offset = Table64(dyn, (V), 3); MESSAGE(LOG_DUMP, " Table64: 0x%lx\n", (V)); LDRx_literal(A, val64offset);} #define FTABLE64(A, V) {mmx87_regs_t v = {.d = V}; int val64offset = Table64(dyn, v.q, 3); MESSAGE(LOG_DUMP, " FTable64: %g\n", v.d); VLDR64_literal(A, val64offset);} diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index 561ab529..9bc13ffe 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -368,3 +368,53 @@ dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, emu->test.test = 0; return db; } + +uintptr_t getX64Address(dynablock_t* db, uintptr_t native_addr) +{ + uintptr_t x64addr = (uintptr_t)db->x64_addr; + uintptr_t armaddr = (uintptr_t)db->block; + if (native_addr < (uintptr_t)db->block || native_addr > (uintptr_t)db->block + db->size) + return 0; + int i = 0; + do { + int x64sz = 0; + int armsz = 0; + do { + x64sz += db->instsize[i].x64; + armsz += db->instsize[i].nat * 4; + ++i; + } while ((db->instsize[i - 1].x64 == 15) || (db->instsize[i - 1].nat == 15)); + // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find + if ((native_addr >= armaddr) && (native_addr < (armaddr + armsz))) + return x64addr; + armaddr += armsz; + x64addr += x64sz; + } while (db->instsize[i].x64 || db->instsize[i].nat); + return x64addr; +} + +int getX64AddressInst(dynablock_t* db, uintptr_t x64pc) +{ + uintptr_t x64addr = (uintptr_t)db->x64_addr; + uintptr_t armaddr = (uintptr_t)db->block; + int ret = 0; + if (x64pc < (uintptr_t)db->x64_addr || x64pc > (uintptr_t)db->x64_addr + db->x64_size) + return -1; + int i = 0; + do { + int x64sz = 0; + int armsz = 0; + do { + x64sz += db->instsize[i].x64; + armsz += db->instsize[i].nat * 4; + ++i; + } while ((db->instsize[i - 1].x64 == 15) || (db->instsize[i - 1].nat == 15)); + // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find + if ((x64pc >= x64addr) && (x64pc < (x64addr + x64sz))) + return ret; + armaddr += armsz; + x64addr += x64sz; + ret++; + } while (db->instsize[i].x64 || db->instsize[i].nat); + return ret; +} \ No newline at end of file diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index 8c246f70..2356f451 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -28,8 +28,6 @@ #endif #ifdef DYNAREC -uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr); - void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2, uintptr_t* x3) { int is32bits = (R_CS == 0x23); diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 99cb2449..be9c5fe9 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -4,6 +4,7 @@ #include <errno.h> #include <string.h> +#include "os.h" #include "debug.h" #include "box64context.h" #include "box64cpu.h" @@ -16,7 +17,6 @@ #include "dynarec_native.h" #include "dynablock_private.h" #include "custommem.h" -#include "elfloader.h" #include "x64test.h" #include "dynarec_arch.h" @@ -57,7 +57,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int ARCH_INIT(); int reset_n = -1; // -1 no reset; -2 reset to 0; else reset to the state of reset_n dyn->last_ip = (alternate || (dyn->insts && dyn->insts[0].pred_sz))?0:ip; // RIP is always set at start of block unless there is a predecessor! - int stopblock = 2 + ((FindElfAddress(my_context, addr) || IsAddrFileMapped(addr, NULL, NULL)) ? 0 : 1); // if block is in elf memory or file mapped memory, it can be extended with BOX64DRENV(dynarec_bigblock)==2, else it needs 3 + int stopblock = 2 + !IsAddrElfOrFileMapped(addr); // if block is in elf memory or file mapped memory, it can be extended with BOX64DRENV(dynarec_bigblock)==2, else it needs 3 // ok, go now INIT; #if STEP == 0 diff --git a/src/dynarec/la64/dynarec_la64_pass3.h b/src/dynarec/la64/dynarec_la64_pass3.h index 4fe3d247..900e95d3 100644 --- a/src/dynarec/la64/dynarec_la64_pass3.h +++ b/src/dynarec/la64/dynarec_la64_pass3.h @@ -13,8 +13,10 @@ dyn->insts[ninst].size2 += 4; \ } while (0) -#define MESSAGE(A, ...) \ - if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__) +#define MESSAGE(A, ...) \ + do { \ + if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__); \ + } while (0) #define NEW_INST \ if (ninst) { \ addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst - 1].x64.size, dyn->insts[ninst - 1].size / 4); \ diff --git a/src/dynarec/rv64/dynarec_rv64_arch.c b/src/dynarec/rv64/dynarec_rv64_arch.c index e9065657..1bd30759 100644 --- a/src/dynarec/rv64/dynarec_rv64_arch.c +++ b/src/dynarec/rv64/dynarec_rv64_arch.c @@ -83,7 +83,7 @@ static int arch_build(dynarec_rv64_t* dyn, int ninst, arch_build_t* arch) { memset(arch, 0, sizeof(arch_build_t)); // todo - // opcode can handle unaligned + // opcode can handle unaligned arch->unaligned = dyn->insts[ninst].unaligned; return arch->flags + arch->x87 + arch->mmx + arch->sse + arch->ymm + arch->unaligned; } @@ -168,8 +168,6 @@ void* populate_arch(dynarec_rv64_t* dyn, void* p, size_t sz) return p; } -int getX64AddressInst(dynablock_t* db, uintptr_t x64pc); // define is signal.c - void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc) { if(!db->arch_size || !db->arch) diff --git a/src/dynarec/rv64/dynarec_rv64_pass3.h b/src/dynarec/rv64/dynarec_rv64_pass3.h index 5176c5c4..b5deb451 100644 --- a/src/dynarec/rv64/dynarec_rv64_pass3.h +++ b/src/dynarec/rv64/dynarec_rv64_pass3.h @@ -12,8 +12,10 @@ dyn->insts[ninst].size2 += 4; \ } while (0) -#define MESSAGE(A, ...) \ - if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__) +#define MESSAGE(A, ...) \ + do { \ + if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__); \ + } while (0) #define NEW_INST \ dyn->vector_sew = dyn->insts[ninst].vector_sew_entry; \ dyn->inst_sew = dyn->vector_sew; \ diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 4e75641d..40768f27 100644 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -21,6 +21,7 @@ #include "box64context.h" #include "alternate.h" #include "emit_signals.h" +#include "mysignal.h" #ifdef DYNAREC #include "../dynarec/native_lock.h" #endif @@ -1375,7 +1376,7 @@ x64emurun: if(rex.is32bits && !(MODREG)) { GETED(0); GETGD; - emu->segs[_ES] = *(__uint16_t*)(((char*)ED)+4); + emu->segs[_ES] = *(uint16_t*)(((char*)ED) + 4); emu->segs_serial[_ES] = 0; GD->dword[0] = *(uint32_t*)ED; } else { @@ -1410,7 +1411,7 @@ x64emurun: if(rex.is32bits && !(MODREG)) { GETED(0); GETGD; - emu->segs[_DS] = *(__uint16_t*)(((char*)ED)+4); + emu->segs[_DS] = *(uint16_t*)(((char*)ED) + 4); emu->segs_serial[_DS] = 0; GD->dword[0] = *(uint32_t*)ED; } else { diff --git a/src/emu/x64run67avx.c b/src/emu/x64run67avx.c index de275c92..854ff614 100644 --- a/src/emu/x64run67avx.c +++ b/src/emu/x64run67avx.c @@ -20,7 +20,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #include "x64shaext.h" #ifdef DYNAREC #include "custommem.h" diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 36d72642..e3760cc0 100644 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -1,5 +1,4 @@ -#define _GNU_SOURCE /* See feature_test_macros(7) */ -#include <dlfcn.h> +#define _GNU_SOURCE /* See feature_test_macros(7) */ #include <stdint.h> #include <stdio.h> #include <stdlib.h> diff --git a/src/emu/x64runavx.c b/src/emu/x64runavx.c index 9651e924..6a39e5a9 100644 --- a/src/emu/x64runavx.c +++ b/src/emu/x64runavx.c @@ -20,7 +20,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #include "x64shaext.h" #ifdef DYNAREC #include "custommem.h" diff --git a/src/emu/x64runavx0f.c b/src/emu/x64runavx0f.c index 3da790c8..dc20399a 100644 --- a/src/emu/x64runavx0f.c +++ b/src/emu/x64runavx0f.c @@ -30,11 +30,6 @@ #include "modrm.h" -#ifdef __clang__ -extern int isinff(float); -extern int isnanf(float); -#endif - #ifdef TEST_INTERPRETER uintptr_t TestAVX_0F(x64test_t *test, vex_t vex, uintptr_t addr, int *step) #else @@ -149,7 +144,7 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GY->u128 = 0; break; case 0x16: - nextop = F8; + nextop = F8; GETEX(0); GETGX; GETVX; diff --git a/src/emu/x64runavxf20f.c b/src/emu/x64runavxf20f.c index 55da18dc..e5dd33ad 100644 --- a/src/emu/x64runavxf20f.c +++ b/src/emu/x64runavxf20f.c @@ -20,7 +20,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #include "x64shaext.h" #ifdef DYNAREC #include "custommem.h" diff --git a/src/emu/x64runavxf20f38.c b/src/emu/x64runavxf20f38.c index 276ccbfd..cf6d7286 100644 --- a/src/emu/x64runavxf20f38.c +++ b/src/emu/x64runavxf20f38.c @@ -20,7 +20,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #ifdef DYNAREC #include "custommem.h" #include "../dynarec/native_lock.h" diff --git a/src/emu/x64runavxf20f3a.c b/src/emu/x64runavxf20f3a.c index f9691fe4..22225d48 100644 --- a/src/emu/x64runavxf20f3a.c +++ b/src/emu/x64runavxf20f3a.c @@ -20,7 +20,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #ifdef DYNAREC #include "custommem.h" #include "../dynarec/native_lock.h" diff --git a/src/emu/x64runavxf30f.c b/src/emu/x64runavxf30f.c index 9b2ab7a7..6b630544 100644 --- a/src/emu/x64runavxf30f.c +++ b/src/emu/x64runavxf30f.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -20,7 +21,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #include "x64shaext.h" #ifdef DYNAREC #include "custommem.h" @@ -29,11 +29,6 @@ #include "modrm.h" -#ifdef __clang__ -extern int isinff(float); -extern int isnanf(float); -#endif - #ifdef TEST_INTERPRETER uintptr_t TestAVX_F30F(x64test_t *test, vex_t vex, uintptr_t addr, int *step) #else diff --git a/src/emu/x64runavxf30f38.c b/src/emu/x64runavxf30f38.c index 4dbdbbd5..975977d7 100644 --- a/src/emu/x64runavxf30f38.c +++ b/src/emu/x64runavxf30f38.c @@ -20,7 +20,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #ifdef DYNAREC #include "custommem.h" #include "../dynarec/native_lock.h" diff --git a/src/emu/x64runavxf30f3a.c b/src/emu/x64runavxf30f3a.c index 0100c3c8..9bd0b9f0 100644 --- a/src/emu/x64runavxf30f3a.c +++ b/src/emu/x64runavxf30f3a.c @@ -20,7 +20,6 @@ #include "box64context.h" #include "my_cpuid.h" #include "bridge.h" -#include "signals.h" #ifdef DYNAREC #include "custommem.h" #include "../dynarec/native_lock.h" diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c index f4d7d0a6..4eb5a539 100644 --- a/src/emu/x64runf30f.c +++ b/src/emu/x64runf30f.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -43,11 +44,6 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr) #endif int is_nan; - #ifdef __clang__ - extern int isinff(float); - extern int isnanf(float); - #endif - opcode = F8; switch(opcode) { @@ -75,7 +71,7 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr) GX->ud[1] = GX->ud[0] = EX->ud[0]; GX->ud[3] = GX->ud[2] = EX->ud[2]; break; - + case 0x16: /* MOVSHDUP Gx, Ex */ nextop = F8; GETEX(0); @@ -176,7 +172,7 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr) GD->dword[1] = 0; } break; - + case 0x38: /* MAP 0F38 */ opcode = F8; switch(opcode) { diff --git a/src/emu/x64trace.c b/src/emu/x64trace.c index e14f22df..fb8b205b 100644 --- a/src/emu/x64trace.c +++ b/src/emu/x64trace.c @@ -1,7 +1,6 @@ #include <string.h> #include <stdio.h> #include <stdlib.h> -#include <dlfcn.h> #include "debug.h" #include "x64trace.h" diff --git a/src/include/dynablock.h b/src/include/dynablock.h index b9aeddc0..551a223e 100644 --- a/src/include/dynablock.h +++ b/src/include/dynablock.h @@ -24,4 +24,7 @@ void cancelFillBlock(void); // clear instruction cache on a range void ClearCache(void* start, size_t len); +uintptr_t getX64Address(dynablock_t* db, uintptr_t native_addr); +int getX64AddressInst(dynablock_t* db, uintptr_t x64pc); + #endif //__DYNABLOCK_H_ \ No newline at end of file diff --git a/src/include/os.h b/src/include/os.h index f6e7371d..d4566305 100644 --- a/src/include/os.h +++ b/src/include/os.h @@ -9,7 +9,6 @@ #include <sys/mman.h> #else typedef __int64 ssize_t; - #define dlsym(a, b) NULL #define PROT_READ 0x1 @@ -49,6 +48,8 @@ void EmuInt3(void* emu, void* addr); void* EmuFork(void* emu, int forktype); void PersonalityAddrLimit32Bit(void); + +int IsAddrElfOrFileMapped(uintptr_t addr); // ---------------------------------------------------------------- #ifndef _WIN32 @@ -81,4 +82,12 @@ void PersonalityAddrLimit32Bit(void); #define PROT_WRITE 0x2 #define PROT_EXEC 0x4 +#if defined(__clang__) && !defined(_WIN32) +extern int isinff(float); +extern int isnanf(float); +#elif defined(_WIN32) +#define isnanf _isnanf +#define isinff isinf +#endif + #endif //__OS_H_ diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c index f19ecb17..56c844ab 100644 --- a/src/libtools/signal32.c +++ b/src/libtools/signal32.c @@ -306,10 +306,6 @@ typedef struct __attribute__((packed, aligned(4))) my_siginfo32_s } _sifields; } my_siginfo32_t; -#ifdef DYNAREC -uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr); -#endif - x64_stack_t* sigstack_getstack(); int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss); EXPORT int my32_sigaltstack(x64emu_t* emu, const i386_stack_t* ss, i386_stack_t* oss) diff --git a/src/libtools/signals.c b/src/libtools/signals.c index cacf19b5..b924a32f 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -484,54 +484,6 @@ EXPORT int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss } #ifdef DYNAREC -uintptr_t getX64Address(dynablock_t* db, uintptr_t native_addr) -{ - uintptr_t x64addr = (uintptr_t)db->x64_addr; - uintptr_t armaddr = (uintptr_t)db->block; - if(native_addr<(uintptr_t)db->block || native_addr>(uintptr_t)db->block+db->size) - return 0; - int i = 0; - do { - int x64sz = 0; - int armsz = 0; - do { - x64sz+=db->instsize[i].x64; - armsz+=db->instsize[i].nat*4; - ++i; - } while((db->instsize[i-1].x64==15) || (db->instsize[i-1].nat==15)); - // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find - if((native_addr>=armaddr) && (native_addr<(armaddr+armsz))) - return x64addr; - armaddr+=armsz; - x64addr+=x64sz; - } while(db->instsize[i].x64 || db->instsize[i].nat); - return x64addr; -} -int getX64AddressInst(dynablock_t* db, uintptr_t x64pc) -{ - uintptr_t x64addr = (uintptr_t)db->x64_addr; - uintptr_t armaddr = (uintptr_t)db->block; - int ret = 0; - if(x64pc<(uintptr_t)db->x64_addr || x64pc>(uintptr_t)db->x64_addr+db->x64_size) - return -1; - int i = 0; - do { - int x64sz = 0; - int armsz = 0; - do { - x64sz+=db->instsize[i].x64; - armsz+=db->instsize[i].nat*4; - ++i; - } while((db->instsize[i-1].x64==15) || (db->instsize[i-1].nat==15)); - // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find - if((x64pc>=x64addr) && (x64pc<(x64addr+x64sz))) - return ret; - armaddr+=armsz; - x64addr+=x64sz; - ret++; - } while(db->instsize[i].x64 || db->instsize[i].nat); - return ret; -} x64emu_t* getEmuSignal(x64emu_t* emu, ucontext_t* p, dynablock_t* db) { #if defined(ARM64) diff --git a/src/os/os_linux.c b/src/os/os_linux.c index daef3807..6d9db214 100644 --- a/src/os/os_linux.c +++ b/src/os/os_linux.c @@ -8,6 +8,8 @@ #include "signals.h" #include "emu/x64int_private.h" #include "bridge.h" +#include "elfloader.h" +#include "env.h" int GetTID(void) { @@ -54,6 +56,11 @@ void PersonalityAddrLimit32Bit(void) personality(ADDR_LIMIT_32BIT); } +int IsAddrElfOrFileMapped(uintptr_t addr) +{ + return FindElfAddress(my_context, addr) || IsAddrFileMapped(addr, NULL, NULL); +} + void* InternalMmap(void* addr, unsigned long length, int prot, int flags, int fd, ssize_t offset) { #if 1 // def STATICBUILD diff --git a/src/os/os_wine.c b/src/os/os_wine.c index baafc669..7e3c58fb 100644 --- a/src/os/os_wine.c +++ b/src/os/os_wine.c @@ -19,6 +19,11 @@ int IsBridgeSignature(char s, char c) void PersonalityAddrLimit32Bit(void) { } +int IsAddrElfOrFileMapped(uintptr_t addr) +{ + return 0; +} + ULONG_PTR default_zero_bits32 = 0x7fffffff; static uint32_t prot_unix_to_win32(uint32_t unx) |