aboutsummaryrefslogtreecommitdiff
path: root/process_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'process_event.c')
-rw-r--r--process_event.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/process_event.c b/process_event.c
index 9e6ef81..177fc6a 100644
--- a/process_event.c
+++ b/process_event.c
@@ -24,7 +24,9 @@ static void process_signal(struct event *event);
static void process_exit(struct event *event);
static void process_exit_signal(struct event *event);
static void process_syscall(struct event *event);
+static void process_arch_syscall(struct event *event);
static void process_sysret(struct event *event);
+static void process_arch_sysret(struct event *event);
static void process_breakpoint(struct event *event);
static void remove_proc(struct process *proc);
@@ -81,6 +83,24 @@ static char *sysname(struct process *proc, int sysnum)
}
}
+static char *arch_sysname(struct process *proc, int sysnum)
+{
+ static char result[128];
+ static char *arch_syscalent[] = {
+#include "arch_syscallent.h"
+ };
+ int nsyscals = sizeof arch_syscalent / sizeof arch_syscalent[0];
+
+ if (sysnum < 0 || sysnum >= nsyscals) {
+ sprintf(result, "ARCH_%d", sysnum);
+ return result;
+ } else {
+ sprintf(result, "ARCH_%s",
+ arch_syscalent[sysnum]);
+ return result;
+ }
+}
+
void process_event(struct event *event)
{
switch (event->thing) {
@@ -115,6 +135,18 @@ void process_event(struct event *event)
event->e_un.sysnum);
process_sysret(event);
return;
+ case LT_EV_ARCH_SYSCALL:
+ debug(1, "event: arch_syscall (%s [%d])",
+ arch_sysname(event->proc, event->e_un.sysnum),
+ event->e_un.sysnum);
+ process_arch_syscall(event);
+ return;
+ case LT_EV_ARCH_SYSRET:
+ debug(1, "event: arch_sysret (%s [%d])",
+ arch_sysname(event->proc, event->e_un.sysnum),
+ event->e_un.sysnum);
+ process_arch_sysret(event);
+ return;
case LT_EV_BREAKPOINT:
debug(1, "event: breakpoint");
process_breakpoint(event);
@@ -194,6 +226,19 @@ static void process_syscall(struct event *event)
continue_process(event->proc->pid);
}
+static void process_arch_syscall(struct event *event)
+{
+ if (opt_S) {
+ output_left(LT_TOF_SYSCALL, event->proc,
+ arch_sysname(event->proc, event->e_un.sysnum));
+ }
+ if (event->proc->breakpoints_enabled == 0) {
+ enable_all_breakpoints(event->proc);
+ }
+ callstack_push_syscall(event->proc, 0xf0000 + event->e_un.sysnum);
+ continue_process(event->proc->pid);
+}
+
struct timeval current_time_spent;
static void calc_time_spent(struct process *proc)
@@ -242,6 +287,19 @@ static void process_sysret(struct event *event)
continue_process(event->proc->pid);
}
+static void process_arch_sysret(struct event *event)
+{
+ if (opt_T || opt_c) {
+ calc_time_spent(event->proc);
+ }
+ callstack_pop(event->proc);
+ if (opt_S) {
+ output_right(LT_TOF_SYSCALLR, event->proc,
+ arch_sysname(event->proc, event->e_un.sysnum));
+ }
+ continue_process(event->proc->pid);
+}
+
static void process_breakpoint(struct event *event)
{
int i, j;