17dd88059SDavid Vernet // SPDX-License-Identifier: GPL-2.0
27dd88059SDavid Vernet /* Copyright (C) 2021. Huawei Technologies Co., Ltd */
37dd88059SDavid Vernet #include "vmlinux.h"
47dd88059SDavid Vernet #include <bpf/bpf_helpers.h>
57dd88059SDavid Vernet #include <bpf/bpf_tracing.h>
67dd88059SDavid Vernet
77dd88059SDavid Vernet char _license[] SEC("license") = "GPL";
87dd88059SDavid Vernet
97dd88059SDavid Vernet SEC("struct_ops/test_1")
BPF_PROG(test_1,struct bpf_dummy_ops_state * state)107dd88059SDavid Vernet int BPF_PROG(test_1, struct bpf_dummy_ops_state *state)
117dd88059SDavid Vernet {
127dd88059SDavid Vernet int ret;
137dd88059SDavid Vernet
143b3b84aaSEduard Zingerman /* Check that 'state' nullable status is detected correctly.
153b3b84aaSEduard Zingerman * If 'state' argument would be assumed non-null by verifier
163b3b84aaSEduard Zingerman * the code below would be deleted as dead (which it shouldn't).
173b3b84aaSEduard Zingerman * Hide it from the compiler behind 'asm' block to avoid
183b3b84aaSEduard Zingerman * unnecessary optimizations.
193b3b84aaSEduard Zingerman */
203b3b84aaSEduard Zingerman asm volatile (
213b3b84aaSEduard Zingerman "if %[state] != 0 goto +2;"
223b3b84aaSEduard Zingerman "r0 = 0xf2f3f4f5;"
233b3b84aaSEduard Zingerman "exit;"
243b3b84aaSEduard Zingerman ::[state]"p"(state));
257dd88059SDavid Vernet
267dd88059SDavid Vernet ret = state->val;
277dd88059SDavid Vernet state->val = 0x5a;
287dd88059SDavid Vernet return ret;
297dd88059SDavid Vernet }
307dd88059SDavid Vernet
317dd88059SDavid Vernet __u64 test_2_args[5];
327dd88059SDavid Vernet
337dd88059SDavid Vernet SEC("struct_ops/test_2")
BPF_PROG(test_2,struct bpf_dummy_ops_state * state,int a1,unsigned short a2,char a3,unsigned long a4)347dd88059SDavid Vernet int BPF_PROG(test_2, struct bpf_dummy_ops_state *state, int a1, unsigned short a2,
357dd88059SDavid Vernet char a3, unsigned long a4)
367dd88059SDavid Vernet {
37*f612210dSEduard Zingerman test_2_args[0] = state->val;
387dd88059SDavid Vernet test_2_args[1] = a1;
397dd88059SDavid Vernet test_2_args[2] = a2;
407dd88059SDavid Vernet test_2_args[3] = a3;
417dd88059SDavid Vernet test_2_args[4] = a4;
427dd88059SDavid Vernet return 0;
437dd88059SDavid Vernet }
447dd88059SDavid Vernet
457dd88059SDavid Vernet SEC("struct_ops.s/test_sleepable")
BPF_PROG(test_sleepable,struct bpf_dummy_ops_state * state)467dd88059SDavid Vernet int BPF_PROG(test_sleepable, struct bpf_dummy_ops_state *state)
477dd88059SDavid Vernet {
487dd88059SDavid Vernet return 0;
497dd88059SDavid Vernet }
507dd88059SDavid Vernet
517dd88059SDavid Vernet SEC(".struct_ops")
527dd88059SDavid Vernet struct bpf_dummy_ops dummy_1 = {
537dd88059SDavid Vernet .test_1 = (void *)test_1,
547dd88059SDavid Vernet .test_2 = (void *)test_2,
557dd88059SDavid Vernet .test_sleepable = (void *)test_sleepable,
567dd88059SDavid Vernet };
57