12c2f6abeSHao Luo // SPDX-License-Identifier: GPL-2.0
22c2f6abeSHao Luo /* Copyright (c) 2020 Google */
32c2f6abeSHao Luo 
42c2f6abeSHao Luo #include "vmlinux.h"
52c2f6abeSHao Luo 
62c2f6abeSHao Luo #include <bpf/bpf_helpers.h>
72c2f6abeSHao Luo 
82c2f6abeSHao Luo __u64 out__runqueues_addr = -1;
92c2f6abeSHao Luo __u64 out__bpf_prog_active_addr = -1;
102c2f6abeSHao Luo 
1100dc73e4SHao Luo __u32 out__rq_cpu = -1; /* percpu struct fields */
1200dc73e4SHao Luo int out__bpf_prog_active = -1; /* percpu int */
1300dc73e4SHao Luo 
1400dc73e4SHao Luo __u32 out__this_rq_cpu = -1;
1500dc73e4SHao Luo int out__this_bpf_prog_active = -1;
1600dc73e4SHao Luo 
1700dc73e4SHao Luo __u32 out__cpu_0_rq_cpu = -1; /* cpu_rq(0)->cpu */
1800dc73e4SHao Luo 
192c2f6abeSHao Luo extern const struct rq runqueues __ksym; /* struct type global var. */
202c2f6abeSHao Luo extern const int bpf_prog_active __ksym; /* int type global var. */
212c2f6abeSHao Luo 
222c2f6abeSHao Luo SEC("raw_tp/sys_enter")
handler(const void * ctx)232c2f6abeSHao Luo int handler(const void *ctx)
242c2f6abeSHao Luo {
2500dc73e4SHao Luo 	struct rq *rq;
2600dc73e4SHao Luo 	int *active;
2700dc73e4SHao Luo 	__u32 cpu;
2800dc73e4SHao Luo 
292c2f6abeSHao Luo 	out__runqueues_addr = (__u64)&runqueues;
302c2f6abeSHao Luo 	out__bpf_prog_active_addr = (__u64)&bpf_prog_active;
312c2f6abeSHao Luo 
3200dc73e4SHao Luo 	cpu = bpf_get_smp_processor_id();
3300dc73e4SHao Luo 
3400dc73e4SHao Luo 	/* test bpf_per_cpu_ptr() */
3500dc73e4SHao Luo 	rq = (struct rq *)bpf_per_cpu_ptr(&runqueues, cpu);
3600dc73e4SHao Luo 	if (rq)
3700dc73e4SHao Luo 		out__rq_cpu = rq->cpu;
3800dc73e4SHao Luo 	active = (int *)bpf_per_cpu_ptr(&bpf_prog_active, cpu);
3900dc73e4SHao Luo 	if (active)
4000dc73e4SHao Luo 		out__bpf_prog_active = *active;
4100dc73e4SHao Luo 
4200dc73e4SHao Luo 	rq = (struct rq *)bpf_per_cpu_ptr(&runqueues, 0);
4300dc73e4SHao Luo 	if (rq) /* should always be valid, but we can't spare the check. */
4400dc73e4SHao Luo 		out__cpu_0_rq_cpu = rq->cpu;
4500dc73e4SHao Luo 
4600dc73e4SHao Luo 	/* test bpf_this_cpu_ptr */
4700dc73e4SHao Luo 	rq = (struct rq *)bpf_this_cpu_ptr(&runqueues);
4800dc73e4SHao Luo 	out__this_rq_cpu = rq->cpu;
4900dc73e4SHao Luo 	active = (int *)bpf_this_cpu_ptr(&bpf_prog_active);
5000dc73e4SHao Luo 	out__this_bpf_prog_active = *active;
5100dc73e4SHao Luo 
522c2f6abeSHao Luo 	return 0;
532c2f6abeSHao Luo }
542c2f6abeSHao Luo 
552c2f6abeSHao Luo char _license[] SEC("license") = "GPL";
56