162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Converted from tools/testing/selftests/bpf/verifier/uninit.c */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/bpf.h>
562306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
662306a36Sopenharmony_ci#include "../../../include/linux/filter.h"
762306a36Sopenharmony_ci#include "bpf_misc.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciSEC("socket")
1062306a36Sopenharmony_ci__description("read uninitialized register")
1162306a36Sopenharmony_ci__failure __msg("R2 !read_ok")
1262306a36Sopenharmony_ci__failure_unpriv
1362306a36Sopenharmony_ci__naked void read_uninitialized_register(void)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	asm volatile ("					\
1662306a36Sopenharmony_ci	r0 = r2;					\
1762306a36Sopenharmony_ci	exit;						\
1862306a36Sopenharmony_ci"	::: __clobber_all);
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciSEC("socket")
2262306a36Sopenharmony_ci__description("read invalid register")
2362306a36Sopenharmony_ci__failure __msg("R15 is invalid")
2462306a36Sopenharmony_ci__failure_unpriv
2562306a36Sopenharmony_ci__naked void read_invalid_register(void)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	asm volatile ("					\
2862306a36Sopenharmony_ci	.8byte %[mov64_reg];				\
2962306a36Sopenharmony_ci	exit;						\
3062306a36Sopenharmony_ci"	:
3162306a36Sopenharmony_ci	: __imm_insn(mov64_reg, BPF_MOV64_REG(BPF_REG_0, -1))
3262306a36Sopenharmony_ci	: __clobber_all);
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ciSEC("socket")
3662306a36Sopenharmony_ci__description("program doesn't init R0 before exit")
3762306a36Sopenharmony_ci__failure __msg("R0 !read_ok")
3862306a36Sopenharmony_ci__failure_unpriv
3962306a36Sopenharmony_ci__naked void t_init_r0_before_exit(void)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	asm volatile ("					\
4262306a36Sopenharmony_ci	r2 = r1;					\
4362306a36Sopenharmony_ci	exit;						\
4462306a36Sopenharmony_ci"	::: __clobber_all);
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ciSEC("socket")
4862306a36Sopenharmony_ci__description("program doesn't init R0 before exit in all branches")
4962306a36Sopenharmony_ci__failure __msg("R0 !read_ok")
5062306a36Sopenharmony_ci__msg_unpriv("R1 pointer comparison")
5162306a36Sopenharmony_ci__naked void before_exit_in_all_branches(void)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	asm volatile ("					\
5462306a36Sopenharmony_ci	if r1 >= 0 goto l0_%=;				\
5562306a36Sopenharmony_ci	r0 = 1;						\
5662306a36Sopenharmony_ci	r0 += 2;					\
5762306a36Sopenharmony_cil0_%=:	exit;						\
5862306a36Sopenharmony_ci"	::: __clobber_all);
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
62