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 Luoint 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