summaryrefslogtreecommitdiff
path: root/internal/c
diff options
context:
space:
mode:
Diffstat (limited to 'internal/c')
-rw-r--r--internal/c/filter.c8
-rw-r--r--internal/c/generated_tracepoints.c29
-rw-r--r--internal/c/generated_tracepoints_result.txt1
3 files changed, 6 insertions, 32 deletions
diff --git a/internal/c/filter.c b/internal/c/filter.c
index 48907d8..5440bcc 100644
--- a/internal/c/filter.c
+++ b/internal/c/filter.c
@@ -79,9 +79,11 @@ static __always_inline int ior_on_syscall_enter(__u32 tid, __u32 enter_trace_id)
}
// ior_on_noreturn_syscall_enter is the enter hook for noreturn syscalls
-// (exit, exit_group). Unlike ior_on_syscall_enter it deliberately does NOT
-// write a per-tid entry into syscall_enter_state_map. A noreturn syscall never
-// returns to userspace, so its sys_exit tracepoint never fires and the matching
+// (exit, exit_group, rt_sigreturn). Unlike ior_on_syscall_enter it deliberately
+// does NOT write a per-tid entry into syscall_enter_state_map. A noreturn
+// syscall never returns to the syscall site (exit/exit_group terminate;
+// rt_sigreturn restores the pre-signal context), so its sys_exit tracepoint
+// never fires and the matching
// exit handler is suppressed by the generator (see internal/generate/codegen.go
// isNoreturnSyscall). With no exit handler, nothing would ever look up or
// bpf_map_delete_elem that enter-state entry, so recording it would only leave
diff --git a/internal/c/generated_tracepoints.c b/internal/c/generated_tracepoints.c
index a8437df..5c72813 100644
--- a/internal/c/generated_tracepoints.c
+++ b/internal/c/generated_tracepoints.c
@@ -732,7 +732,6 @@
#define SYS_ENTER_IOPL 93
#define SYS_EXIT_IOPL 92
#define SYS_ENTER_RT_SIGRETURN 57
-#define SYS_EXIT_RT_SIGRETURN 56
/// sys_enter_socket is a struct socket_event (kind=socket)
SEC("tracepoint/syscalls/sys_enter_socket")
@@ -19659,7 +19658,7 @@ int handle_sys_enter_rt_sigreturn(struct syscall_trace_enter *ctx) {
if (filter(&pid, &tid))
return 0;
- if (!ior_on_syscall_enter(tid, SYS_ENTER_RT_SIGRETURN))
+ if (!ior_on_noreturn_syscall_enter(SYS_ENTER_RT_SIGRETURN))
return 0;
struct null_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct null_event), 0);
@@ -19676,29 +19675,3 @@ int handle_sys_enter_rt_sigreturn(struct syscall_trace_enter *ctx) {
return 0;
}
-/// sys_exit_rt_sigreturn is a struct ret_event (UNCLASSIFIED) (kind=ret)
-SEC("tracepoint/syscalls/sys_exit_rt_sigreturn")
-int handle_sys_exit_rt_sigreturn(struct syscall_trace_exit *ctx) {
- __u32 pid, tid;
- if (filter(&pid, &tid))
- return 0;
-
- if (!ior_on_syscall_exit(tid, SYS_ENTER_RT_SIGRETURN, ctx->ret))
- return 0;
-
- struct ret_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct ret_event), 0);
- if (!ev)
- return 0;
-
- ev->event_type = EXIT_RET_EVENT;
- ev->trace_id = SYS_EXIT_RT_SIGRETURN;
- ev->pid = pid;
- ev->tid = tid;
- ev->time = bpf_ktime_get_boot_ns();
- ev->ret = ctx->ret;
- ev->ret_type = UNCLASSIFIED;
-
- bpf_ringbuf_submit(ev, 0);
- return 0;
-}
-
diff --git a/internal/c/generated_tracepoints_result.txt b/internal/c/generated_tracepoints_result.txt
index 3587939..971f92c 100644
--- a/internal/c/generated_tracepoints_result.txt
+++ b/internal/c/generated_tracepoints_result.txt
@@ -622,7 +622,6 @@ sys_exit_rt_sigaction is a struct ret_event (UNCLASSIFIED) (kind=ret)
sys_exit_rt_sigpending is a struct ret_event (UNCLASSIFIED) (kind=ret)
sys_exit_rt_sigprocmask is a struct ret_event (UNCLASSIFIED) (kind=ret)
sys_exit_rt_sigqueueinfo is a struct ret_event (UNCLASSIFIED) (kind=ret)
-sys_exit_rt_sigreturn is a struct ret_event (UNCLASSIFIED) (kind=ret)
sys_exit_rt_sigsuspend is a struct ret_event (UNCLASSIFIED) (kind=ret)
sys_exit_rt_sigtimedwait is a struct ret_event (UNCLASSIFIED) (kind=ret)
sys_exit_rt_tgsigqueueinfo is a struct ret_event (UNCLASSIFIED) (kind=ret)