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 9SEC("socket") 10__description("read uninitialized register") 11__failure __msg("R2 !read_ok") 12__failure_unpriv 13__naked void read_uninitialized_register(void) 14{ 15 asm volatile (" \ 16 r0 = r2; \ 17 exit; \ 18" ::: __clobber_all); 19} 20 21SEC("socket") 22__description("read invalid register") 23__failure __msg("R15 is invalid") 24__failure_unpriv 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 35SEC("socket") 36__description("program doesn't init R0 before exit") 37__failure __msg("R0 !read_ok") 38__failure_unpriv 39__naked void t_init_r0_before_exit(void) 40{ 41 asm volatile (" \ 42 r2 = r1; \ 43 exit; \ 44" ::: __clobber_all); 45} 46 47SEC("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") 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; \ 57l0_%=: exit; \ 58" ::: __clobber_all); 59} 60 61char _license[] SEC("license") = "GPL"; 62