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