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