162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Converted from tools/testing/selftests/bpf/verifier/cfg.c */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/bpf.h>
562306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
662306a36Sopenharmony_ci#include "bpf_misc.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciSEC("socket")
962306a36Sopenharmony_ci__description("unreachable")
1062306a36Sopenharmony_ci__failure __msg("unreachable")
1162306a36Sopenharmony_ci__failure_unpriv
1262306a36Sopenharmony_ci__naked void unreachable(void)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	asm volatile ("					\
1562306a36Sopenharmony_ci	exit;						\
1662306a36Sopenharmony_ci	exit;						\
1762306a36Sopenharmony_ci"	::: __clobber_all);
1862306a36Sopenharmony_ci}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciSEC("socket")
2162306a36Sopenharmony_ci__description("unreachable2")
2262306a36Sopenharmony_ci__failure __msg("unreachable")
2362306a36Sopenharmony_ci__failure_unpriv
2462306a36Sopenharmony_ci__naked void unreachable2(void)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	asm volatile ("					\
2762306a36Sopenharmony_ci	goto l0_%=;					\
2862306a36Sopenharmony_ci	goto l0_%=;					\
2962306a36Sopenharmony_cil0_%=:	exit;						\
3062306a36Sopenharmony_ci"	::: __clobber_all);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciSEC("socket")
3462306a36Sopenharmony_ci__description("out of range jump")
3562306a36Sopenharmony_ci__failure __msg("jump out of range")
3662306a36Sopenharmony_ci__failure_unpriv
3762306a36Sopenharmony_ci__naked void out_of_range_jump(void)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	asm volatile ("					\
4062306a36Sopenharmony_ci	goto l0_%=;					\
4162306a36Sopenharmony_ci	exit;						\
4262306a36Sopenharmony_cil0_%=:							\
4362306a36Sopenharmony_ci"	::: __clobber_all);
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciSEC("socket")
4762306a36Sopenharmony_ci__description("out of range jump2")
4862306a36Sopenharmony_ci__failure __msg("jump out of range")
4962306a36Sopenharmony_ci__failure_unpriv
5062306a36Sopenharmony_ci__naked void out_of_range_jump2(void)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	asm volatile ("					\
5362306a36Sopenharmony_ci	goto -2;					\
5462306a36Sopenharmony_ci	exit;						\
5562306a36Sopenharmony_ci"	::: __clobber_all);
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciSEC("socket")
5962306a36Sopenharmony_ci__description("loop (back-edge)")
6062306a36Sopenharmony_ci__failure __msg("unreachable insn 1")
6162306a36Sopenharmony_ci__msg_unpriv("back-edge")
6262306a36Sopenharmony_ci__naked void loop_back_edge(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	asm volatile ("					\
6562306a36Sopenharmony_cil0_%=:	goto l0_%=;					\
6662306a36Sopenharmony_ci	exit;						\
6762306a36Sopenharmony_ci"	::: __clobber_all);
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciSEC("socket")
7162306a36Sopenharmony_ci__description("loop2 (back-edge)")
7262306a36Sopenharmony_ci__failure __msg("unreachable insn 4")
7362306a36Sopenharmony_ci__msg_unpriv("back-edge")
7462306a36Sopenharmony_ci__naked void loop2_back_edge(void)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	asm volatile ("					\
7762306a36Sopenharmony_cil0_%=:	r1 = r0;					\
7862306a36Sopenharmony_ci	r2 = r0;					\
7962306a36Sopenharmony_ci	r3 = r0;					\
8062306a36Sopenharmony_ci	goto l0_%=;					\
8162306a36Sopenharmony_ci	exit;						\
8262306a36Sopenharmony_ci"	::: __clobber_all);
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciSEC("socket")
8662306a36Sopenharmony_ci__description("conditional loop")
8762306a36Sopenharmony_ci__failure __msg("infinite loop detected")
8862306a36Sopenharmony_ci__msg_unpriv("back-edge")
8962306a36Sopenharmony_ci__naked void conditional_loop(void)
9062306a36Sopenharmony_ci{
9162306a36Sopenharmony_ci	asm volatile ("					\
9262306a36Sopenharmony_ci	r0 = r1;					\
9362306a36Sopenharmony_cil0_%=:	r2 = r0;					\
9462306a36Sopenharmony_ci	r3 = r0;					\
9562306a36Sopenharmony_ci	if r1 == 0 goto l0_%=;				\
9662306a36Sopenharmony_ci	exit;						\
9762306a36Sopenharmony_ci"	::: __clobber_all);
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
101