1*2f2047c2SEduard Zingerman // SPDX-License-Identifier: GPL-2.0
2*2f2047c2SEduard Zingerman /* Converted from tools/testing/selftests/bpf/verifier/cfg.c */
3*2f2047c2SEduard Zingerman 
4*2f2047c2SEduard Zingerman #include <linux/bpf.h>
5*2f2047c2SEduard Zingerman #include <bpf/bpf_helpers.h>
6*2f2047c2SEduard Zingerman #include "bpf_misc.h"
7*2f2047c2SEduard Zingerman 
8*2f2047c2SEduard Zingerman SEC("socket")
9*2f2047c2SEduard Zingerman __description("unreachable")
10*2f2047c2SEduard Zingerman __failure __msg("unreachable")
11*2f2047c2SEduard Zingerman __failure_unpriv
unreachable(void)12*2f2047c2SEduard Zingerman __naked void unreachable(void)
13*2f2047c2SEduard Zingerman {
14*2f2047c2SEduard Zingerman 	asm volatile ("					\
15*2f2047c2SEduard Zingerman 	exit;						\
16*2f2047c2SEduard Zingerman 	exit;						\
17*2f2047c2SEduard Zingerman "	::: __clobber_all);
18*2f2047c2SEduard Zingerman }
19*2f2047c2SEduard Zingerman 
20*2f2047c2SEduard Zingerman SEC("socket")
21*2f2047c2SEduard Zingerman __description("unreachable2")
22*2f2047c2SEduard Zingerman __failure __msg("unreachable")
23*2f2047c2SEduard Zingerman __failure_unpriv
unreachable2(void)24*2f2047c2SEduard Zingerman __naked void unreachable2(void)
25*2f2047c2SEduard Zingerman {
26*2f2047c2SEduard Zingerman 	asm volatile ("					\
27*2f2047c2SEduard Zingerman 	goto l0_%=;					\
28*2f2047c2SEduard Zingerman 	goto l0_%=;					\
29*2f2047c2SEduard Zingerman l0_%=:	exit;						\
30*2f2047c2SEduard Zingerman "	::: __clobber_all);
31*2f2047c2SEduard Zingerman }
32*2f2047c2SEduard Zingerman 
33*2f2047c2SEduard Zingerman SEC("socket")
34*2f2047c2SEduard Zingerman __description("out of range jump")
35*2f2047c2SEduard Zingerman __failure __msg("jump out of range")
36*2f2047c2SEduard Zingerman __failure_unpriv
out_of_range_jump(void)37*2f2047c2SEduard Zingerman __naked void out_of_range_jump(void)
38*2f2047c2SEduard Zingerman {
39*2f2047c2SEduard Zingerman 	asm volatile ("					\
40*2f2047c2SEduard Zingerman 	goto l0_%=;					\
41*2f2047c2SEduard Zingerman 	exit;						\
42*2f2047c2SEduard Zingerman l0_%=:							\
43*2f2047c2SEduard Zingerman "	::: __clobber_all);
44*2f2047c2SEduard Zingerman }
45*2f2047c2SEduard Zingerman 
46*2f2047c2SEduard Zingerman SEC("socket")
47*2f2047c2SEduard Zingerman __description("out of range jump2")
48*2f2047c2SEduard Zingerman __failure __msg("jump out of range")
49*2f2047c2SEduard Zingerman __failure_unpriv
out_of_range_jump2(void)50*2f2047c2SEduard Zingerman __naked void out_of_range_jump2(void)
51*2f2047c2SEduard Zingerman {
52*2f2047c2SEduard Zingerman 	asm volatile ("					\
53*2f2047c2SEduard Zingerman 	goto -2;					\
54*2f2047c2SEduard Zingerman 	exit;						\
55*2f2047c2SEduard Zingerman "	::: __clobber_all);
56*2f2047c2SEduard Zingerman }
57*2f2047c2SEduard Zingerman 
58*2f2047c2SEduard Zingerman SEC("socket")
59*2f2047c2SEduard Zingerman __description("loop (back-edge)")
60*2f2047c2SEduard Zingerman __failure __msg("unreachable insn 1")
61*2f2047c2SEduard Zingerman __msg_unpriv("back-edge")
loop_back_edge(void)62*2f2047c2SEduard Zingerman __naked void loop_back_edge(void)
63*2f2047c2SEduard Zingerman {
64*2f2047c2SEduard Zingerman 	asm volatile ("					\
65*2f2047c2SEduard Zingerman l0_%=:	goto l0_%=;					\
66*2f2047c2SEduard Zingerman 	exit;						\
67*2f2047c2SEduard Zingerman "	::: __clobber_all);
68*2f2047c2SEduard Zingerman }
69*2f2047c2SEduard Zingerman 
70*2f2047c2SEduard Zingerman SEC("socket")
71*2f2047c2SEduard Zingerman __description("loop2 (back-edge)")
72*2f2047c2SEduard Zingerman __failure __msg("unreachable insn 4")
73*2f2047c2SEduard Zingerman __msg_unpriv("back-edge")
loop2_back_edge(void)74*2f2047c2SEduard Zingerman __naked void loop2_back_edge(void)
75*2f2047c2SEduard Zingerman {
76*2f2047c2SEduard Zingerman 	asm volatile ("					\
77*2f2047c2SEduard Zingerman l0_%=:	r1 = r0;					\
78*2f2047c2SEduard Zingerman 	r2 = r0;					\
79*2f2047c2SEduard Zingerman 	r3 = r0;					\
80*2f2047c2SEduard Zingerman 	goto l0_%=;					\
81*2f2047c2SEduard Zingerman 	exit;						\
82*2f2047c2SEduard Zingerman "	::: __clobber_all);
83*2f2047c2SEduard Zingerman }
84*2f2047c2SEduard Zingerman 
85*2f2047c2SEduard Zingerman SEC("socket")
86*2f2047c2SEduard Zingerman __description("conditional loop")
87*2f2047c2SEduard Zingerman __failure __msg("infinite loop detected")
88*2f2047c2SEduard Zingerman __msg_unpriv("back-edge")
conditional_loop(void)89*2f2047c2SEduard Zingerman __naked void conditional_loop(void)
90*2f2047c2SEduard Zingerman {
91*2f2047c2SEduard Zingerman 	asm volatile ("					\
92*2f2047c2SEduard Zingerman 	r0 = r1;					\
93*2f2047c2SEduard Zingerman l0_%=:	r2 = r0;					\
94*2f2047c2SEduard Zingerman 	r3 = r0;					\
95*2f2047c2SEduard Zingerman 	if r1 == 0 goto l0_%=;				\
96*2f2047c2SEduard Zingerman 	exit;						\
97*2f2047c2SEduard Zingerman "	::: __clobber_all);
98*2f2047c2SEduard Zingerman }
99*2f2047c2SEduard Zingerman 
100*2f2047c2SEduard Zingerman char _license[] SEC("license") = "GPL";
101