diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-05 17:51:28 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-05 17:51:28 +0200 |
| commit | a5be3727e9df6de1cff249da4126cd5d9263f354 (patch) | |
| tree | 82d4f06c0309006184b09d576160451da1dd5081 | |
| parent | 836b646e24f21bc63ed1a5f1d93c8b96b009c1db (diff) | |
| download | box64-a5be3727e9df6de1cff249da4126cd5d9263f354.tar.gz box64-a5be3727e9df6de1cff249da4126cd5d9263f354.zip | |
Better handling of on-purpose SIGSEGV
| -rwxr-xr-x | src/emu/x64syscall.c | 6 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 19 |
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 |