diff options
Diffstat (limited to 'src/emu')
| -rw-r--r-- | src/emu/x64emu_private.h | 9 | ||||
| -rw-r--r-- | src/emu/x64run_private.c | 21 |
2 files changed, 29 insertions, 1 deletions
diff --git a/src/emu/x64emu_private.h b/src/emu/x64emu_private.h index 8076049d..25601105 100644 --- a/src/emu/x64emu_private.h +++ b/src/emu/x64emu_private.h @@ -44,6 +44,13 @@ 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 + typedef struct x64emu_s { // cpu reg64_t regs[16]; @@ -104,7 +111,7 @@ typedef struct x64emu_s { void* stack2free; // this is the stack to free (can be NULL) void* init_stack; // initial stack (owned or not) uint32_t size_stack; // stack size (owned or not) - struct __jmp_buf_tag *jmpbuf; + JUMPBUFF* jmpbuf; x64_ucontext_t *uc_link; // to handle setcontext diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index ffddd73a..5056ff90 100644 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -28,6 +28,26 @@ #define PARITY(x) (((emu->x64emu_parity_tab[(x) / 32] >> ((x) % 32)) & 1) == 0) #define XOR2(x) (((x) ^ ((x)>>1)) & 0x1) +#ifdef ANDROID +void EXPORT my___libc_init(x64emu_t* emu, void* raw_args __unused, void (*onexit)(void) __unused, int (*main)(int, char**, char**), void const * const structors __unused) +{ + //TODO: register fini + // let's cheat and set all args... + SetRDX(emu, (uintptr_t)my_context->envv); + SetRSI(emu, (uintptr_t)my_context->argv); + SetRDI(emu, (uintptr_t)my_context->argc); + + printf_log(LOG_DEBUG, "Transfert to main(%d, %p, %p)=>%p from __libc_init\n", my_context->argc, my_context->argv, my_context->envv, main); + // should call structors->preinit_array and structors->init_array! + // call main and finish + PushExit(emu); + R_RIP=(uintptr_t)main; + + DynaRun(emu); + + emu->quit = 1; // finished! +} +#else int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, char * *), int argc, char * * ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end)) { (void)argc; (void)ubp_av; (void)fini; (void)rtld_fini; (void)stack_end; @@ -80,6 +100,7 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c } return (int)GetEAX(emu); } +#endif const char* GetNativeName(void* p) { |