From c2680fd0a73cb46aadad438d3377738d257ddaa2 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 10 Nov 2023 15:05:39 +0100 Subject: Added BOX64_FUTEX_WAITV, on by default expect for BAD_SIGNAL build --- src/emu/x64syscall.c | 25 +++++++++++++++++++++---- src/include/debug.h | 1 + src/main.c | 19 +++++++++++++++++++ src/tools/rcfile.c | 1 + 4 files changed, 42 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index 51a05fb1..28ee2771 100644 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -275,9 +275,7 @@ static const scwrap_t syscallwrap[] = { #ifdef __NR_fchmodat4 { 434, __NR_fchmodat4, 4}, #endif - #ifdef __NR_futex_waitv - { 449, __NR_futex_waitv, 5}, - #endif + //{ 449, __NR_futex_waitv, 5}, }; struct mmap_arg_struct { @@ -761,11 +759,19 @@ void EXPORT x64Syscall(x64emu_t *emu) break; #ifndef __NR_fchmodat4 case 434: - *(int64_t*)R_RAX = fchmodat((int)R_EDI, (void*)R_RSI, (mode_t)R_RDX, (int)R_R10d); + *(int64_t*)&R_RAX = fchmodat((int)R_EDI, (void*)R_RSI, (mode_t)R_RDX, (int)R_R10d); if(R_EAX==0xffffffff) R_RAX = (uint64_t)-errno; break; #endif + case 449: + #ifdef __NR_futex_waitv + if(box64_futex_waitv) + R_RAX = syscall(__NR_futex_waitv, R_RDI, R_RSI, R_RDX, R_R10, R_R8); + else + #endif + R_RAX = (uint64_t)-ENOSYS; + break; default: printf_log(LOG_INFO, "Error: Unsupported Syscall 0x%02Xh (%d)\n", s, s); emu->quit = 1; @@ -1023,6 +1029,17 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) case 434: return (int)fchmodat((int)R_ESI, (void*)R_RDX, (mode_t)R_RCX, (int)R_R8d); #endif + case 449: + #ifdef __NR_futex_waitv + if(box64_futex_waitv) + return syscall(__NR_futex_waitv, R_RSI, R_RDX, R_RCX, R_R8, R_R9); + else + #endif + { + errno = ENOSYS; + return -1; + } + break; default: if(!(warned&(1<='0' && p[0]<='0'+1) + box64_futex_waitv = p[0]-'0'; + } + #ifdef BAD_SIGNAL + if(box64_futex_waitv) + printf_log(LOG_INFO, "Enable the use of futex waitv syscall (if available on the system\n"); + #else + if(!box64_futex_waitv) + printf_log(LOG_INFO, "Disable the use of futex waitv syscall\n"); + #endif + } p = getenv("BOX64_FIX_64BIT_INODES"); if(p) { if(strlen(p)==1) { diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c index 4217bf8d..ee8a2337 100644 --- a/src/tools/rcfile.c +++ b/src/tools/rcfile.c @@ -100,6 +100,7 @@ ENTRYBOOL(BOX64_CRASHHANDLER, box64_dummy_crashhandler) \ ENTRYBOOL(BOX64_NOPULSE, box64_nopulse) \ ENTRYBOOL(BOX64_NOGTK, box64_nogtk) \ ENTRYBOOL(BOX64_NOVULKAN, box64_novulkan) \ +ENTRYBOOL(BOX64_FUTEX_WAITV, box64_futex_waitv) \ ENTRYSTRING_(BOX64_BASH, bash) \ ENTRYINT(BOX64_JITGDB, jit_gdb, 0, 2, 2) \ ENTRYBOOL(BOX64_NOSANDBOX, box64_nosandbox) \ -- cgit 1.4.1