diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-26 10:14:29 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-26 10:14:29 +0200 |
| commit | 56766df719c8f969e1f5969470f58c8cad1a2755 (patch) | |
| tree | f000ec668ab1356a0e5f250d5a43575895340f16 /src | |
| parent | e505e5e466be8e7d5e9e102b4b9395d3ce94d5f0 (diff) | |
| download | box64-56766df719c8f969e1f5969470f58c8cad1a2755.tar.gz box64-56766df719c8f969e1f5969470f58c8cad1a2755.zip | |
Aligned struct epoll
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/myalign.h | 3 | ||||
| -rwxr-xr-x | src/libtools/myalign.c | 41 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 1 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibctypes.h | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 1 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 11 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 6 |
8 files changed, 55 insertions, 12 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h index 0278fdf4..c2767578 100755 --- a/src/include/myalign.h +++ b/src/include/myalign.h @@ -114,3 +114,6 @@ void UnalignStat64(const void* source, void* dest); // defined in wrapperlibc.c int of_convert(int); // x86->arm int of_unconvert(int); // arm->x86 + +void UnalignEpollEvent(void* dest, void* source, int nbr); // Arm -> x86 +void AlignEpollEvent(void* dest, void* source, int nbr); // x86 -> Arm diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c index a61728c5..58760837 100755 --- a/src/libtools/myalign.c +++ b/src/libtools/myalign.c @@ -691,4 +691,43 @@ void UnalignStat64(const void* source, void* dest) x64st->st_atim = st->st_atim; x64st->st_mtim = st->st_mtim; x64st->st_ctim = st->st_ctim; -} \ No newline at end of file +} + +typedef union __attribute__((packed)) x64_epoll_data { + void *ptr; + int fd; + uint32_t u32; + uint64_t u64; +} x64_epoll_data_t; + +struct __attribute__((packed)) x64_epoll_event { + uint32_t events; + x64_epoll_data_t data; +}; +// Arm -> x64 +void UnalignEpollEvent(void* dest, void* source, int nbr) +{ + struct x64_epoll_event *x64_struct = (struct x64_epoll_event*)dest; + struct epoll_event *arm_struct = (struct epoll_event*)source; + while(nbr) { + x64_struct->events = arm_struct->events; + x64_struct->data.u64 = arm_struct->data.u64; + ++x64_struct; + ++arm_struct; + --nbr; + } +} + +// x64 -> Arm +void AlignEpollEvent(void* dest, void* source, int nbr) +{ + struct x64_epoll_event *x64_struct = (struct x64_epoll_event*)source; + struct epoll_event *arm_struct = (struct epoll_event*)dest; + while(nbr) { + arm_struct->events = x64_struct->events; + arm_struct->data.u64 = x64_struct->data.u64; + ++x64_struct; + ++arm_struct; + --nbr; + } +} diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 623359c8..58c38d0f 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -1210,6 +1210,7 @@ #() pFipppppppppppppppppppppp #!defined(NOALIGN) iFEpLp #!defined(NOALIGN) iFEppu +#!defined(NOALIGN) iFEiiip #defined(HAVE_LD80BITS) DFD #defined(HAVE_LD80BITS) DFDD #defined(HAVE_LD80BITS) DFDp diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h index 894b8e08..6655c626 100644 --- a/src/wrapped/generated/wrappedlibctypes.h +++ b/src/wrapped/generated/wrappedlibctypes.h @@ -42,6 +42,7 @@ typedef intptr_t (*lFppL_t)(void*, void*, uintptr_t); typedef void* (*pFpip_t)(void*, int64_t, void*); typedef void (*vFiipV_t)(int64_t, int64_t, void*, void*); typedef void (*vFpLLp_t)(void*, uintptr_t, uintptr_t, void*); +typedef int64_t (*iFiiip_t)(int64_t, int64_t, int64_t, void*); typedef int64_t (*iFpipp_t)(void*, int64_t, void*, void*); typedef int64_t (*iFpipV_t)(void*, int64_t, void*, void*); typedef int64_t (*iFpLpp_t)(void*, uintptr_t, void*, void*); @@ -133,6 +134,7 @@ typedef int64_t (*iFpippppp_t)(void*, int64_t, void*, void*, void*, void*, void* GO(fts_open, pFpip_t) \ GO(__syslog_chk, vFiipV_t) \ GO(qsort, vFpLLp_t) \ + GO(epoll_ctl, iFiiip_t) \ GO(__vasprintf_chk, iFpipp_t) \ GO(glob, iFpipp_t) \ GO(glob64, iFpipp_t) \ diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index 2c874d17..83ea6e9e 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -1246,6 +1246,7 @@ typedef void* (*pFipppppppppppppppppppppp_t)(int64_t, void*, void*, void*, void* #if !defined(NOALIGN) typedef int64_t (*iFEpLp_t)(x64emu_t*, void*, uintptr_t, void*); typedef int64_t (*iFEppu_t)(x64emu_t*, void*, void*, uint64_t); +typedef int64_t (*iFEiiip_t)(x64emu_t*, int64_t, int64_t, int64_t, void*); #endif #if defined(HAVE_LD80BITS) @@ -2474,6 +2475,7 @@ void pFipppppppppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFipppppppppppppp #if !defined(NOALIGN) void iFEpLp(x64emu_t *emu, uintptr_t fcn) { iFEpLp_t fn = (iFEpLp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX); } void iFEppu(x64emu_t *emu, uintptr_t fcn) { iFEppu_t fn = (iFEppu_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uint64_t)R_RDX); } +void iFEiiip(x64emu_t *emu, uintptr_t fcn) { iFEiiip_t fn = (iFEiiip_t)fcn; R_RAX=(int64_t)fn(emu, (int64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (void*)R_RCX); } #endif #if defined(HAVE_LD80BITS) diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index e756d147..5a234181 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -1242,6 +1242,7 @@ void pFipppppppppppppppppppppp(x64emu_t *emu, uintptr_t fnc); #if !defined(NOALIGN) void iFEpLp(x64emu_t *emu, uintptr_t fnc); void iFEppu(x64emu_t *emu, uintptr_t fnc); +void iFEiiip(x64emu_t *emu, uintptr_t fnc); #endif #if defined(HAVE_LD80BITS) diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index a4981f58..6816272e 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -1437,16 +1437,8 @@ EXPORT void* my_ldiv(x64emu_t* emu, void* p, int32_t num, int32_t den) *((ldiv_t*)p) = ldiv(num, den); return p; } - +#endif #ifndef NOALIGN -EXPORT int my_epoll_create(x64emu_t* emu, int size) -{ - return epoll_create(size); -} -EXPORT int my_epoll_create1(x64emu_t* emu, int flags) -{ - return epoll_create1(flags); -} EXPORT int32_t my_epoll_ctl(x64emu_t* emu, int32_t epfd, int32_t op, int32_t fd, void* event) { struct epoll_event _event[1] = {0}; @@ -1465,7 +1457,6 @@ EXPORT int32_t my_epoll_wait(x64emu_t* emu, int32_t epfd, void* events, int32_t } #endif -#endif EXPORT int32_t my_glob64(x64emu_t *emu, void* pat, int32_t flags, void* errfnc, void* pglob) { (void)emu; diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index a3a2904c..e9e49fa5 100755 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -258,7 +258,11 @@ DATAB(__environ, sizeof(void*)) //GO(envz_strip, GO(epoll_create, iFi) GO(epoll_create1, iFO) -GO(epoll_ctl, iFiiip) // need to check about alignment +#ifdef NOALIGN +GO(epoll_ctl, iFiiip) +#else +GOM(epoll_ctl, iFEiiip) // struct epoll_event is 12byte on x86_64 and 16bytes (8bytes aligned) on arm64 +#endif //GO(epoll_pwait, GO(epoll_wait, iFipii) GO(erand48, dFp) |