xref: /linux/tools/testing/selftests/bpf/progs/verifier_ctx_ptr_param.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
1*e8571de5SSlava Imameev // SPDX-License-Identifier: GPL-2.0
2*e8571de5SSlava Imameev /*
3*e8571de5SSlava Imameev  * Verifier tests for single- and multi-level pointer parameter handling
4*e8571de5SSlava Imameev  * Copyright (c) 2026 CrowdStrike, Inc.
5*e8571de5SSlava Imameev  */
6*e8571de5SSlava Imameev 
7*e8571de5SSlava Imameev #include <linux/bpf.h>
8*e8571de5SSlava Imameev #include <bpf/bpf_helpers.h>
9*e8571de5SSlava Imameev #include <bpf/bpf_tracing.h>
10*e8571de5SSlava Imameev #include "bpf_misc.h"
11*e8571de5SSlava Imameev 
12*e8571de5SSlava Imameev SEC("fentry/bpf_fentry_test_ppvoid")
13*e8571de5SSlava Imameev __description("fentry/void**: void ** inferred as scalar")
14*e8571de5SSlava Imameev __success __retval(0)
15*e8571de5SSlava Imameev __log_level(2)
16*e8571de5SSlava Imameev __msg("R1=ctx() R2=scalar()")
17*e8571de5SSlava Imameev __naked void fentry_ppvoid_as_scalar(void)
18*e8571de5SSlava Imameev {
19*e8571de5SSlava Imameev     asm volatile ("					\
20*e8571de5SSlava Imameev 	r2 = *(u64 *)(r1 + 0);	\
21*e8571de5SSlava Imameev 	r0 = 0;	\
22*e8571de5SSlava Imameev 	exit;	\
23*e8571de5SSlava Imameev 	" ::: __clobber_all);
24*e8571de5SSlava Imameev }
25*e8571de5SSlava Imameev 
26*e8571de5SSlava Imameev SEC("fentry/bpf_fentry_test_pppvoid")
27*e8571de5SSlava Imameev __description("fentry/void***: void *** inferred as scalar")
28*e8571de5SSlava Imameev __success __retval(0)
29*e8571de5SSlava Imameev __log_level(2)
30*e8571de5SSlava Imameev __msg("R1=ctx() R2=scalar()")
31*e8571de5SSlava Imameev __naked void fentry_pppvoid_as_scalar(void)
32*e8571de5SSlava Imameev {
33*e8571de5SSlava Imameev     asm volatile ("					\
34*e8571de5SSlava Imameev 	r2 = *(u64 *)(r1 + 0);	\
35*e8571de5SSlava Imameev 	r0 = 0;	\
36*e8571de5SSlava Imameev 	exit;	\
37*e8571de5SSlava Imameev 	" ::: __clobber_all);
38*e8571de5SSlava Imameev }
39*e8571de5SSlava Imameev 
40*e8571de5SSlava Imameev SEC("fentry/bpf_fentry_test_ppfile")
41*e8571de5SSlava Imameev __description("fentry/struct file**: struct file ** inferred as scalar")
42*e8571de5SSlava Imameev __success __retval(0)
43*e8571de5SSlava Imameev __log_level(2)
44*e8571de5SSlava Imameev __msg("R1=ctx() R2=scalar()")
45*e8571de5SSlava Imameev __naked void fentry_ppfile_as_scalar(void)
46*e8571de5SSlava Imameev {
47*e8571de5SSlava Imameev     asm volatile ("					\
48*e8571de5SSlava Imameev 	r2 = *(u64 *)(r1 + 0);	\
49*e8571de5SSlava Imameev 	r0 = 0;	\
50*e8571de5SSlava Imameev 	exit;	\
51*e8571de5SSlava Imameev 	" ::: __clobber_all);
52*e8571de5SSlava Imameev }
53*e8571de5SSlava Imameev 
54*e8571de5SSlava Imameev SEC("fexit/bpf_fexit_test_ret_ppfile")
55*e8571de5SSlava Imameev __description("fexit/return struct file**: returned struct file ** inferred as scalar")
56*e8571de5SSlava Imameev __success __retval(0)
57*e8571de5SSlava Imameev __log_level(2)
58*e8571de5SSlava Imameev __msg("R1=ctx() R2=scalar()")
59*e8571de5SSlava Imameev __naked void fexit_ppfile_as_scalar(void)
60*e8571de5SSlava Imameev {
61*e8571de5SSlava Imameev     asm volatile ("					\
62*e8571de5SSlava Imameev 	r2 = *(u64 *)(r1 + 0);	\
63*e8571de5SSlava Imameev 	r0 = 0;	\
64*e8571de5SSlava Imameev 	exit;	\
65*e8571de5SSlava Imameev 	" ::: __clobber_all);
66*e8571de5SSlava Imameev }
67*e8571de5SSlava Imameev 
68*e8571de5SSlava Imameev char _license[] SEC("license") = "GPL";
69