18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/* Copyright (c) 2020 Facebook */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include "vmlinux.h"
58c2ecf20Sopenharmony_ci#include <asm/unistd.h>
68c2ecf20Sopenharmony_ci#include <bpf/bpf_helpers.h>
78c2ecf20Sopenharmony_ci#include <bpf/bpf_tracing.h>
88c2ecf20Sopenharmony_ci#include <bpf/bpf_core_read.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#define MY_TV_NSEC 1337
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cibool tp_called = false;
138c2ecf20Sopenharmony_cibool raw_tp_called = false;
148c2ecf20Sopenharmony_cibool tp_btf_called = false;
158c2ecf20Sopenharmony_cibool kprobe_called = false;
168c2ecf20Sopenharmony_cibool fentry_called = false;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ciSEC("tp/syscalls/sys_enter_nanosleep")
198c2ecf20Sopenharmony_ciint handle__tp(struct trace_event_raw_sys_enter *args)
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci	struct __kernel_timespec *ts;
228c2ecf20Sopenharmony_ci	long tv_nsec;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	if (args->id != __NR_nanosleep)
258c2ecf20Sopenharmony_ci		return 0;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	ts = (void *)args->args[0];
288c2ecf20Sopenharmony_ci	if (bpf_probe_read_user(&tv_nsec, sizeof(ts->tv_nsec), &ts->tv_nsec) ||
298c2ecf20Sopenharmony_ci	    tv_nsec != MY_TV_NSEC)
308c2ecf20Sopenharmony_ci		return 0;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	tp_called = true;
338c2ecf20Sopenharmony_ci	return 0;
348c2ecf20Sopenharmony_ci}
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ciSEC("raw_tp/sys_enter")
378c2ecf20Sopenharmony_ciint BPF_PROG(handle__raw_tp, struct pt_regs *regs, long id)
388c2ecf20Sopenharmony_ci{
398c2ecf20Sopenharmony_ci	struct __kernel_timespec *ts;
408c2ecf20Sopenharmony_ci	long tv_nsec;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	if (id != __NR_nanosleep)
438c2ecf20Sopenharmony_ci		return 0;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	ts = (void *)PT_REGS_PARM1_CORE(regs);
468c2ecf20Sopenharmony_ci	if (bpf_probe_read_user(&tv_nsec, sizeof(ts->tv_nsec), &ts->tv_nsec) ||
478c2ecf20Sopenharmony_ci	    tv_nsec != MY_TV_NSEC)
488c2ecf20Sopenharmony_ci		return 0;
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	raw_tp_called = true;
518c2ecf20Sopenharmony_ci	return 0;
528c2ecf20Sopenharmony_ci}
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ciSEC("tp_btf/sys_enter")
558c2ecf20Sopenharmony_ciint BPF_PROG(handle__tp_btf, struct pt_regs *regs, long id)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	struct __kernel_timespec *ts;
588c2ecf20Sopenharmony_ci	long tv_nsec;
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	if (id != __NR_nanosleep)
618c2ecf20Sopenharmony_ci		return 0;
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	ts = (void *)PT_REGS_PARM1_CORE(regs);
648c2ecf20Sopenharmony_ci	if (bpf_probe_read_user(&tv_nsec, sizeof(ts->tv_nsec), &ts->tv_nsec) ||
658c2ecf20Sopenharmony_ci	    tv_nsec != MY_TV_NSEC)
668c2ecf20Sopenharmony_ci		return 0;
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	tp_btf_called = true;
698c2ecf20Sopenharmony_ci	return 0;
708c2ecf20Sopenharmony_ci}
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ciSEC("kprobe/hrtimer_start_range_ns")
738c2ecf20Sopenharmony_ciint BPF_KPROBE(handle__kprobe, struct hrtimer *timer, ktime_t tim, u64 delta_ns,
748c2ecf20Sopenharmony_ci	       const enum hrtimer_mode mode)
758c2ecf20Sopenharmony_ci{
768c2ecf20Sopenharmony_ci	if (tim == MY_TV_NSEC)
778c2ecf20Sopenharmony_ci		kprobe_called = true;
788c2ecf20Sopenharmony_ci	return 0;
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ciSEC("fentry/hrtimer_start_range_ns")
828c2ecf20Sopenharmony_ciint BPF_PROG(handle__fentry, struct hrtimer *timer, ktime_t tim, u64 delta_ns,
838c2ecf20Sopenharmony_ci	     const enum hrtimer_mode mode)
848c2ecf20Sopenharmony_ci{
858c2ecf20Sopenharmony_ci	if (tim == MY_TV_NSEC)
868c2ecf20Sopenharmony_ci		fentry_called = true;
878c2ecf20Sopenharmony_ci	return 0;
888c2ecf20Sopenharmony_ci}
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cichar _license[] SEC("license") = "GPL";
91