1 // SPDX-License-Identifier: GPL-2.0 2 /* Converted from tools/testing/selftests/bpf/verifier/uninit.c */ 3 4 #include <linux/bpf.h> 5 #include <bpf/bpf_helpers.h> 6 #include "../../../include/linux/filter.h" 7 #include "bpf_misc.h" 8 9 SEC("socket") 10 __description("read uninitialized register") 11 __failure __msg("R2 !read_ok") 12 __msg("R2 has never been initialized on this path") 13 __failure_unpriv 14 __naked void read_uninitialized_register(void) 15 { 16 asm volatile (" \ 17 r0 = r2; \ 18 exit; \ 19 " ::: __clobber_all); 20 } 21 22 SEC("socket") 23 __description("read invalid register") 24 __failure __msg("R15 is invalid") 25 __failure_unpriv 26 __naked void read_invalid_register(void) 27 { 28 asm volatile (" \ 29 .8byte %[mov64_reg]; \ 30 exit; \ 31 " : 32 : __imm_insn(mov64_reg, BPF_MOV64_REG(BPF_REG_0, -1)) 33 : __clobber_all); 34 } 35 36 SEC("socket") 37 __description("program doesn't init R0 before exit") 38 __failure __msg("R0 !read_ok") 39 __failure_unpriv 40 __naked void t_init_r0_before_exit(void) 41 { 42 asm volatile (" \ 43 r2 = r1; \ 44 exit; \ 45 " ::: __clobber_all); 46 } 47 48 SEC("socket") 49 __description("program doesn't init R0 before exit in all branches") 50 __failure __msg("R0 !read_ok") 51 __msg_unpriv("R1 pointer comparison") 52 __naked void before_exit_in_all_branches(void) 53 { 54 asm volatile (" \ 55 if r1 >= 0 goto l0_%=; \ 56 r0 = 1; \ 57 r0 += 2; \ 58 l0_%=: exit; \ 59 " ::: __clobber_all); 60 } 61 62 char _license[] SEC("license") = "GPL"; 63