xref: /linux/tools/testing/selftests/bpf/progs/dummy_st_ops_success.c (revision 621cde16e49b3ecf7d59a8106a20aaebfb4a59a9)
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