From 2d37575f3d56931a9d20217fd508147f6601796b Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 2 Sep 2023 11:56:20 +0200 Subject: [ANDROID] Try to create an Android build, porting box86 Android build --- src/libtools/signals.c | 4 ++++ src/libtools/threads.c | 9 +++++++++ 2 files changed, 13 insertions(+) (limited to 'src/libtools') diff --git a/src/libtools/signals.c b/src/libtools/signals.c index b20c04f3..43d8f58c 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -13,7 +13,9 @@ #include #include #include +#ifndef ANDROID #include +#endif #include "box64context.h" #include "debug.h" @@ -1206,6 +1208,7 @@ exit(-1); } } print_cycle_log(log_minimum); +#ifndef ANDROID if((box64_showbt || sig==SIGABRT) && log_minimum<=box64_log) { // show native bt #define BT_BUF_SIZE 100 @@ -1274,6 +1277,7 @@ exit(-1); GO(RIP); #undef GO } +#endif if(log_minimum<=box64_log) { static const char* reg_name[] = {"RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI", " R8", " R9","R10","R11", "R12","R13","R14","R15"}; static const char* seg_name[] = {"ES", "CS", "SS", "DS", "FS", "GS"}; diff --git a/src/libtools/threads.c b/src/libtools/threads.c index 90c665e2..229102c4 100644 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -75,7 +75,9 @@ typedef struct x64_unwind_buff_s { typedef void(*vFv_t)(); KHASH_MAP_INIT_INT64(threadstack, threadstack_t*) +#ifndef ANDROID KHASH_MAP_INIT_INT64(cancelthread, __pthread_unwind_buf_t*) +#endif void CleanStackSize(box64context_t* context) { @@ -142,6 +144,8 @@ static void FreeCancelThread(box64context_t* context) if(!context) return; } + +#ifndef ANDROID static __pthread_unwind_buf_t* AddCancelThread(x64_unwind_buff_t* buff) { __pthread_unwind_buf_t* r = (__pthread_unwind_buf_t*)box_calloc(1, sizeof(__pthread_unwind_buf_t)); @@ -160,6 +164,7 @@ static void DelCancelThread(x64_unwind_buff_t* buff) box_free(r); buff->__pad[3] = NULL; } +#endif typedef struct emuthread_s { uintptr_t fnc; @@ -526,6 +531,7 @@ void* my_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** pet void my_longjmp(x64emu_t* emu, /*struct __jmp_buf_tag __env[1]*/void *p, int32_t __val); +#ifndef ANDROID #define CANCEL_MAX 8 static __thread x64emu_t* cancel_emu[CANCEL_MAX] = {0}; static __thread x64_unwind_buff_t* cancel_buff[CANCEL_MAX] = {0}; @@ -578,6 +584,7 @@ EXPORT void my___pthread_unwind_next(x64emu_t* emu, x64_unwind_buff_t* buff) // just in case it does return emu->quit = 1; } +#endif KHASH_MAP_INIT_INT(once, int) @@ -724,6 +731,7 @@ EXPORT int my_pthread_cond_clockwait(x64emu_t *emu, pthread_cond_t* cond, void* return ret; } +#ifndef ANDROID EXPORT void my__pthread_cleanup_push_defer(x64emu_t* emu, void* buffer, void* routine, void* arg) { (void)emu; @@ -769,6 +777,7 @@ EXPORT int my_pthread_setaffinity_np(x64emu_t* emu, pthread_t thread, size_t cpu return ret; } +#endif //EXPORT int my_pthread_attr_setaffinity_np(x64emu_t* emu, void* attr, uint32_t cpusetsize, void* cpuset) //{ -- cgit 1.4.1 From 646770ff68d9538e7d89a904ebbb04dc32471284 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 2 Sep 2023 12:45:59 +0200 Subject: [ANDROID] More change to android/dynarec build --- CMakeLists.txt | 4 +++- src/dynarec/dynablock.c | 9 +++++++-- src/dynarec/dynarec.c | 4 ++++ src/emu/x64emu_private.h | 1 + src/libtools/signals.c | 4 ++++ 5 files changed, 19 insertions(+), 3 deletions(-) (limited to 'src/libtools') diff --git a/CMakeLists.txt b/CMakeLists.txt index 47440877..716047f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,7 +179,9 @@ elseif(ARM64) #add_definitions(-pipe -march=native) set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+simd") elseif(ARM_DYNAREC) - set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto") + if(NOT ANDROID) + set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto") + endif() endif() if(ANDROID) add_definitions(-DANDROID) diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index 2113bd2d..d95fb829 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -172,10 +172,15 @@ dynablock_t *AddNewDynablock(uintptr_t addr) //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 void cancelFillBlock() { - longjmp(&dynarec_jmpbuf, 1); + longjmp(DYN_JMPBUF, 1); } /* @@ -208,7 +213,7 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t // fill the block block->x64_addr = (void*)addr; - if(sigsetjmp(&dynarec_jmpbuf, 1)) { + if(sigsetjmp(DYN_JMPBUF, 1)) { printf_log(LOG_INFO, "FillBlock at %p triggered a segfault, canceling\n", (void*)addr); FreeDynablock(block, 0); if(need_lock) diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index a0084a8e..9416352d 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -103,7 +103,11 @@ void DynaCall(x64emu_t* emu, uintptr_t addr) void DynaRun(x64emu_t* emu) { // prepare setjump for signal handling + #ifdef ANDROID + JUMPBUFF jmpbuf = {0}; + #else JUMPBUFF jmpbuf[1] = {0}; + #endif int skip = 0; JUMPBUFF *old_jmpbuf = emu->jmpbuf; emu->flags.jmpbuf_ready = 0; diff --git a/src/emu/x64emu_private.h b/src/emu/x64emu_private.h index 701d5add..25601105 100644 --- a/src/emu/x64emu_private.h +++ b/src/emu/x64emu_private.h @@ -45,6 +45,7 @@ typedef struct emu_flags_s { } emu_flags_t; #ifdef ANDROID +#include #define JUMPBUFF sigjmp_buf #else #define JUMPBUFF struct __jmp_buf_tag diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 43d8f58c..1aff0608 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -860,7 +860,11 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void if(Locks & is_dyndump_locked) CancelBlock64(1); #endif + #ifdef ANDROID + siglongjmp(*emu->jmpbuf, 1); + #else siglongjmp(emu->jmpbuf, 1); + #endif } printf_log(LOG_INFO, "Warning, context has been changed in Sigactionhanlder%s\n", (sigcontext->uc_mcontext.gregs[X64_RIP]!=sigcontext_copy.uc_mcontext.gregs[X64_RIP])?" (EIP changed)":""); } -- cgit 1.4.1 From e155d43c4b1b4d33fb429a2430e357ad18548fea Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 2 Sep 2023 15:04:00 +0200 Subject: [ANDROID] And again another attempt to fix the build --- src/libtools/signals.c | 4 ++++ src/libtools/threads.c | 12 ++++++++++++ 2 files changed, 16 insertions(+) (limited to 'src/libtools') diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 1aff0608..1c3c117a 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1047,7 +1047,11 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) if(Locks & is_dyndump_locked) CancelBlock64(1); emu->test.clean = 0; + #ifdef ANDROID + siglongjmp(*(JUMPBUFF*)emu->jmpbuf, 2); + #else siglongjmp(emu->jmpbuf, 2); + #endif } dynarec_log(LOG_INFO, "Warning, Auto-SMC (%p for db %p/%p) detected, but jmpbuffer not ready!\n", (void*)addr, db, (void*)db->x64_addr); } diff --git a/src/libtools/threads.c b/src/libtools/threads.c index 229102c4..c9d788e5 100644 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -61,7 +61,11 @@ typedef struct jump_buff_x64_s { typedef struct __jmp_buf_tag_s { jump_buff_x64_t __jmpbuf; int __mask_was_saved; + #ifdef ANDROID + sigset_t __saved_mask; + #else __sigset_t __saved_mask; + #endif } __jmp_buf_tag_t; typedef struct x64_unwind_buff_s { @@ -393,11 +397,13 @@ EXPORT int my_pthread_attr_init(x64emu_t* emu, pthread_attr_t* attr) (void)emu; return pthread_attr_init(getAlignedAttrWithInit(attr, 0)); } +#ifndef ANDROID EXPORT int my_pthread_attr_setaffinity_np(x64emu_t* emu, pthread_attr_t* attr, size_t cpusize, void* cpuset) { (void)emu; return pthread_attr_setaffinity_np(getAlignedAttr(attr), cpusize, cpuset); } +#endif EXPORT int my_pthread_attr_setdetachstate(x64emu_t* emu, pthread_attr_t* attr, int state) { (void)emu; @@ -435,6 +441,7 @@ EXPORT int my_pthread_attr_setstackaddr(x64emu_t* emu, pthread_attr_t* attr, voi return pthread_attr_setstack(getAlignedAttr(attr), addr, size); //return pthread_attr_setstackaddr(getAlignedAttr(attr), addr); } +#ifndef ANDROID EXPORT int my_pthread_getattr_np(x64emu_t* emu, pthread_t thread_id, pthread_attr_t* attr) { (void)emu; @@ -467,6 +474,7 @@ EXPORT int my_pthread_setattr_default_np(x64emu_t* emu, pthread_attr_t* attr) (void)emu; return pthread_setattr_default_np(getAlignedAttr(attr)); } +#endif //!ANDROID #endif EXPORT int my_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_routine, void* arg) @@ -854,6 +862,7 @@ EXPORT int my_pthread_mutexattr_gettype(x64emu_t* emu, my_mutexattr_t *attr, voi attr->x86 = mattr.x86; return ret; } +#ifndef ANDROID EXPORT int my_pthread_mutexattr_getrobust(x64emu_t* emu, my_mutexattr_t *attr, void* p) { my_mutexattr_t mattr = {0}; @@ -862,6 +871,7 @@ EXPORT int my_pthread_mutexattr_getrobust(x64emu_t* emu, my_mutexattr_t *attr, v attr->x86 = mattr.x86; return ret; } +#endif EXPORT int my_pthread_mutexattr_init(x64emu_t* emu, my_mutexattr_t *attr) { my_mutexattr_t mattr = {0}; @@ -905,6 +915,7 @@ EXPORT int my_pthread_mutexattr_settype(x64emu_t* emu, my_mutexattr_t *attr, int return ret; } EXPORT int my___pthread_mutexattr_settype(x64emu_t* emu, my_mutexattr_t *attr, int t) __attribute__((alias("my_pthread_mutexattr_settype"))); +#ifndef ANDROID EXPORT int my_pthread_mutexattr_setrobust(x64emu_t* emu, my_mutexattr_t *attr, int t) { my_mutexattr_t mattr = {0}; @@ -913,6 +924,7 @@ EXPORT int my_pthread_mutexattr_setrobust(x64emu_t* emu, my_mutexattr_t *attr, i attr->x86 = mattr.x86; return ret; } +#endif #ifdef __SIZEOF_PTHREAD_MUTEX_T #if __SIZEOF_PTHREAD_MUTEX_T == 48 -- cgit 1.4.1