Don't queue sysret events
- That's because on s390x, we use process call stack to actually figure out
whether it's a syscall/sysret event, and if it's sysret, then what syscall
it returns from. So we need to keep the stack in sync with reality.
diff --git a/handle_event.c b/handle_event.c
index f56c537..e527c0f 100644
--- a/handle_event.c
+++ b/handle_event.c
@@ -70,7 +70,9 @@
/* Note: the previous handler has a chance to alter
* the event. */
- if (event->proc->leader != NULL) {
+ if (event->proc != NULL
+ && event->proc->leader != NULL
+ && event->proc != event->proc->leader) {
event = call_handler(event->proc->leader, event);
if (event == NULL)
return;
@@ -454,7 +456,7 @@
enable_all_breakpoints(event->proc);
}
}
- continue_process(event->proc->pid);
+ continue_after_syscall(event->proc, event->e_un.sysnum, 0);
}
static void
@@ -533,9 +535,12 @@
output_right(LT_TOF_SYSCALLR, event->proc,
sysname(event->proc, event->e_un.sysnum));
}
+ assert(event->proc->callstack_depth > 0);
+ unsigned d = event->proc->callstack_depth - 1;
+ assert(event->proc->callstack[d].is_syscall);
callstack_pop(event->proc);
}
- continue_process(event->proc->pid);
+ continue_after_syscall(event->proc, event->e_un.sysnum, 1);
}
static void