about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-09-12 13:56:51 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-09-12 13:56:51 +0200
commitc8c09d7e099320e55fb82a0d3019ff62d0cf8bc9 (patch)
treeb9fc81f6cd77bfde401adae7945589cfa14476db /src
parent411163c73f4acdd22b4a5058d50f7c6210dc6d0e (diff)
downloadbox64-c8c09d7e099320e55fb82a0d3019ff62d0cf8bc9.tar.gz
box64-c8c09d7e099320e55fb82a0d3019ff62d0cf8bc9.zip
Try to improve syscall rt_sigaction handling
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64syscall.c12
-rwxr-xr-xsrc/libtools/signals.c10
2 files changed, 17 insertions, 5 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index db71cd08..803f9dd2 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -363,6 +363,9 @@ void EXPORT x64Syscall(x64emu_t *emu)
             *(int64_t*)&R_RAX = my_munmap(emu, (void*)R_RDI, R_RSI);
             break;
         case 13: // sys_rt_sigaction
+            #if 1
+            R_RAX = (int64_t)my_syscall_rt_sigaction(emu, (int)R_EDI, (const x64_sigaction_restorer_t *)R_RSI, (x64_sigaction_restorer_t *)R_RDX, (size_t)R_R10);
+            #else
             {
                 x64_sigaction_t n ={0};
                 x64_sigaction_t o = {0};
@@ -382,6 +385,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
                     memcpy(&p->sa_mask, &o.sa_mask, R_R10);
                 }
             }
+            #endif
             break;
         #ifndef __NR_access
         case 21: // sys_access
@@ -590,10 +594,13 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
         case 9: // sys_mmap
             return (uintptr_t)my_mmap64(emu, (void*)R_RSI, R_RDX, (int)R_RCX, (int)R_R8d, (int)R_R9, i64(0));
         case 10: // sys_mprotect
-            return (uint64_t)(int64_t)my_mprotect(emu, (void*)R_RSI, R_RDX, (int)R_ECX);
+            return (uint64_t)my_mprotect(emu, (void*)R_RSI, R_RDX, (int)R_ECX);
         case 11: // sys_munmap
-            return (uint64_t)(int64_t)my_munmap(emu, (void*)R_RSI, R_RDX);
+            return (uint64_t)my_munmap(emu, (void*)R_RSI, R_RDX);
         case 13: // sys_rt_sigaction
+            #if 1
+            return my_syscall_rt_sigaction(emu, (int)R_ESI, (const x64_sigaction_restorer_t *)R_RDX, (x64_sigaction_restorer_t *)R_RCX, (size_t)R_R8);
+            #else
             {
                 x64_sigaction_t n ={0};
                 x64_sigaction_t o = {0};
@@ -614,6 +621,7 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
                 }
                 return ret;
             }
+            #endif
         #ifndef __NR_access
         case 21: // sys_access
             return (uint64_t)(int64_t)access((void*)R_RSI, R_EDX);
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index df0b7d0b..72bd00fc 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -1075,7 +1075,7 @@ void emit_signal(x64emu_t* emu, int sig, void* addr, int code)
     ucontext_t ctx = {0};
     siginfo_t info = {0};
     info.si_signo = sig;
-    info.si_errno = (sig==SIGSEGV)?0x1234:0;    // MAark as a sign this is a #GP(0) (like privileged instruction)
+    info.si_errno = (sig==SIGSEGV)?0x1234:0;    // Mark as a sign this is a #GP(0) (like privileged instruction)
     info.si_code = code;
     info.si_addr = addr;
     const char* x64name = NULL;
@@ -1122,8 +1122,10 @@ EXPORT sighandler_t my_sysv_signal(x64emu_t* emu, int signum, sighandler_t handl
 
 int EXPORT my_sigaction(x64emu_t* emu, int signum, const x64_sigaction_t *act, x64_sigaction_t *oldact)
 {
-    if(signum<0 || signum>=MAX_SIGNAL)
+    if(signum<0 || signum>=MAX_SIGNAL) {
+        errno = EINVAL;
         return -1;
+    }
     
     if(signum==SIGSEGV && emu->context->no_sigsegv)
         return 0;
@@ -1174,8 +1176,10 @@ __attribute__((alias("my_sigaction")));
 int EXPORT my_syscall_rt_sigaction(x64emu_t* emu, int signum, const x64_sigaction_restorer_t *act, x64_sigaction_restorer_t *oldact, int sigsetsize)
 {
     printf_log(LOG_DEBUG, "Syscall/Sigaction(signum=%d, act=%p, old=%p, size=%d)\n", signum, act, oldact, sigsetsize);
-    if(signum<0 || signum>=MAX_SIGNAL)
+    if(signum<0 || signum>=MAX_SIGNAL) {
+        errno = EINVAL;
         return -1;
+    }
     
     if(signum==SIGSEGV && emu->context->no_sigsegv)
         return 0;