19497c458SHao Luo // SPDX-License-Identifier: GPL-2.0
29497c458SHao Luo /* Copyright (c) 2021 Google */
39497c458SHao Luo 
49497c458SHao Luo #include "vmlinux.h"
59497c458SHao Luo 
69497c458SHao Luo #include <bpf/bpf_helpers.h>
79497c458SHao Luo 
89497c458SHao Luo extern const int bpf_prog_active __ksym; /* int type global var. */
99497c458SHao Luo 
109497c458SHao Luo SEC("raw_tp/sys_enter")
handler1(const void * ctx)11*7cb29b1cSKumar Kartikeya Dwivedi int handler1(const void *ctx)
129497c458SHao Luo {
139497c458SHao Luo 	int *active;
149497c458SHao Luo 	__u32 cpu;
159497c458SHao Luo 
169497c458SHao Luo 	cpu = bpf_get_smp_processor_id();
179497c458SHao Luo 	active = (int *)bpf_per_cpu_ptr(&bpf_prog_active, cpu);
189497c458SHao Luo 	if (active) {
199497c458SHao Luo 		/* Kernel memory obtained from bpf_{per,this}_cpu_ptr
209497c458SHao Luo 		 * is read-only, should _not_ pass verification.
219497c458SHao Luo 		 */
229497c458SHao Luo 		/* WRITE_ONCE */
239497c458SHao Luo 		*(volatile int *)active = -1;
249497c458SHao Luo 	}
259497c458SHao Luo 
269497c458SHao Luo 	return 0;
279497c458SHao Luo }
289497c458SHao Luo 
write_active(int * p)29*7cb29b1cSKumar Kartikeya Dwivedi __noinline int write_active(int *p)
30*7cb29b1cSKumar Kartikeya Dwivedi {
31*7cb29b1cSKumar Kartikeya Dwivedi 	return p ? (*p = 42) : 0;
32*7cb29b1cSKumar Kartikeya Dwivedi }
33*7cb29b1cSKumar Kartikeya Dwivedi 
34*7cb29b1cSKumar Kartikeya Dwivedi SEC("raw_tp/sys_enter")
handler2(const void * ctx)35*7cb29b1cSKumar Kartikeya Dwivedi int handler2(const void *ctx)
36*7cb29b1cSKumar Kartikeya Dwivedi {
37*7cb29b1cSKumar Kartikeya Dwivedi 	int *active;
38*7cb29b1cSKumar Kartikeya Dwivedi 
39*7cb29b1cSKumar Kartikeya Dwivedi 	active = bpf_this_cpu_ptr(&bpf_prog_active);
40*7cb29b1cSKumar Kartikeya Dwivedi 	write_active(active);
41*7cb29b1cSKumar Kartikeya Dwivedi 	return 0;
42*7cb29b1cSKumar Kartikeya Dwivedi }
43*7cb29b1cSKumar Kartikeya Dwivedi 
449497c458SHao Luo char _license[] SEC("license") = "GPL";
45