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 __failure_unpriv read_uninitialized_register(void)13__naked void read_uninitialized_register(void) 14 { 15 asm volatile (" \ 16 r0 = r2; \ 17 exit; \ 18 " ::: __clobber_all); 19 } 20 21 SEC("socket") 22 __description("read invalid register") 23 __failure __msg("R15 is invalid") 24 __failure_unpriv read_invalid_register(void)25__naked void read_invalid_register(void) 26 { 27 asm volatile (" \ 28 .8byte %[mov64_reg]; \ 29 exit; \ 30 " : 31 : __imm_insn(mov64_reg, BPF_MOV64_REG(BPF_REG_0, -1)) 32 : __clobber_all); 33 } 34 35 SEC("socket") 36 __description("program doesn't init R0 before exit") 37 __failure __msg("R0 !read_ok") 38 __failure_unpriv t_init_r0_before_exit(void)39__naked void t_init_r0_before_exit(void) 40 { 41 asm volatile (" \ 42 r2 = r1; \ 43 exit; \ 44 " ::: __clobber_all); 45 } 46 47 SEC("socket") 48 __description("program doesn't init R0 before exit in all branches") 49 __failure __msg("R0 !read_ok") 50 __msg_unpriv("R1 pointer comparison") before_exit_in_all_branches(void)51__naked void before_exit_in_all_branches(void) 52 { 53 asm volatile (" \ 54 if r1 >= 0 goto l0_%=; \ 55 r0 = 1; \ 56 r0 += 2; \ 57 l0_%=: exit; \ 58 " ::: __clobber_all); 59 } 60 61 char _license[] SEC("license") = "GPL"; 62