about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-07-15 14:14:56 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-07-15 14:14:56 +0200
commit038c940e8eeb5b13b30f9c2197cab47794d5c4f5 (patch)
tree60cfdd897b1b95caefdb84c4fee45064ad259415 /src
parent20067c02bc074d622cc9cbd12e6b63be07235416 (diff)
downloadbox64-038c940e8eeb5b13b30f9c2197cab47794d5c4f5.tar.gz
box64-038c940e8eeb5b13b30f9c2197cab47794d5c4f5.zip
Fix sigaction syscall
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64syscall.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index 6fd8d942..a4c86ce3 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -30,7 +30,7 @@
 //#include "myalign.h"
 #include "box64context.h"
 #include "callback.h"
-//#include "signals.h"
+#include "signals.h"
 #include "x64tls.h"
 
 typedef struct x64_sigaction_s x64_sigaction_t;
@@ -337,7 +337,25 @@ void EXPORT x64Syscall(x64emu_t *emu)
             *(int64_t*)&R_RAX = my_munmap(emu, (void*)R_RDI, R_RSI);
             break;
         case 13: // sys_rt_sigaction
-            *(int64_t*)&R_RAX = my_sigaction(emu, (int)R_EDI, (const x64_sigaction_t *)R_RSI, (x64_sigaction_t *)R_RDX/*, (size_t)R_R10*/);
+            {
+                x64_sigaction_t n ={0};
+                x64_sigaction_t o = {0};
+                if(R_RSI) {
+                    x64_sigaction_restorer_t *p = (x64_sigaction_restorer_t*)R_RSI;
+                    n._u._sa_sigaction = p->_u._sa_sigaction;
+                    n.sa_flags = p->sa_flags;
+                    n.sa_restorer = p->sa_restorer;
+                    memcpy(&n.sa_mask, &p->sa_mask, R_R10);
+                }
+                R_RAX = (int64_t)(int64_t)my_sigaction(emu, (int)R_EDI, R_RSI?&n:NULL, R_RDX?&o:NULL/*, (size_t)R_R10*/);
+                if(R_RAX>=0 && R_RDX) {
+                    x64_sigaction_restorer_t *p = (x64_sigaction_restorer_t*)R_RDX;
+                    p->_u._sa_sigaction = o._u._sa_sigaction;
+                    p->sa_flags = o.sa_flags;
+                    p->sa_restorer = o.sa_restorer;
+                    memcpy(&p->sa_mask, &o.sa_mask, R_R10);
+                }
+            }
             break;
         #ifndef __NR_access
         case 21: // sys_access
@@ -538,7 +556,26 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
         case 11: // sys_munmap
             return (uint64_t)(int64_t)my_munmap(emu, (void*)R_RSI, R_RDX);
         case 13: // sys_rt_sigaction
-            return (uint64_t)(int64_t)my_sigaction(emu, (int)R_ESI, (const x64_sigaction_t *)R_RDX, (x64_sigaction_t *)R_RCX/*, (size_t)R_R8*/);
+            {
+                x64_sigaction_t n ={0};
+                x64_sigaction_t o = {0};
+                if(R_RDX) {
+                    x64_sigaction_restorer_t *p = (x64_sigaction_restorer_t*)R_RDX;
+                    n._u._sa_sigaction = p->_u._sa_sigaction;
+                    n.sa_flags = p->sa_flags;
+                    n.sa_restorer = p->sa_restorer;
+                    memcpy(&n.sa_mask, &p->sa_mask, R_R8);
+                }
+                uint64_t ret = (uint64_t)(int64_t)my_sigaction(emu, (int)R_ESI, R_RDX?&n:NULL, R_RCX?&o:NULL/*, (size_t)R_R8*/);
+                if(R_RCX) {
+                    x64_sigaction_restorer_t *p = (x64_sigaction_restorer_t*)R_RCX;
+                    p->_u._sa_sigaction = o._u._sa_sigaction;
+                    p->sa_flags = o.sa_flags;
+                    p->sa_restorer = o.sa_restorer;
+                    memcpy(&p->sa_mask, &o.sa_mask, R_R8);
+                }
+                return ret;
+            }
         #ifndef __NR_access
         case 21: // sys_access
             return (uint64_t)(int64_t)access((void*)R_RSI, R_EDX);