162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <vmlinux.h>
362306a36Sopenharmony_ci#include <bpf/bpf_tracing.h>
462306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_cistruct map_value {
762306a36Sopenharmony_ci	struct task_struct __kptr_untrusted *ptr;
862306a36Sopenharmony_ci};
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct {
1162306a36Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_LRU_HASH);
1262306a36Sopenharmony_ci	__uint(max_entries, 1);
1362306a36Sopenharmony_ci	__type(key, int);
1462306a36Sopenharmony_ci	__type(value, struct map_value);
1562306a36Sopenharmony_ci} lru_map SEC(".maps");
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciint pid = 0;
1862306a36Sopenharmony_ciint result = 1;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciSEC("fentry/bpf_ktime_get_ns")
2162306a36Sopenharmony_ciint printk(void *ctx)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	struct map_value v = {};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	if (pid == bpf_get_current_task_btf()->pid)
2662306a36Sopenharmony_ci		bpf_map_update_elem(&lru_map, &(int){0}, &v, 0);
2762306a36Sopenharmony_ci	return 0;
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciSEC("fentry/do_nanosleep")
3162306a36Sopenharmony_ciint nanosleep(void *ctx)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	struct map_value val = {}, *v;
3462306a36Sopenharmony_ci	struct task_struct *current;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	bpf_map_update_elem(&lru_map, &(int){0}, &val, 0);
3762306a36Sopenharmony_ci	v = bpf_map_lookup_elem(&lru_map, &(int){0});
3862306a36Sopenharmony_ci	if (!v)
3962306a36Sopenharmony_ci		return 0;
4062306a36Sopenharmony_ci	bpf_map_delete_elem(&lru_map, &(int){0});
4162306a36Sopenharmony_ci	current = bpf_get_current_task_btf();
4262306a36Sopenharmony_ci	v->ptr = current;
4362306a36Sopenharmony_ci	pid = current->pid;
4462306a36Sopenharmony_ci	bpf_ktime_get_ns();
4562306a36Sopenharmony_ci	result = !v->ptr;
4662306a36Sopenharmony_ci	return 0;
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
50