about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-06-05 17:51:28 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-06-05 17:51:28 +0200
commita5be3727e9df6de1cff249da4126cd5d9263f354 (patch)
tree82d4f06c0309006184b09d576160451da1dd5081
parent836b646e24f21bc63ed1a5f1d93c8b96b009c1db (diff)
downloadbox64-a5be3727e9df6de1cff249da4126cd5d9263f354.tar.gz
box64-a5be3727e9df6de1cff249da4126cd5d9263f354.zip
Better handling of on-purpose SIGSEGV
-rwxr-xr-xsrc/emu/x64syscall.c6
-rwxr-xr-xsrc/libtools/signals.c19
2 files changed, 21 insertions, 4 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index 4da443a0..c14a4df4 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -88,6 +88,7 @@ scwrap_t syscallwrap[] = {
     { 23, __NR_select, 5},
     #endif
     //{ 25, __NR_mremap, 5},    // wrapped to track protection
+    { 39, __NR_getpid, 0},
     { 46, __NR_sendmsg, 3},
     { 47, __NR_recvmsg, 3},
     { 53, __NR_socketpair, 4},
@@ -95,6 +96,7 @@ scwrap_t syscallwrap[] = {
     { 57, __NR_fork, 0 },    // should wrap this one, because of the struct pt_regs (the only arg)?
     #endif
     { 61, __NR_wait4, 4},
+    { 66, __NR_semctl, 4},
     #ifdef __NR_getdents
     { 78, __NR_getdents, 3},
     #endif
@@ -105,18 +107,22 @@ scwrap_t syscallwrap[] = {
     { 87, __NR_unlink, 1},
     #endif
     //{ 89, __NR_readlink, 3},  // not always existing, better use the wrapped version anyway
+    { 96, __NR_gettimeofday, 2},
     { 97, __NR_getrlimit, 2},
     { 101, __NR_ptrace, 4},
     { 126, __NR_capset, 2},
     //{ 131, __NR_sigaltstack, 2},  // wrapped to use my_sigaltstack
     { 157, __NR_prctl, 5 },     // needs wrapping?
     { 186, __NR_gettid, 0 },    //0xBA
+    { 200, __NR_tkill, 2 },
     #ifdef __NR_time
     { 201, __NR_time, 1},
     #endif
     { 202, __NR_futex, 6},
     { 217, __NR_getdents64, 3},
     { 228, __NR_clock_gettime, 2},
+    { 229, __NR_clock_getres, 2},
+    { 230, __NR_clock_nanosleep, 4},
     { 234, __NR_tgkill, 3},
     #ifdef __NR_inotify_init
     { 253, __NR_inotify_init, 0},   //0xFD
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index adc28413..34669f30 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -771,11 +771,22 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx)
         if(db && db->x64_addr>= addr && (db->x64_addr+db->x64_size)<addr) {
             dynarec_log(LOG_INFO, "Warning, addr inside current dynablock!\n");
         }
+        static void* glitch_pc = NULL;
+        static void* glitch_addr = NULL;
+        static int glitch_prot = 0;
         if(addr && pc && db) {
-            // probably a glitch due to intensive multitask...
-            dynarec_log(/*LOG_DEBUG*/LOG_INFO, "SIGSEGV with Access error on %p for %p , db=%p, retrying\n", pc, addr, db);
-            relockMutex(Locks);
-            return; // try again
+            if((glitch_pc!=pc || glitch_addr!=addr || glitch_prot!=prot)) {
+                // probably a glitch due to intensive multitask...
+                dynarec_log(/*LOG_DEBUG*/LOG_INFO, "SIGSEGV with Access error on %p for %p , db=%p, retrying\n", pc, addr, db);
+                relockMutex(Locks);
+                glitch_pc = pc;
+                glitch_addr = addr;
+                glitch_prot = prot;
+                return; // try again
+            }
+            glitch_pc = NULL;
+            glitch_addr = NULL;
+            glitch_prot = 0;
         }
     }
 #else