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