aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/csource
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-10-16 13:57:37 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-10-16 14:21:54 +0200
commitc2337c94bffa1e752c0523c3c7d46522d317e238 (patch)
treeac45636efd0c4e2f7cb72df5c9f47e4aac1acc4f /pkg/csource
parent85b1f93f8dbbc767c564e494a6353aa3517d5d49 (diff)
executor: fix akaros nonfailing mode
Diffstat (limited to 'pkg/csource')
-rw-r--r--pkg/csource/akaros_common.go10
1 files changed, 9 insertions, 1 deletions
diff --git a/pkg/csource/akaros_common.go b/pkg/csource/akaros_common.go
index 74e7e310b..669020aa8 100644
--- a/pkg/csource/akaros_common.go
+++ b/pkg/csource/akaros_common.go
@@ -19,6 +19,7 @@ var commonHeaderAkaros = `
#include <time.h>
#endif
#if defined(SYZ_EXECUTOR) || defined(SYZ_HANDLE_SEGV)
+#include <parlib/parlib.h>
#include <setjmp.h>
#include <signal.h>
#endif
@@ -194,6 +195,11 @@ static uint16_t csum_inet_digest(struct csum_inet* csum)
static __thread int skip_segv;
static __thread jmp_buf segv_env;
+static void recover()
+{
+ _longjmp(segv_env, 1);
+}
+
static void segv_handler(int sig, siginfo_t* info, void* ctx)
{
uintptr_t addr = (uintptr_t)info->si_addr;
@@ -201,7 +207,9 @@ static void segv_handler(int sig, siginfo_t* info, void* ctx)
const uintptr_t prog_end = 100 << 20;
if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) && (addr < prog_start || addr > prog_end)) {
debug("SIGSEGV on %p, skipping\n", addr);
- siglongjmp(segv_env, 1);
+ struct user_context* uctx = (struct user_context*)ctx;
+ uctx->tf.hw_tf.tf_rip = (long)(void*)recover;
+ return;
}
debug("SIGSEGV on %p, exiting\n", addr);
doexit(sig);