about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-06-06 08:31:46 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-06-06 08:31:46 +0200
commitdd2f209096eb4ed2ec365149cb19a0c18a9e09e2 (patch)
tree34a595cdcbef4caad95c97fae08fb3e673d533e4 /src
parent3b181576c847249303498621e609f7bf059c7597 (diff)
downloadbox64-dd2f209096eb4ed2ec365149cb19a0c18a9e09e2.tar.gz
box64-dd2f209096eb4ed2ec365149cb19a0c18a9e09e2.zip
Improvment to a few libc wrapped functions
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/myalign.h3
-rwxr-xr-xsrc/libtools/myalign.c34
-rw-r--r--src/wrapped/generated/functions_list.txt4
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h3
-rw-r--r--src/wrapped/generated/wrappedlibpthreadtypes.h1
-rwxr-xr-xsrc/wrapped/wrappedlibc.c30
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h26
7 files changed, 79 insertions, 22 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h
index c2767578..bd46908f 100755
--- a/src/include/myalign.h
+++ b/src/include/myalign.h
@@ -117,3 +117,6 @@ 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
+
+void UnalignSemidDs(void *dest, const void* source);
+void AlignSemidDs(void *dest, const void* source);
diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c
index eee1d49f..82d57361 100755
--- a/src/libtools/myalign.c
+++ b/src/libtools/myalign.c
@@ -6,6 +6,7 @@
 #include <sys/epoll.h>
 #include <fts.h>
 #include <sys/stat.h>
+#include <sys/sem.h>
 
 #include "x64emu.h"
 #include "emu/x64emu_private.h"
@@ -747,3 +748,36 @@ void AlignEpollEvent(void* dest, void* source, int nbr)
         --nbr;
     }
 }
+
+struct __attribute__((packed)) x64_semid_ds {
+    struct ipc_perm sem_perm;
+    time_t sem_otime;
+    unsigned long _reserved1;
+    time_t sem_ctime;
+    unsigned long _reserved2;
+    unsigned long sem_nsems;
+    unsigned long _reserved3;
+    unsigned long _reserved4;
+};
+
+void UnalignSemidDs(void *dest, const void* source)
+{
+    struct x64_semid_ds *x64_struct = (struct x64_semid_ds*)dest;
+    const struct semid_ds *arm_struct = (const struct semid_ds*)source;
+
+    x64_struct->sem_perm = arm_struct->sem_perm;
+    x64_struct->sem_otime = arm_struct->sem_otime;
+    x64_struct->sem_ctime = arm_struct->sem_ctime;
+    x64_struct->sem_nsems = arm_struct->sem_nsems;
+}
+
+void AlignSemidDs(void *dest, const void* source)
+{
+    const struct x64_semid_ds *x64_struct = (const struct x64_semid_ds*)source;
+    struct semid_ds *arm_struct = (struct semid_ds*)dest;
+
+    arm_struct->sem_perm = x64_struct->sem_perm;
+    arm_struct->sem_otime = x64_struct->sem_otime;
+    arm_struct->sem_ctime = x64_struct->sem_ctime;
+    arm_struct->sem_nsems = x64_struct->sem_nsems;
+}
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 5caac75b..890960b1 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -1403,12 +1403,12 @@ wrappedlibc:
   - __longjmp_chk
   - _longjmp
   - longjmp
+  - siglongjmp
 - vFpu:
   - _ITM_registerTMCloneTable
 - iFpi:
   - __sigsetjmp
   - backtrace
-  - siglongjmp
 - iFpL:
   - munmap
 - iFpp:
@@ -1466,6 +1466,7 @@ wrappedlibc:
   - ftw64
 - iFppp:
   - __cxa_atexit
+  - __isoc99_vfscanf
   - __isoc99_vsscanf
   - __vfprintf_chk
   - __vsscanf
@@ -1656,6 +1657,7 @@ wrappedlibpthread:
   - pthread_condattr_getpshared
   - pthread_key_create
   - pthread_mutexattr_getkind_np
+  - pthread_mutexattr_getprotocol
   - pthread_mutexattr_gettype
   - pthread_once
 - vFppp:
diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h
index f5a6b7d6..68d4f6e5 100644
--- a/src/wrapped/generated/wrappedlibctypes.h
+++ b/src/wrapped/generated/wrappedlibctypes.h
@@ -75,10 +75,10 @@ typedef int64_t (*iFpippppp_t)(void*, int64_t, void*, void*, void*, void*, void*
 	GO(__longjmp_chk, vFpi_t) \
 	GO(_longjmp, vFpi_t) \
 	GO(longjmp, vFpi_t) \
+	GO(siglongjmp, vFpi_t) \
 	GO(_ITM_registerTMCloneTable, vFpu_t) \
 	GO(__sigsetjmp, iFpi_t) \
 	GO(backtrace, iFpi_t) \
-	GO(siglongjmp, iFpi_t) \
 	GO(munmap, iFpL_t) \
 	GO(__vprintf_chk, iFpp_t) \
 	GO(dl_iterate_phdr, iFpp_t) \
@@ -118,6 +118,7 @@ typedef int64_t (*iFpippppp_t)(void*, int64_t, void*, void*, void*, void*, void*
 	GO(ftw, iFppi_t) \
 	GO(ftw64, iFppi_t) \
 	GO(__cxa_atexit, iFppp_t) \
+	GO(__isoc99_vfscanf, iFppp_t) \
 	GO(__isoc99_vsscanf, iFppp_t) \
 	GO(__vfprintf_chk, iFppp_t) \
 	GO(__vsscanf, iFppp_t) \
diff --git a/src/wrapped/generated/wrappedlibpthreadtypes.h b/src/wrapped/generated/wrappedlibpthreadtypes.h
index 8b7157cb..d159b0e8 100644
--- a/src/wrapped/generated/wrappedlibpthreadtypes.h
+++ b/src/wrapped/generated/wrappedlibpthreadtypes.h
@@ -74,6 +74,7 @@ typedef int64_t (*iFpppp_t)(void*, void*, void*, void*);
 	GO(pthread_condattr_getpshared, iFpp_t) \
 	GO(pthread_key_create, iFpp_t) \
 	GO(pthread_mutexattr_getkind_np, iFpp_t) \
+	GO(pthread_mutexattr_getprotocol, iFpp_t) \
 	GO(pthread_mutexattr_gettype, iFpp_t) \
 	GO(pthread_once, iFpp_t) \
 	GO(_pthread_cleanup_push, vFppp_t) \
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 270066ad..48b6591b 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -719,10 +719,8 @@ EXPORT int my_sscanf(x64emu_t* emu, void* stream, void* fmt, uint64_t* b)
 }
 EXPORT int my__IO_vfscanf(x64emu_t* emu, void* stream, void* fmt, void* b) __attribute__((alias("my_vfscanf")));
 EXPORT int my___isoc99_vsscanf(x64emu_t* emu, void* stream, void* fmt, void* b) __attribute__((alias("my_vsscanf")));
-
-#if 0
 EXPORT int my___isoc99_vfscanf(x64emu_t* emu, void* stream, void* fmt, void* b) __attribute__((alias("my_vfscanf")));
-#endif
+
 EXPORT int my___isoc99_fscanf(x64emu_t* emu, void* stream, void* fmt, uint64_t* b)
 {
   myStackAlignScanf(emu, (const char*)fmt, b, emu->scratch, 2);
@@ -2265,6 +2263,7 @@ EXPORT void my_mcount(void* frompc, void* selfpc)
     // stub doing nothing...
     return;
 }
+#endif
 
 union semun {
   int              val;    /* Value for SETVAL */
@@ -2273,13 +2272,30 @@ union semun {
   struct seminfo  *__buf;  /* Buffer for IPC_INFO
                               (Linux-specific) */
 };
+#ifndef SEM_STAT_ANY
+#define SEM_STAT_ANY 20
+#endif
 
-EXPORT int my_semctl(x64emu_t* emu, int semid, int semnum, int cmd, union semun b)
+EXPORT int my_semctl(int semid, int semnum, int cmd, union semun b)
 {
-  iFiiiV_t f = semctl;
-  return  ((iFiiiV_t)f)(semid, semnum, cmd, b);
+    struct semid_ds semidds;
+    void *backup = NULL;
+    if ((cmd == IPC_STAT) || (cmd == IPC_SET) || (cmd == SEM_STAT) || (cmd == SEM_STAT_ANY)) {
+        backup = b.buf;
+        b.buf = &semidds;
+        if (cmd == IPC_SET) {
+            AlignSemidDs(&semidds, backup);
+        }
+    }
+    int ret = semctl(semid, semnum, cmd, b);
+    if ((cmd == IPC_STAT) || (cmd == IPC_SET) || (cmd == SEM_STAT) || (cmd == SEM_STAT_ANY)) {
+        b.buf = backup;
+        if (cmd == IPC_STAT) {
+            UnalignSemidDs(backup, &semidds);
+        }
+    }
+    return ret;
 }
-#endif
 
 // Backtrace stuff
 EXPORT int my_backtrace(x64emu_t* emu, void** buffer, int size)
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index f20aedf9..1bec4376 100755
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -561,8 +561,8 @@ GO(__getpagesize, iFv)
 GOW(getpagesize, iFv)
 //GO(getpass, 
 GOW(getpeername, iFipp)
-//GO(__getpgid, 
-//GOW(getpgid, 
+GO(__getpgid, lFl)
+GOW(getpgid, lFl)
 //GO(getpgrp, 
 //GOW(get_phys_pages, 
 GO(__getpid, uFv)
@@ -612,7 +612,7 @@ GO(getservbyport, pFip)
 //GO(getsgent_r, 
 //GO(getsgnam, 
 //GO(getsgnam_r, 
-//GO(getsid, 
+GO(getsid, lFl)
 GOW(getsockname, iFipp)
 GOW(getsockopt, iFiiipp)
 //GO(getsourcefilter, 
@@ -920,7 +920,7 @@ GOM(__isoc99_fscanf, iFEppV)
 //GO(__isoc99_scanf, 
 GOM(__isoc99_sscanf, iFEppV)
 //GO(__isoc99_swscanf, 
-//GO(__isoc99_vfscanf, 
+GOM(__isoc99_vfscanf, iFEppp)
 //GO(__isoc99_vfwscanf, 
 //GO(__isoc99_vscanf, 
 GOM(__isoc99_vsscanf, iFEppp)
@@ -1590,7 +1590,7 @@ GO(seed48, pFp)
 GO(seekdir, vFpi)
 GO(__select, iFipppp)
 GOW(select, iFipppp)
-GO(semctl, iFiiiN)
+GOM(semctl, iFiiiN)
 GO(semget, iFiii)
 GO(semop, iFipL)
 GO(semtimedop, iFipLp)
@@ -1610,7 +1610,7 @@ GOW(setbuffer, vFppL)
 //GO(setegid, 
 GOW(setenv, iFppi)
 //GO(_seterr_reply, 
-//GO(seteuid, 
+GO(seteuid, iFu)
 //GO(setfsent, 
 //GO(setfsgid, 
 //GO(setfsuid, 
@@ -1635,14 +1635,14 @@ GO(setlogmask, iFi)
 //GO(setns, 
 GO(__setpgid, iFpp)
 GOW(setpgid, iFpp)
-//GO(setpgrp, 
+GO(setpgrp, lFv)
 GOW(setpriority, iFiii)
 GO(setprotoent, vFi)
 //GO(setpwent, 
 //GOW(setregid, 
 //GOW(setresgid, 
 //GOW(setresuid, 
-//GOW(setreuid, 
+GOW(setreuid, iFuu)
 GOW(setrlimit, iFip)
 GOW(setrlimit64, iFip)
 //GO(setrpcent, 
@@ -1683,13 +1683,13 @@ GO(sigdelset, iFpi)
 GO(sigemptyset, iFp)
 GO(sigfillset, iFp)
 GO(siggetmask, iFv)
-//GO(sighold, 
-//GO(sigignore, 
+GO(sighold, iFi)
+GO(sigignore, iFi)
 //GO(siginterrupt, 
 //GO(sigisemptyset, 
 //GO(__sigismember, 
 GO(sigismember, iFpi)
-GOM(siglongjmp, iFEpi)
+GOM(siglongjmp, vFEpi)
 GOM(signal, pFEip)  //Weak
 //GO(signalfd, 
 GO(__signbit, iFd)
@@ -1701,7 +1701,7 @@ GO(__signbitf, iFf)
 GO(sigpending, iFp)
 GOW(sigprocmask, iFipp)
 //GOW(sigqueue, 
-//GO(sigrelse, 
+GO(sigrelse, iFi)
 //GOW(sigreturn, 
 GOM(sigset, pFEip)
 GOM(__sigsetjmp, iFEpi)
@@ -2289,7 +2289,7 @@ GOW(writev, lFipi)
 GO(__xmknod, iFipup)
 //GO(__xmknodat, 
 GO(__xpg_basename, pFp)
-//GOW(__xpg_sigpause, 
+GOW(__xpg_sigpause, iFi)
 GO(__xpg_strerror_r, pFipL)
 //GO(xprt_register, 
 //GO(xprt_unregister,