diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-06 08:31:46 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-06 08:31:46 +0200 |
| commit | dd2f209096eb4ed2ec365149cb19a0c18a9e09e2 (patch) | |
| tree | 34a595cdcbef4caad95c97fae08fb3e673d533e4 /src | |
| parent | 3b181576c847249303498621e609f7bf059c7597 (diff) | |
| download | box64-dd2f209096eb4ed2ec365149cb19a0c18a9e09e2.tar.gz box64-dd2f209096eb4ed2ec365149cb19a0c18a9e09e2.zip | |
Improvment to a few libc wrapped functions
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/myalign.h | 3 | ||||
| -rwxr-xr-x | src/libtools/myalign.c | 34 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibctypes.h | 3 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibpthreadtypes.h | 1 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 30 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 26 |
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, |