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