1*1f87dcf1SSong Liu // SPDX-License-Identifier: GPL-2.0
2*1f87dcf1SSong Liu /* Copyright (c) 2021 Facebook */
3*1f87dcf1SSong Liu 
4*1f87dcf1SSong Liu #include "vmlinux.h"
5*1f87dcf1SSong Liu #include <bpf/bpf_helpers.h>
6*1f87dcf1SSong Liu #include <bpf/bpf_tracing.h>
7*1f87dcf1SSong Liu 
8*1f87dcf1SSong Liu char _license[] SEC("license") = "GPL";
9*1f87dcf1SSong Liu 
10*1f87dcf1SSong Liu struct {
11*1f87dcf1SSong Liu 	__uint(type, BPF_MAP_TYPE_TASK_STORAGE);
12*1f87dcf1SSong Liu 	__uint(map_flags, BPF_F_NO_PREALLOC);
13*1f87dcf1SSong Liu 	__type(key, int);
14*1f87dcf1SSong Liu 	__type(value, long);
15*1f87dcf1SSong Liu } enter_id SEC(".maps");
16*1f87dcf1SSong Liu 
17*1f87dcf1SSong Liu #define MAGIC_VALUE 0xabcd1234
18*1f87dcf1SSong Liu 
19*1f87dcf1SSong Liu pid_t target_pid = 0;
20*1f87dcf1SSong Liu int mismatch_cnt = 0;
21*1f87dcf1SSong Liu int enter_cnt = 0;
22*1f87dcf1SSong Liu int exit_cnt = 0;
23*1f87dcf1SSong Liu 
24*1f87dcf1SSong Liu SEC("tp_btf/sys_enter")
BPF_PROG(on_enter,struct pt_regs * regs,long id)25*1f87dcf1SSong Liu int BPF_PROG(on_enter, struct pt_regs *regs, long id)
26*1f87dcf1SSong Liu {
27*1f87dcf1SSong Liu 	struct task_struct *task;
28*1f87dcf1SSong Liu 	long *ptr;
29*1f87dcf1SSong Liu 
30*1f87dcf1SSong Liu 	task = bpf_get_current_task_btf();
31*1f87dcf1SSong Liu 	if (task->pid != target_pid)
32*1f87dcf1SSong Liu 		return 0;
33*1f87dcf1SSong Liu 
34*1f87dcf1SSong Liu 	ptr = bpf_task_storage_get(&enter_id, task, 0,
35*1f87dcf1SSong Liu 				   BPF_LOCAL_STORAGE_GET_F_CREATE);
36*1f87dcf1SSong Liu 	if (!ptr)
37*1f87dcf1SSong Liu 		return 0;
38*1f87dcf1SSong Liu 
39*1f87dcf1SSong Liu 	__sync_fetch_and_add(&enter_cnt, 1);
40*1f87dcf1SSong Liu 	*ptr = MAGIC_VALUE + enter_cnt;
41*1f87dcf1SSong Liu 
42*1f87dcf1SSong Liu 	return 0;
43*1f87dcf1SSong Liu }
44*1f87dcf1SSong Liu 
45*1f87dcf1SSong Liu SEC("tp_btf/sys_exit")
BPF_PROG(on_exit,struct pt_regs * regs,long id)46*1f87dcf1SSong Liu int BPF_PROG(on_exit, struct pt_regs *regs, long id)
47*1f87dcf1SSong Liu {
48*1f87dcf1SSong Liu 	struct task_struct *task;
49*1f87dcf1SSong Liu 	long *ptr;
50*1f87dcf1SSong Liu 
51*1f87dcf1SSong Liu 	task = bpf_get_current_task_btf();
52*1f87dcf1SSong Liu 	if (task->pid != target_pid)
53*1f87dcf1SSong Liu 		return 0;
54*1f87dcf1SSong Liu 
55*1f87dcf1SSong Liu 	ptr = bpf_task_storage_get(&enter_id, task, 0,
56*1f87dcf1SSong Liu 				   BPF_LOCAL_STORAGE_GET_F_CREATE);
57*1f87dcf1SSong Liu 	if (!ptr)
58*1f87dcf1SSong Liu 		return 0;
59*1f87dcf1SSong Liu 
60*1f87dcf1SSong Liu 	__sync_fetch_and_add(&exit_cnt, 1);
61*1f87dcf1SSong Liu 	if (*ptr != MAGIC_VALUE + exit_cnt)
62*1f87dcf1SSong Liu 		__sync_fetch_and_add(&mismatch_cnt, 1);
63*1f87dcf1SSong Liu 	return 0;
64*1f87dcf1SSong Liu }
65