1*047687a7SEduard Zingerman // SPDX-License-Identifier: GPL-2.0
2*047687a7SEduard Zingerman /* Converted from tools/testing/selftests/bpf/verifier/cgroup_inv_retcode.c */
3*047687a7SEduard Zingerman 
4*047687a7SEduard Zingerman #include <linux/bpf.h>
5*047687a7SEduard Zingerman #include <bpf/bpf_helpers.h>
6*047687a7SEduard Zingerman #include "bpf_misc.h"
7*047687a7SEduard Zingerman 
8*047687a7SEduard Zingerman SEC("cgroup/sock")
9*047687a7SEduard Zingerman __description("bpf_exit with invalid return code. test1")
10*047687a7SEduard Zingerman __failure __msg("R0 has value (0x0; 0xffffffff)")
with_invalid_return_code_test1(void)11*047687a7SEduard Zingerman __naked void with_invalid_return_code_test1(void)
12*047687a7SEduard Zingerman {
13*047687a7SEduard Zingerman 	asm volatile ("					\
14*047687a7SEduard Zingerman 	r0 = *(u32*)(r1 + 0);				\
15*047687a7SEduard Zingerman 	exit;						\
16*047687a7SEduard Zingerman "	::: __clobber_all);
17*047687a7SEduard Zingerman }
18*047687a7SEduard Zingerman 
19*047687a7SEduard Zingerman SEC("cgroup/sock")
20*047687a7SEduard Zingerman __description("bpf_exit with invalid return code. test2")
21*047687a7SEduard Zingerman __success
with_invalid_return_code_test2(void)22*047687a7SEduard Zingerman __naked void with_invalid_return_code_test2(void)
23*047687a7SEduard Zingerman {
24*047687a7SEduard Zingerman 	asm volatile ("					\
25*047687a7SEduard Zingerman 	r0 = *(u32*)(r1 + 0);				\
26*047687a7SEduard Zingerman 	r0 &= 1;					\
27*047687a7SEduard Zingerman 	exit;						\
28*047687a7SEduard Zingerman "	::: __clobber_all);
29*047687a7SEduard Zingerman }
30*047687a7SEduard Zingerman 
31*047687a7SEduard Zingerman SEC("cgroup/sock")
32*047687a7SEduard Zingerman __description("bpf_exit with invalid return code. test3")
33*047687a7SEduard Zingerman __failure __msg("R0 has value (0x0; 0x3)")
with_invalid_return_code_test3(void)34*047687a7SEduard Zingerman __naked void with_invalid_return_code_test3(void)
35*047687a7SEduard Zingerman {
36*047687a7SEduard Zingerman 	asm volatile ("					\
37*047687a7SEduard Zingerman 	r0 = *(u32*)(r1 + 0);				\
38*047687a7SEduard Zingerman 	r0 &= 3;					\
39*047687a7SEduard Zingerman 	exit;						\
40*047687a7SEduard Zingerman "	::: __clobber_all);
41*047687a7SEduard Zingerman }
42*047687a7SEduard Zingerman 
43*047687a7SEduard Zingerman SEC("cgroup/sock")
44*047687a7SEduard Zingerman __description("bpf_exit with invalid return code. test4")
45*047687a7SEduard Zingerman __success
with_invalid_return_code_test4(void)46*047687a7SEduard Zingerman __naked void with_invalid_return_code_test4(void)
47*047687a7SEduard Zingerman {
48*047687a7SEduard Zingerman 	asm volatile ("					\
49*047687a7SEduard Zingerman 	r0 = 1;						\
50*047687a7SEduard Zingerman 	exit;						\
51*047687a7SEduard Zingerman "	::: __clobber_all);
52*047687a7SEduard Zingerman }
53*047687a7SEduard Zingerman 
54*047687a7SEduard Zingerman SEC("cgroup/sock")
55*047687a7SEduard Zingerman __description("bpf_exit with invalid return code. test5")
56*047687a7SEduard Zingerman __failure __msg("R0 has value (0x2; 0x0)")
with_invalid_return_code_test5(void)57*047687a7SEduard Zingerman __naked void with_invalid_return_code_test5(void)
58*047687a7SEduard Zingerman {
59*047687a7SEduard Zingerman 	asm volatile ("					\
60*047687a7SEduard Zingerman 	r0 = 2;						\
61*047687a7SEduard Zingerman 	exit;						\
62*047687a7SEduard Zingerman "	::: __clobber_all);
63*047687a7SEduard Zingerman }
64*047687a7SEduard Zingerman 
65*047687a7SEduard Zingerman SEC("cgroup/sock")
66*047687a7SEduard Zingerman __description("bpf_exit with invalid return code. test6")
67*047687a7SEduard Zingerman __failure __msg("R0 is not a known value (ctx)")
with_invalid_return_code_test6(void)68*047687a7SEduard Zingerman __naked void with_invalid_return_code_test6(void)
69*047687a7SEduard Zingerman {
70*047687a7SEduard Zingerman 	asm volatile ("					\
71*047687a7SEduard Zingerman 	r0 = r1;					\
72*047687a7SEduard Zingerman 	exit;						\
73*047687a7SEduard Zingerman "	::: __clobber_all);
74*047687a7SEduard Zingerman }
75*047687a7SEduard Zingerman 
76*047687a7SEduard Zingerman SEC("cgroup/sock")
77*047687a7SEduard Zingerman __description("bpf_exit with invalid return code. test7")
78*047687a7SEduard Zingerman __failure __msg("R0 has unknown scalar value")
with_invalid_return_code_test7(void)79*047687a7SEduard Zingerman __naked void with_invalid_return_code_test7(void)
80*047687a7SEduard Zingerman {
81*047687a7SEduard Zingerman 	asm volatile ("					\
82*047687a7SEduard Zingerman 	r0 = *(u32*)(r1 + 0);				\
83*047687a7SEduard Zingerman 	r2 = *(u32*)(r1 + 4);				\
84*047687a7SEduard Zingerman 	r0 *= r2;					\
85*047687a7SEduard Zingerman 	exit;						\
86*047687a7SEduard Zingerman "	::: __clobber_all);
87*047687a7SEduard Zingerman }
88*047687a7SEduard Zingerman 
89*047687a7SEduard Zingerman char _license[] SEC("license") = "GPL";
90