xref: /aosp_15_r20/external/bcc/libbpf-tools/exitsnoop.bpf.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2*387f9dfdSAndroid Build Coastguard Worker /* Copyright (c) 2021 Hengqi Chen */
3*387f9dfdSAndroid Build Coastguard Worker #include <vmlinux.h>
4*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_helpers.h>
5*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_core_read.h>
6*387f9dfdSAndroid Build Coastguard Worker #include "exitsnoop.h"
7*387f9dfdSAndroid Build Coastguard Worker 
8*387f9dfdSAndroid Build Coastguard Worker const volatile bool filter_cg = false;
9*387f9dfdSAndroid Build Coastguard Worker const volatile pid_t target_pid = 0;
10*387f9dfdSAndroid Build Coastguard Worker const volatile bool trace_failed_only = false;
11*387f9dfdSAndroid Build Coastguard Worker const volatile bool trace_by_process = true;
12*387f9dfdSAndroid Build Coastguard Worker 
13*387f9dfdSAndroid Build Coastguard Worker struct {
14*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
15*387f9dfdSAndroid Build Coastguard Worker 	__type(key, u32);
16*387f9dfdSAndroid Build Coastguard Worker 	__type(value, u32);
17*387f9dfdSAndroid Build Coastguard Worker 	__uint(max_entries, 1);
18*387f9dfdSAndroid Build Coastguard Worker } cgroup_map SEC(".maps");
19*387f9dfdSAndroid Build Coastguard Worker 
20*387f9dfdSAndroid Build Coastguard Worker struct {
21*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
22*387f9dfdSAndroid Build Coastguard Worker 	__uint(key_size, sizeof(__u32));
23*387f9dfdSAndroid Build Coastguard Worker 	__uint(value_size, sizeof(__u32));
24*387f9dfdSAndroid Build Coastguard Worker } events SEC(".maps");
25*387f9dfdSAndroid Build Coastguard Worker 
26*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/sched/sched_process_exit")
sched_process_exit(void * ctx)27*387f9dfdSAndroid Build Coastguard Worker int sched_process_exit(void *ctx)
28*387f9dfdSAndroid Build Coastguard Worker {
29*387f9dfdSAndroid Build Coastguard Worker 	__u64 pid_tgid = bpf_get_current_pid_tgid();
30*387f9dfdSAndroid Build Coastguard Worker 	__u32 pid = pid_tgid >> 32;
31*387f9dfdSAndroid Build Coastguard Worker 	__u32 tid = (__u32)pid_tgid;
32*387f9dfdSAndroid Build Coastguard Worker 	int exit_code;
33*387f9dfdSAndroid Build Coastguard Worker 	struct task_struct *task;
34*387f9dfdSAndroid Build Coastguard Worker 	struct event event = {};
35*387f9dfdSAndroid Build Coastguard Worker 
36*387f9dfdSAndroid Build Coastguard Worker 	if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0))
37*387f9dfdSAndroid Build Coastguard Worker 		return 0;
38*387f9dfdSAndroid Build Coastguard Worker 
39*387f9dfdSAndroid Build Coastguard Worker 	if (target_pid && target_pid != pid)
40*387f9dfdSAndroid Build Coastguard Worker 		return 0;
41*387f9dfdSAndroid Build Coastguard Worker 
42*387f9dfdSAndroid Build Coastguard Worker 	if (trace_by_process && pid != tid)
43*387f9dfdSAndroid Build Coastguard Worker 		return 0;
44*387f9dfdSAndroid Build Coastguard Worker 
45*387f9dfdSAndroid Build Coastguard Worker 	task = (struct task_struct *)bpf_get_current_task();
46*387f9dfdSAndroid Build Coastguard Worker 	exit_code = BPF_CORE_READ(task, exit_code);
47*387f9dfdSAndroid Build Coastguard Worker 	if (trace_failed_only && exit_code == 0)
48*387f9dfdSAndroid Build Coastguard Worker 		return 0;
49*387f9dfdSAndroid Build Coastguard Worker 
50*387f9dfdSAndroid Build Coastguard Worker 	event.start_time = BPF_CORE_READ(task, start_time);
51*387f9dfdSAndroid Build Coastguard Worker 	event.exit_time = bpf_ktime_get_ns();
52*387f9dfdSAndroid Build Coastguard Worker 	event.pid = pid;
53*387f9dfdSAndroid Build Coastguard Worker 	event.tid = tid;
54*387f9dfdSAndroid Build Coastguard Worker 	event.ppid = BPF_CORE_READ(task, real_parent, tgid);
55*387f9dfdSAndroid Build Coastguard Worker 	event.sig = exit_code & 0xff;
56*387f9dfdSAndroid Build Coastguard Worker 	event.exit_code = exit_code >> 8;
57*387f9dfdSAndroid Build Coastguard Worker 	bpf_get_current_comm(event.comm, sizeof(event.comm));
58*387f9dfdSAndroid Build Coastguard Worker 	bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
59*387f9dfdSAndroid Build Coastguard Worker 	return 0;
60*387f9dfdSAndroid Build Coastguard Worker }
61*387f9dfdSAndroid Build Coastguard Worker 
62*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "Dual BSD/GPL";
63