diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-09 14:53:24 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-09 14:53:24 +0100 |
| commit | 367e4ac3f7c602e8f979b20b38673b1c878ea78f (patch) | |
| tree | 4ffe9879fe807b839cbdd74e5f65311ef6799257 /src | |
| parent | 094f961a0a362899093291c82fb861e964b5d9cc (diff) | |
| download | box64-367e4ac3f7c602e8f979b20b38673b1c878ea78f.tar.gz box64-367e4ac3f7c602e8f979b20b38673b1c878ea78f.zip | |
pthread_mutex_t is larger on ARM64 than on x86_64, that's unfortunate, but all mutex based function need alignements
Diffstat (limited to 'src')
| -rwxr-xr-x | src/libtools/threads.c | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 5 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 10 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 5 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 12 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibpthread_private.h | 17 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibx11_private.h | 2 |
7 files changed, 40 insertions, 15 deletions
diff --git a/src/libtools/threads.c b/src/libtools/threads.c index d35b0d4f..3293edbd 100755 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -667,8 +667,6 @@ static kh_mutex_t* unaligned_mutex = NULL; pthread_mutex_t* getAlignedMutex(pthread_mutex_t* m) { - if(!(((uintptr_t)m)&3)) - return m; khint_t k = kh_get(mutex, unaligned_mutex, (uintptr_t)m); if(k!=kh_end(unaligned_mutex)) return kh_value(unaligned_mutex, k); @@ -680,8 +678,6 @@ pthread_mutex_t* getAlignedMutex(pthread_mutex_t* m) } EXPORT int my_pthread_mutex_destroy(pthread_mutex_t *m) { - if(!(((uintptr_t)m)&3)) - return pthread_mutex_destroy(m); khint_t k = kh_get(mutex, unaligned_mutex, (uintptr_t)m); if(k!=kh_end(unaligned_mutex)) { pthread_mutex_t *n = kh_value(unaligned_mutex, k); diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index d9f7d883..a185f24f 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -107,6 +107,7 @@ #() fFfi #() fFff #() fFfp +#() fFpp #() dFid #() dFdi #() dFdd @@ -231,6 +232,8 @@ #() fFffp #() dFddd #() dFddp +#() dFppi +#() dFppp #() lFipL #() LFpii #() pFEip @@ -815,7 +818,7 @@ #() vFuddiiddiiddiip #() vFuuiiiiuuiiiiiii #() vFfffffffffffffff -#() uFpppppppppppppppp +#() pFpppppppppppppppp #() vFppuiiiiipuiiiiiiii #() pFipppppppppppppppppppppp #defined(HAVE_LD80BITS) DFD diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index c522ecc7..dd34a698 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -140,6 +140,7 @@ typedef float (*fFif_t)(int32_t, float); typedef float (*fFfi_t)(float, int32_t); typedef float (*fFff_t)(float, float); typedef float (*fFfp_t)(float, void*); +typedef float (*fFpp_t)(void*, void*); typedef double (*dFid_t)(int32_t, double); typedef double (*dFdi_t)(double, int32_t); typedef double (*dFdd_t)(double, double); @@ -264,6 +265,8 @@ typedef float (*fFfff_t)(float, float, float); typedef float (*fFffp_t)(float, float, void*); typedef double (*dFddd_t)(double, double, double); typedef double (*dFddp_t)(double, double, void*); +typedef double (*dFppi_t)(void*, void*, int32_t); +typedef double (*dFppp_t)(void*, void*, void*); typedef intptr_t (*lFipL_t)(int32_t, void*, uintptr_t); typedef uintptr_t (*LFpii_t)(void*, int32_t, int32_t); typedef void* (*pFEip_t)(x64emu_t*, int32_t, void*); @@ -848,7 +851,7 @@ typedef void (*vFuffiiffiiffiip_t)(uint32_t, float, float, int32_t, int32_t, flo typedef void (*vFuddiiddiiddiip_t)(uint32_t, double, double, int32_t, int32_t, double, double, int32_t, int32_t, double, double, int32_t, int32_t, void*); typedef void (*vFuuiiiiuuiiiiiii_t)(uint32_t, uint32_t, int32_t, int32_t, int32_t, int32_t, uint32_t, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t); typedef void (*vFfffffffffffffff_t)(float, float, float, float, float, float, float, float, float, float, float, float, float, float, float); -typedef uint32_t (*uFpppppppppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); +typedef void* (*pFpppppppppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); typedef void (*vFppuiiiiipuiiiiiiii_t)(void*, void*, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, void*, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t); typedef void* (*pFipppppppppppppppppppppp_t)(int32_t, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*); @@ -973,6 +976,7 @@ void fFif(x64emu_t *emu, uintptr_t fcn) { fFif_t fn = (fFif_t)fcn; emu->xmm[0].f void fFfi(x64emu_t *emu, uintptr_t fcn) { fFfi_t fn = (fFfi_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], (int32_t)R_RDI); } void fFff(x64emu_t *emu, uintptr_t fcn) { fFff_t fn = (fFff_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], emu->xmm[1].f[0]); } void fFfp(x64emu_t *emu, uintptr_t fcn) { fFfp_t fn = (fFfp_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], (void*)R_RDI); } +void fFpp(x64emu_t *emu, uintptr_t fcn) { fFpp_t fn = (fFpp_t)fcn; emu->xmm[0].f[0]=fn((void*)R_RDI, (void*)R_RSI); } void dFid(x64emu_t *emu, uintptr_t fcn) { dFid_t fn = (dFid_t)fcn; emu->xmm[0].d[0]=fn((int32_t)R_RDI, emu->xmm[0].d[0]); } void dFdi(x64emu_t *emu, uintptr_t fcn) { dFdi_t fn = (dFdi_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], (int32_t)R_RDI); } void dFdd(x64emu_t *emu, uintptr_t fcn) { dFdd_t fn = (dFdd_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], emu->xmm[1].d[0]); } @@ -1097,6 +1101,8 @@ void fFfff(x64emu_t *emu, uintptr_t fcn) { fFfff_t fn = (fFfff_t)fcn; emu->xmm[0 void fFffp(x64emu_t *emu, uintptr_t fcn) { fFffp_t fn = (fFffp_t)fcn; emu->xmm[0].f[0]=fn(emu->xmm[0].f[0], emu->xmm[1].f[0], (void*)R_RDI); } void dFddd(x64emu_t *emu, uintptr_t fcn) { dFddd_t fn = (dFddd_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0]); } void dFddp(x64emu_t *emu, uintptr_t fcn) { dFddp_t fn = (dFddp_t)fcn; emu->xmm[0].d[0]=fn(emu->xmm[0].d[0], emu->xmm[1].d[0], (void*)R_RDI); } +void dFppi(x64emu_t *emu, uintptr_t fcn) { dFppi_t fn = (dFppi_t)fcn; emu->xmm[0].d[0]=fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX); } +void dFppp(x64emu_t *emu, uintptr_t fcn) { dFppp_t fn = (dFppp_t)fcn; emu->xmm[0].d[0]=fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX); } void lFipL(x64emu_t *emu, uintptr_t fcn) { lFipL_t fn = (lFipL_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX); } void LFpii(x64emu_t *emu, uintptr_t fcn) { LFpii_t fn = (LFpii_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX); } void pFEip(x64emu_t *emu, uintptr_t fcn) { pFEip_t fn = (pFEip_t)fcn; R_RAX=(uintptr_t)fn(emu, (int32_t)R_RDI, (void*)R_RSI); } @@ -1681,7 +1687,7 @@ void vFuffiiffiiffiip(x64emu_t *emu, uintptr_t fcn) { vFuffiiffiiffiip_t fn = (v void vFuddiiddiiddiip(x64emu_t *emu, uintptr_t fcn) { vFuddiiddiiddiip_t fn = (vFuddiiddiiddiip_t)fcn; fn((uint32_t)R_RDI, emu->xmm[0].d[0], emu->xmm[1].d[0], (int32_t)R_RSI, (int32_t)R_RDX, emu->xmm[2].d[0], emu->xmm[3].d[0], (int32_t)R_RCX, (int32_t)R_R8, emu->xmm[4].d[0], emu->xmm[5].d[0], (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(void**)(R_RSP + 16)); } void vFuuiiiiuuiiiiiii(x64emu_t *emu, uintptr_t fcn) { vFuuiiiiuuiiiiiii_t fn = (vFuuiiiiuuiiiiiii_t)fcn; fn((uint32_t)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(uint32_t*)(R_RSP + 8), *(uint32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(int32_t*)(R_RSP + 32), *(int32_t*)(R_RSP + 40), *(int32_t*)(R_RSP + 48), *(int32_t*)(R_RSP + 56), *(int32_t*)(R_RSP + 64), *(int32_t*)(R_RSP + 72)); } void vFfffffffffffffff(x64emu_t *emu, uintptr_t fcn) { vFfffffffffffffff_t fn = (vFfffffffffffffff_t)fcn; fn(emu->xmm[0].f[0], emu->xmm[1].f[0], emu->xmm[2].f[0], emu->xmm[3].f[0], emu->xmm[4].f[0], emu->xmm[5].f[0], emu->xmm[6].f[0], emu->xmm[7].f[0], *(float*)(R_RSP + 8), *(float*)(R_RSP + 16), *(float*)(R_RSP + 24), *(float*)(R_RSP + 32), *(float*)(R_RSP + 40), *(float*)(R_RSP + 48), *(float*)(R_RSP + 56)); } -void uFpppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { uFpppppppppppppppp_t fn = (uFpppppppppppppppp_t)fcn; R_RAX=(uint32_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80)); } +void pFpppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFpppppppppppppppp_t fn = (pFpppppppppppppppp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80)); } void vFppuiiiiipuiiiiiiii(x64emu_t *emu, uintptr_t fcn) { vFppuiiiiipuiiiiiiii_t fn = (vFppuiiiiipuiiiiiiii_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(void**)(R_RSP + 24), *(uint32_t*)(R_RSP + 32), *(int32_t*)(R_RSP + 40), *(int32_t*)(R_RSP + 48), *(int32_t*)(R_RSP + 56), *(int32_t*)(R_RSP + 64), *(int32_t*)(R_RSP + 72), *(int32_t*)(R_RSP + 80), *(int32_t*)(R_RSP + 88), *(int32_t*)(R_RSP + 96)); } void pFipppppppppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFipppppppppppppppppppppp_t fn = (pFipppppppppppppppppppppp_t)fcn; R_RAX=(uintptr_t)fn((int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80), *(void**)(R_RSP + 88), *(void**)(R_RSP + 96), *(void**)(R_RSP + 104), *(void**)(R_RSP + 112), *(void**)(R_RSP + 120), *(void**)(R_RSP + 128), *(void**)(R_RSP + 136)); } diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index 1139701b..313827d5 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -137,6 +137,7 @@ void fFif(x64emu_t *emu, uintptr_t fnc); void fFfi(x64emu_t *emu, uintptr_t fnc); void fFff(x64emu_t *emu, uintptr_t fnc); void fFfp(x64emu_t *emu, uintptr_t fnc); +void fFpp(x64emu_t *emu, uintptr_t fnc); void dFid(x64emu_t *emu, uintptr_t fnc); void dFdi(x64emu_t *emu, uintptr_t fnc); void dFdd(x64emu_t *emu, uintptr_t fnc); @@ -261,6 +262,8 @@ void fFfff(x64emu_t *emu, uintptr_t fnc); void fFffp(x64emu_t *emu, uintptr_t fnc); void dFddd(x64emu_t *emu, uintptr_t fnc); void dFddp(x64emu_t *emu, uintptr_t fnc); +void dFppi(x64emu_t *emu, uintptr_t fnc); +void dFppp(x64emu_t *emu, uintptr_t fnc); void lFipL(x64emu_t *emu, uintptr_t fnc); void LFpii(x64emu_t *emu, uintptr_t fnc); void pFEip(x64emu_t *emu, uintptr_t fnc); @@ -845,7 +848,7 @@ void vFuffiiffiiffiip(x64emu_t *emu, uintptr_t fnc); void vFuddiiddiiddiip(x64emu_t *emu, uintptr_t fnc); void vFuuiiiiuuiiiiiii(x64emu_t *emu, uintptr_t fnc); void vFfffffffffffffff(x64emu_t *emu, uintptr_t fnc); -void uFpppppppppppppppp(x64emu_t *emu, uintptr_t fnc); +void pFpppppppppppppppp(x64emu_t *emu, uintptr_t fnc); void vFppuiiiiipuiiiiiiii(x64emu_t *emu, uintptr_t fnc); void pFipppppppppppppppppppppp(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index 90bb30a3..93d7e18e 100755 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -1814,13 +1814,13 @@ GO(strpbrk, pFpp) //GO(__strspn_c1, //GO(__strspn_c2, //GO(__strspn_c3, -//GOI(strstr, -//GO(strtod, -//GO(__strtod_internal, -//GO(__strtod_l, -//GOW(strtod_l, +GO(strstr, pFpp) +GO(strtod, dFpp) +GO(__strtod_internal, dFppi) +GO(__strtod_l, dFppp) +GOW(strtod_l, dFppp) //GO(__strtod_nan, -//GO(strtof, +GO(strtof, fFpp) //GO(strtof128, //GO(__strtof128_internal, //GOW(strtof128_l, diff --git a/src/wrapped/wrappedlibpthread_private.h b/src/wrapped/wrappedlibpthread_private.h index 68cd47d4..23a2a6a5 100755 --- a/src/wrapped/wrappedlibpthread_private.h +++ b/src/wrapped/wrappedlibpthread_private.h @@ -100,6 +100,7 @@ GO(pthread_mutexattr_setpshared, iFpi) GO(__pthread_mutexattr_settype, iFpi) GO(pthread_mutexattr_settype, iFpi) // pthread_mutex_consistent_np +#ifdef NOALIGN GO(__pthread_mutex_destroy, iFp) GO(pthread_mutex_destroy, iFp) // pthread_mutex_getprioceiling @@ -113,6 +114,22 @@ GO(__pthread_mutex_trylock, iFp) GO(pthread_mutex_trylock, iFp) GO(__pthread_mutex_unlock, iFp) GO(pthread_mutex_unlock, iFp) +#else +// phtread_mutex_t is 40 bytes on x86_64, but 48bytes on ARM64 +GOM(__pthread_mutex_destroy, iFp) +GOM(pthread_mutex_destroy, iFp) +// pthread_mutex_getprioceiling +GOM(__pthread_mutex_init, iFpp) +GOM(pthread_mutex_init, iFpp) +GOM(__pthread_mutex_lock, iFp) +GOM(pthread_mutex_lock, iFp) +// pthread_mutex_setprioceiling +GOM(pthread_mutex_timedlock, iFpp) +GOM(__pthread_mutex_trylock, iFp) +GOM(pthread_mutex_trylock, iFp) +GOM(__pthread_mutex_unlock, iFp) +GOM(pthread_mutex_unlock, iFp) +#endif GOM(pthread_once, iFEpp) GOM(__pthread_once, iFEpp) GOM(__pthread_register_cancel, vFEp) diff --git a/src/wrapped/wrappedlibx11_private.h b/src/wrapped/wrappedlibx11_private.h index 7894cf1d..eb026522 100755 --- a/src/wrapped/wrappedlibx11_private.h +++ b/src/wrapped/wrappedlibx11_private.h @@ -225,7 +225,7 @@ GO(XCreateFontCursor, pFpu) GO(XCreateFontSet, pFppppp) GO(XCreateGC, pFppup) //GO(XCreateGlyphCursor -GO(XCreateIC, uFpppppppppppppppp) // use ..., so putting an arbitrary number of args, also can have Callbacks ?! Allegro have 7 args and no callback +GO(XCreateIC, pFpppppppppppppppp) // use ..., so putting an arbitrary number of args, also can have Callbacks ?! Allegro have 7 args and no callback GOM(XCreateImage, pFEppuiipuuii) GO(dummy_XCreateImage, pFppuiipuuii) // to have the wrapper DATAB(_XCreateMutex_fn, sizeof(void*)) |