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

source code of linux/tools/testing/selftests/bpf/progs/verifier_uninit.c