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