about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-26 10:14:29 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-26 10:14:29 +0200
commit56766df719c8f969e1f5969470f58c8cad1a2755 (patch)
treef000ec668ab1356a0e5f250d5a43575895340f16 /src
parente505e5e466be8e7d5e9e102b4b9395d3ce94d5f0 (diff)
downloadbox64-56766df719c8f969e1f5969470f58c8cad1a2755.tar.gz
box64-56766df719c8f969e1f5969470f58c8cad1a2755.zip
Aligned struct epoll
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/myalign.h3
-rwxr-xr-xsrc/libtools/myalign.c41
-rw-r--r--src/wrapped/generated/functions_list.txt1
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h2
-rw-r--r--src/wrapped/generated/wrapper.c2
-rw-r--r--src/wrapped/generated/wrapper.h1
-rwxr-xr-xsrc/wrapped/wrappedlibc.c11
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h6
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)