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