diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-07 09:20:45 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-07 09:20:45 +0200 |
| commit | a6d7d83fb383a5c8cf9cde68af4136f7e2345259 (patch) | |
| tree | 9cd7a9b595e376d61469d131eaec57b60d0ce907 /src | |
| parent | a450b9d12f99df13adcae4a570aeb780964d43b2 (diff) | |
| download | box64-a6d7d83fb383a5c8cf9cde68af4136f7e2345259.tar.gz box64-a6d7d83fb383a5c8cf9cde68af4136f7e2345259.zip | |
Added a workaround with syscall if statx function is not defined in libc
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibctypes.h | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 5 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 2 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 27 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc_private.h | 2 |
6 files changed, 33 insertions, 9 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index db7b37e9..3a278d68 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -1574,7 +1574,6 @@ #() iFiuUip #() iFillLL #() iFipiii -#() iFipiup #() iFipipi #() iFipipu #() iFipuip @@ -2019,6 +2018,7 @@ #() iFEiippi #() iFEiippp #() iFEiLLLL +#() iFEipiup #() iFEippLp #() iFElpppp #() iFEpiipp @@ -4417,6 +4417,8 @@ wrappedlibc: - prctl - iFipiip: - epoll_pwait +- iFipiup: + - statx - iFipppp: - getopt_long - getopt_long_only diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h index 17fbeaea..46c636db 100644 --- a/src/wrapped/generated/wrappedlibctypes.h +++ b/src/wrapped/generated/wrappedlibctypes.h @@ -86,6 +86,7 @@ typedef int32_t (*iFiipup_t)(int32_t, int32_t, void*, uint32_t, void*); typedef int32_t (*iFiippi_t)(int32_t, int32_t, void*, void*, int32_t); typedef int32_t (*iFiLLLL_t)(int32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); typedef int32_t (*iFipiip_t)(int32_t, void*, int32_t, int32_t, void*); +typedef int32_t (*iFipiup_t)(int32_t, void*, int32_t, uint32_t, void*); typedef int32_t (*iFipppp_t)(int32_t, void*, void*, void*, void*); typedef int32_t (*iFpiipp_t)(void*, int32_t, int32_t, void*, void*); typedef int32_t (*iFpilpV_t)(void*, int32_t, intptr_t, void*, ...); @@ -282,6 +283,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void* GO(__fxstatat64, iFiippi_t) \ GO(prctl, iFiLLLL_t) \ GO(epoll_pwait, iFipiip_t) \ + GO(statx, iFipiup_t) \ GO(getopt_long, iFipppp_t) \ GO(getopt_long_only, iFipppp_t) \ GO(scandirat, iFipppp_t) \ diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index 3ce1c4d2..be9c7b13 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -1603,7 +1603,6 @@ typedef int32_t (*iFiuuup_t)(int32_t, uint32_t, uint32_t, uint32_t, void*); typedef int32_t (*iFiuUip_t)(int32_t, uint32_t, uint64_t, int32_t, void*); typedef int32_t (*iFillLL_t)(int32_t, intptr_t, intptr_t, uintptr_t, uintptr_t); typedef int32_t (*iFipiii_t)(int32_t, void*, int32_t, int32_t, int32_t); -typedef int32_t (*iFipiup_t)(int32_t, void*, int32_t, uint32_t, void*); typedef int32_t (*iFipipi_t)(int32_t, void*, int32_t, void*, int32_t); typedef int32_t (*iFipipu_t)(int32_t, void*, int32_t, void*, uint32_t); typedef int32_t (*iFipuip_t)(int32_t, void*, uint32_t, int32_t, void*); @@ -2048,6 +2047,7 @@ typedef int8_t (*cFppLppi_t)(void*, void*, uintptr_t, void*, void*, int32_t); typedef int32_t (*iFEiippi_t)(x64emu_t*, int32_t, int32_t, void*, void*, int32_t); typedef int32_t (*iFEiippp_t)(x64emu_t*, int32_t, int32_t, void*, void*, void*); typedef int32_t (*iFEiLLLL_t)(x64emu_t*, int32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); +typedef int32_t (*iFEipiup_t)(x64emu_t*, int32_t, void*, int32_t, uint32_t, void*); typedef int32_t (*iFEippLp_t)(x64emu_t*, int32_t, void*, void*, uintptr_t, void*); typedef int32_t (*iFElpppp_t)(x64emu_t*, intptr_t, void*, void*, void*, void*); typedef int32_t (*iFEpiipp_t)(x64emu_t*, void*, int32_t, int32_t, void*, void*); @@ -4809,7 +4809,6 @@ void iFiuuup(x64emu_t *emu, uintptr_t fcn) { iFiuuup_t fn = (iFiuuup_t)fcn; R_RA void iFiuUip(x64emu_t *emu, uintptr_t fcn) { iFiuUip_t fn = (iFiuUip_t)fcn; R_RAX=(int32_t)fn((int32_t)R_RDI, (uint32_t)R_RSI, (uint64_t)R_RDX, (int32_t)R_RCX, (void*)R_R8); } void iFillLL(x64emu_t *emu, uintptr_t fcn) { iFillLL_t fn = (iFillLL_t)fcn; R_RAX=(int32_t)fn((int32_t)R_RDI, (intptr_t)R_RSI, (intptr_t)R_RDX, (uintptr_t)R_RCX, (uintptr_t)R_R8); } void iFipiii(x64emu_t *emu, uintptr_t fcn) { iFipiii_t fn = (iFipiii_t)fcn; R_RAX=(int32_t)fn((int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8); } -void iFipiup(x64emu_t *emu, uintptr_t fcn) { iFipiup_t fn = (iFipiup_t)fcn; R_RAX=(int32_t)fn((int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (uint32_t)R_RCX, (void*)R_R8); } void iFipipi(x64emu_t *emu, uintptr_t fcn) { iFipipi_t fn = (iFipipi_t)fcn; R_RAX=(int32_t)fn((int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (int32_t)R_R8); } void iFipipu(x64emu_t *emu, uintptr_t fcn) { iFipipu_t fn = (iFipipu_t)fcn; R_RAX=(int32_t)fn((int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (uint32_t)R_R8); } void iFipuip(x64emu_t *emu, uintptr_t fcn) { iFipuip_t fn = (iFipuip_t)fcn; R_RAX=(int32_t)fn((int32_t)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (void*)R_R8); } @@ -5254,6 +5253,7 @@ void cFppLppi(x64emu_t *emu, uintptr_t fcn) { cFppLppi_t fn = (cFppLppi_t)fcn; R void iFEiippi(x64emu_t *emu, uintptr_t fcn) { iFEiippi_t fn = (iFEiippi_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (int32_t)R_R8); } void iFEiippp(x64emu_t *emu, uintptr_t fcn) { iFEiippp_t fn = (iFEiippp_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8); } void iFEiLLLL(x64emu_t *emu, uintptr_t fcn) { iFEiLLLL_t fn = (iFEiLLLL_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (uintptr_t)R_RSI, (uintptr_t)R_RDX, (uintptr_t)R_RCX, (uintptr_t)R_R8); } +void iFEipiup(x64emu_t *emu, uintptr_t fcn) { iFEipiup_t fn = (iFEipiup_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (uint32_t)R_RCX, (void*)R_R8); } void iFEippLp(x64emu_t *emu, uintptr_t fcn) { iFEippLp_t fn = (iFEippLp_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (uintptr_t)R_RCX, (void*)R_R8); } void iFElpppp(x64emu_t *emu, uintptr_t fcn) { iFElpppp_t fn = (iFElpppp_t)fcn; R_RAX=(int32_t)fn(emu, (intptr_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8); } void iFEpiipp(x64emu_t *emu, uintptr_t fcn) { iFEpiipp_t fn = (iFEpiipp_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (void*)R_R8); } @@ -7705,7 +7705,6 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &iFiuUip) return 1; if (fun == &iFillLL) return 1; if (fun == &iFipiii) return 1; - if (fun == &iFipiup) return 1; if (fun == &iFipipi) return 1; if (fun == &iFipipu) return 1; if (fun == &iFipuip) return 1; diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index 01e974b3..f74191a2 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -1612,7 +1612,6 @@ void iFiuuup(x64emu_t *emu, uintptr_t fnc); void iFiuUip(x64emu_t *emu, uintptr_t fnc); void iFillLL(x64emu_t *emu, uintptr_t fnc); void iFipiii(x64emu_t *emu, uintptr_t fnc); -void iFipiup(x64emu_t *emu, uintptr_t fnc); void iFipipi(x64emu_t *emu, uintptr_t fnc); void iFipipu(x64emu_t *emu, uintptr_t fnc); void iFipuip(x64emu_t *emu, uintptr_t fnc); @@ -2057,6 +2056,7 @@ void cFppLppi(x64emu_t *emu, uintptr_t fnc); void iFEiippi(x64emu_t *emu, uintptr_t fnc); void iFEiippp(x64emu_t *emu, uintptr_t fnc); void iFEiLLLL(x64emu_t *emu, uintptr_t fnc); +void iFEipiup(x64emu_t *emu, uintptr_t fnc); void iFEippLp(x64emu_t *emu, uintptr_t fnc); void iFElpppp(x64emu_t *emu, uintptr_t fnc); void iFEpiipp(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index c9abb5e1..71b6ccbe 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -100,20 +100,24 @@ typedef int32_t (*iFippi_t)(int32_t, void*, void*, int32_t); typedef int32_t (*iFpppp_t)(void*, void*, void*, void*); typedef int32_t (*iFpipp_t)(void*, int32_t, void*, void*); typedef int32_t (*iFppii_t)(void*, void*, int32_t, int32_t); -typedef int32_t (*iFipuu_t)(int32_t, void*, uint32_t, uint32_t); +typedef int32_t (*iFipiup_t)(int, void*, int, uint32_t, void*); typedef int32_t (*iFipiI_t)(int32_t, void*, int32_t, int64_t); +typedef int32_t (*iFipuu_t)(int32_t, void*, uint32_t, uint32_t); typedef int32_t (*iFipuup_t)(int32_t, void*, uint32_t, uint32_t, void*); typedef int32_t (*iFiiV_t)(int32_t, int32_t, ...); typedef void* (*pFp_t)(void*); typedef void* (*pFpip_t)(void*, int, void*); -#define SUPER() \ +#define ADDED_FUNCTIONS() \ GO(_ITM_addUserCommitAction, iFpup_t) \ GO(_IO_file_stat, iFpp_t) \ GO(fts64_open, pFpip_t) \ GO(register_printf_specifier, iFipp_t) \ - GO(register_printf_type, iFp_t) + GO(register_printf_type, iFp_t) \ + GO(statx, iFipiup_t) + +#include "generated/wrappedlibcupstypes.h" #include "wrappercallback.h" @@ -1209,6 +1213,23 @@ EXPORT int my___fxstat64(x64emu_t *emu, int vers, int fd, void* buf) return r; } +EXPORT int my_statx(x64emu_t* emu, int dirfd, void* path, int flags, uint32_t mask, void* buf) +{ + if(my->statx) + return my->statx(dirfd, path, flags, mask, buf); + #ifdef __NR_statx + int ret = syscall(__NR_statx, dirfd, path, flags, mask, buf); + if(ret<0) { + errno = -ret; + ret = -1; + } + return ret; + #else + errno = ENOSYS; + return -1; + #endif +} + EXPORT int my___xmknod(x64emu_t* emu, int v, char* path, uint32_t mode, dev_t* dev) { (void)emu; diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index dc7fbc40..869827d1 100644 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -1901,7 +1901,7 @@ GOW(statfs, iFpp) GOW(statfs64, iFpp) GOW(statvfs, iFpp) GOW(statvfs64, iFpp) -GO(statx, iFipiup) +GOM(statx, iFEipiup) DATA(stderr, 8) DATA(stdin, 8) DATA(stdout, 8) |