18568c3ceSMartin KaFai Lau // SPDX-License-Identifier: GPL-2.0
28568c3ceSMartin KaFai Lau /* Copyright (c) 2020 Facebook */
38568c3ceSMartin KaFai Lau 
48568c3ceSMartin KaFai Lau #include "vmlinux.h"
58568c3ceSMartin KaFai Lau 
68568c3ceSMartin KaFai Lau #include <bpf/bpf_helpers.h>
78568c3ceSMartin KaFai Lau 
88568c3ceSMartin KaFai Lau extern const struct rq runqueues __ksym; /* struct type global var. */
98568c3ceSMartin KaFai Lau extern const int bpf_prog_active __ksym; /* int type global var. */
108568c3ceSMartin KaFai Lau 
118568c3ceSMartin KaFai Lau SEC("raw_tp/sys_enter")
handler(const void * ctx)128568c3ceSMartin KaFai Lau int handler(const void *ctx)
138568c3ceSMartin KaFai Lau {
148568c3ceSMartin KaFai Lau 	struct rq *rq;
158568c3ceSMartin KaFai Lau 	int *active;
168568c3ceSMartin KaFai Lau 	__u32 cpu;
178568c3ceSMartin KaFai Lau 
188568c3ceSMartin KaFai Lau 	cpu = bpf_get_smp_processor_id();
198568c3ceSMartin KaFai Lau 	rq = (struct rq *)bpf_per_cpu_ptr(&runqueues, cpu);
208568c3ceSMartin KaFai Lau 	active = (int *)bpf_per_cpu_ptr(&bpf_prog_active, cpu);
218568c3ceSMartin KaFai Lau 	if (active) {
228568c3ceSMartin KaFai Lau 		/* READ_ONCE */
238568c3ceSMartin KaFai Lau 		*(volatile int *)active;
248568c3ceSMartin KaFai Lau 		/* !rq has not been tested, so verifier should reject. */
258568c3ceSMartin KaFai Lau 		*(volatile int *)(&rq->cpu);
268568c3ceSMartin KaFai Lau 	}
278568c3ceSMartin KaFai Lau 
288568c3ceSMartin KaFai Lau 	return 0;
298568c3ceSMartin KaFai Lau }
308568c3ceSMartin KaFai Lau 
318568c3ceSMartin KaFai Lau char _license[] SEC("license") = "GPL";
32