From e3d15db6c504c10c5fd34b60899d617a8de71fd3 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 9 Apr 2021 11:08:26 +0200 Subject: pthread_attr_t don't have the same size on x86_64 (0x38) and arm64 (0x40)... --- src/libtools/threads.c | 143 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 13 deletions(-) (limited to 'src/libtools') diff --git a/src/libtools/threads.c b/src/libtools/threads.c index 07fd5d75..7b3a0c80 100755 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -241,16 +241,59 @@ static void* pthread_routine(void* p) return ret; } +#ifdef NOALIGN +pthread_attr_t* getAlignedAttr(pthread_attr_t* m) { + return m; +} +#else +typedef struct aligned_attr_s { + uint64_t sign; + pthread_attr_t *at; +} aligned_attr_t; +#define SIGN_ATTR *(uint64_t*)"BOX64ATT" + +pthread_attr_t* getAlignedAttrWithInit(pthread_attr_t* attr, int init) +{ + if(!attr) + return; + aligned_attr_t* at = (aligned_attr_t*)attr; + if(init && at->sign==SIGN_ATTR) + return at->at; + pthread_attr_t* ret = (pthread_attr_t*)calloc(1, sizeof(pthread_attr_t)); + at->sign = SIGN_ATTR; + at->at = ret; + if(init) + pthread_attr_init(ret); // init? + return ret; +} +pthread_attr_t* getAlignedAttr(pthread_attr_t* attr) +{ + return getAlignedAttrWithInit(attr, 1); +} +void freeAlignedAttr(void* attr) +{ + if(!attr) + return; + aligned_attr_t* at = (aligned_attr_t*)attr; + if(at->sign==SIGN_ATTR) { + free(at->at); + at->sign = 0LL; + } +} +#endif + EXPORT int my_pthread_attr_destroy(x64emu_t* emu, void* attr) { if(emu->context->stacksizes) FreeStackSize(emu->context->stacksizes, (uintptr_t)attr); - return pthread_attr_destroy(attr); + int ret = pthread_attr_destroy(getAlignedAttr(attr)); + freeAlignedAttr(attr); + return ret; } EXPORT int my_pthread_attr_getstack(x64emu_t* emu, void* attr, void** stackaddr, size_t* stacksize) { - int ret = pthread_attr_getstack(attr, stackaddr, stacksize); + int ret = pthread_attr_getstack(getAlignedAttr(attr), stackaddr, stacksize); if (ret==0) GetStackSize(emu, (uintptr_t)attr, stackaddr, stacksize); return ret; @@ -264,7 +307,7 @@ EXPORT int my_pthread_attr_setstack(x64emu_t* emu, void* attr, void* stackaddr, AddStackSize(emu->context->stacksizes, (uintptr_t)attr, stackaddr, stacksize); //Don't call actual setstack... //return pthread_attr_setstack(attr, stackaddr, stacksize); - return pthread_attr_setstacksize(attr, stacksize); + return pthread_attr_setstacksize(getAlignedAttr(attr), stacksize); } EXPORT int my_pthread_attr_setstacksize(x64emu_t* emu, void* attr, size_t stacksize) @@ -272,8 +315,86 @@ EXPORT int my_pthread_attr_setstacksize(x64emu_t* emu, void* attr, size_t stacks //aarch64 have an PTHREAD_STACK_MIN of 131072 instead of 16384 on x86_64! if(stacksize