1*e2978755SEduard Zingerman // SPDX-License-Identifier: GPL-2.0
2*e2978755SEduard Zingerman /* Converted from tools/testing/selftests/bpf/verifier/ld_ind.c */
3*e2978755SEduard Zingerman 
4*e2978755SEduard Zingerman #include <linux/bpf.h>
5*e2978755SEduard Zingerman #include <bpf/bpf_helpers.h>
6*e2978755SEduard Zingerman #include "../../../include/linux/filter.h"
7*e2978755SEduard Zingerman #include "bpf_misc.h"
8*e2978755SEduard Zingerman 
9*e2978755SEduard Zingerman SEC("socket")
10*e2978755SEduard Zingerman __description("ld_ind: check calling conv, r1")
11*e2978755SEduard Zingerman __failure __msg("R1 !read_ok")
12*e2978755SEduard Zingerman __failure_unpriv
ind_check_calling_conv_r1(void)13*e2978755SEduard Zingerman __naked void ind_check_calling_conv_r1(void)
14*e2978755SEduard Zingerman {
15*e2978755SEduard Zingerman 	asm volatile ("					\
16*e2978755SEduard Zingerman 	r6 = r1;					\
17*e2978755SEduard Zingerman 	r1 = 1;						\
18*e2978755SEduard Zingerman 	.8byte %[ld_ind];				\
19*e2978755SEduard Zingerman 	r0 = r1;					\
20*e2978755SEduard Zingerman 	exit;						\
21*e2978755SEduard Zingerman "	:
22*e2978755SEduard Zingerman 	: __imm_insn(ld_ind, BPF_LD_IND(BPF_W, BPF_REG_1, -0x200000))
23*e2978755SEduard Zingerman 	: __clobber_all);
24*e2978755SEduard Zingerman }
25*e2978755SEduard Zingerman 
26*e2978755SEduard Zingerman SEC("socket")
27*e2978755SEduard Zingerman __description("ld_ind: check calling conv, r2")
28*e2978755SEduard Zingerman __failure __msg("R2 !read_ok")
29*e2978755SEduard Zingerman __failure_unpriv
ind_check_calling_conv_r2(void)30*e2978755SEduard Zingerman __naked void ind_check_calling_conv_r2(void)
31*e2978755SEduard Zingerman {
32*e2978755SEduard Zingerman 	asm volatile ("					\
33*e2978755SEduard Zingerman 	r6 = r1;					\
34*e2978755SEduard Zingerman 	r2 = 1;						\
35*e2978755SEduard Zingerman 	.8byte %[ld_ind];				\
36*e2978755SEduard Zingerman 	r0 = r2;					\
37*e2978755SEduard Zingerman 	exit;						\
38*e2978755SEduard Zingerman "	:
39*e2978755SEduard Zingerman 	: __imm_insn(ld_ind, BPF_LD_IND(BPF_W, BPF_REG_2, -0x200000))
40*e2978755SEduard Zingerman 	: __clobber_all);
41*e2978755SEduard Zingerman }
42*e2978755SEduard Zingerman 
43*e2978755SEduard Zingerman SEC("socket")
44*e2978755SEduard Zingerman __description("ld_ind: check calling conv, r3")
45*e2978755SEduard Zingerman __failure __msg("R3 !read_ok")
46*e2978755SEduard Zingerman __failure_unpriv
ind_check_calling_conv_r3(void)47*e2978755SEduard Zingerman __naked void ind_check_calling_conv_r3(void)
48*e2978755SEduard Zingerman {
49*e2978755SEduard Zingerman 	asm volatile ("					\
50*e2978755SEduard Zingerman 	r6 = r1;					\
51*e2978755SEduard Zingerman 	r3 = 1;						\
52*e2978755SEduard Zingerman 	.8byte %[ld_ind];				\
53*e2978755SEduard Zingerman 	r0 = r3;					\
54*e2978755SEduard Zingerman 	exit;						\
55*e2978755SEduard Zingerman "	:
56*e2978755SEduard Zingerman 	: __imm_insn(ld_ind, BPF_LD_IND(BPF_W, BPF_REG_3, -0x200000))
57*e2978755SEduard Zingerman 	: __clobber_all);
58*e2978755SEduard Zingerman }
59*e2978755SEduard Zingerman 
60*e2978755SEduard Zingerman SEC("socket")
61*e2978755SEduard Zingerman __description("ld_ind: check calling conv, r4")
62*e2978755SEduard Zingerman __failure __msg("R4 !read_ok")
63*e2978755SEduard Zingerman __failure_unpriv
ind_check_calling_conv_r4(void)64*e2978755SEduard Zingerman __naked void ind_check_calling_conv_r4(void)
65*e2978755SEduard Zingerman {
66*e2978755SEduard Zingerman 	asm volatile ("					\
67*e2978755SEduard Zingerman 	r6 = r1;					\
68*e2978755SEduard Zingerman 	r4 = 1;						\
69*e2978755SEduard Zingerman 	.8byte %[ld_ind];				\
70*e2978755SEduard Zingerman 	r0 = r4;					\
71*e2978755SEduard Zingerman 	exit;						\
72*e2978755SEduard Zingerman "	:
73*e2978755SEduard Zingerman 	: __imm_insn(ld_ind, BPF_LD_IND(BPF_W, BPF_REG_4, -0x200000))
74*e2978755SEduard Zingerman 	: __clobber_all);
75*e2978755SEduard Zingerman }
76*e2978755SEduard Zingerman 
77*e2978755SEduard Zingerman SEC("socket")
78*e2978755SEduard Zingerman __description("ld_ind: check calling conv, r5")
79*e2978755SEduard Zingerman __failure __msg("R5 !read_ok")
80*e2978755SEduard Zingerman __failure_unpriv
ind_check_calling_conv_r5(void)81*e2978755SEduard Zingerman __naked void ind_check_calling_conv_r5(void)
82*e2978755SEduard Zingerman {
83*e2978755SEduard Zingerman 	asm volatile ("					\
84*e2978755SEduard Zingerman 	r6 = r1;					\
85*e2978755SEduard Zingerman 	r5 = 1;						\
86*e2978755SEduard Zingerman 	.8byte %[ld_ind];				\
87*e2978755SEduard Zingerman 	r0 = r5;					\
88*e2978755SEduard Zingerman 	exit;						\
89*e2978755SEduard Zingerman "	:
90*e2978755SEduard Zingerman 	: __imm_insn(ld_ind, BPF_LD_IND(BPF_W, BPF_REG_5, -0x200000))
91*e2978755SEduard Zingerman 	: __clobber_all);
92*e2978755SEduard Zingerman }
93*e2978755SEduard Zingerman 
94*e2978755SEduard Zingerman SEC("socket")
95*e2978755SEduard Zingerman __description("ld_ind: check calling conv, r7")
96*e2978755SEduard Zingerman __success __success_unpriv __retval(1)
ind_check_calling_conv_r7(void)97*e2978755SEduard Zingerman __naked void ind_check_calling_conv_r7(void)
98*e2978755SEduard Zingerman {
99*e2978755SEduard Zingerman 	asm volatile ("					\
100*e2978755SEduard Zingerman 	r6 = r1;					\
101*e2978755SEduard Zingerman 	r7 = 1;						\
102*e2978755SEduard Zingerman 	.8byte %[ld_ind];				\
103*e2978755SEduard Zingerman 	r0 = r7;					\
104*e2978755SEduard Zingerman 	exit;						\
105*e2978755SEduard Zingerman "	:
106*e2978755SEduard Zingerman 	: __imm_insn(ld_ind, BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000))
107*e2978755SEduard Zingerman 	: __clobber_all);
108*e2978755SEduard Zingerman }
109*e2978755SEduard Zingerman 
110*e2978755SEduard Zingerman char _license[] SEC("license") = "GPL";
111