1// SPDX-License-Identifier: GPL-2.0
2#include <vmlinux.h>
3#include <bpf/bpf_tracing.h>
4#include <bpf/bpf_helpers.h>
5
6struct map_value {
7	struct task_struct __kptr_untrusted *ptr;
8};
9
10struct {
11	__uint(type, BPF_MAP_TYPE_LRU_HASH);
12	__uint(max_entries, 1);
13	__type(key, int);
14	__type(value, struct map_value);
15} lru_map SEC(".maps");
16
17int pid = 0;
18int result = 1;
19
20SEC("fentry/bpf_ktime_get_ns")
21int printk(void *ctx)
22{
23	struct map_value v = {};
24
25	if (pid == bpf_get_current_task_btf()->pid)
26		bpf_map_update_elem(&lru_map, &(int){0}, &v, 0);
27	return 0;
28}
29
30SEC("fentry/do_nanosleep")
31int nanosleep(void *ctx)
32{
33	struct map_value val = {}, *v;
34	struct task_struct *current;
35
36	bpf_map_update_elem(&lru_map, &(int){0}, &val, 0);
37	v = bpf_map_lookup_elem(&lru_map, &(int){0});
38	if (!v)
39		return 0;
40	bpf_map_delete_elem(&lru_map, &(int){0});
41	current = bpf_get_current_task_btf();
42	v->ptr = current;
43	pid = current->pid;
44	bpf_ktime_get_ns();
45	result = !v->ptr;
46	return 0;
47}
48
49char _license[] SEC("license") = "GPL";
50