xref: /linux/tools/testing/selftests/bpf/progs/verifier_meta_access.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
165428312SEduard Zingerman // SPDX-License-Identifier: GPL-2.0
265428312SEduard Zingerman /* Converted from tools/testing/selftests/bpf/verifier/meta_access.c */
365428312SEduard Zingerman 
465428312SEduard Zingerman #include <linux/bpf.h>
565428312SEduard Zingerman #include <bpf/bpf_helpers.h>
665428312SEduard Zingerman #include "bpf_misc.h"
765428312SEduard Zingerman 
865428312SEduard Zingerman SEC("xdp")
965428312SEduard Zingerman __description("meta access, test1")
1065428312SEduard Zingerman __success __retval(0)
meta_access_test1(void)1165428312SEduard Zingerman __naked void meta_access_test1(void)
1265428312SEduard Zingerman {
1365428312SEduard Zingerman 	asm volatile ("					\
1465428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
1565428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
1665428312SEduard Zingerman 	r0 = r2;					\
1765428312SEduard Zingerman 	r0 += 8;					\
1865428312SEduard Zingerman 	if r0 > r3 goto l0_%=;				\
1965428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
2065428312SEduard Zingerman l0_%=:	r0 = 0;						\
2165428312SEduard Zingerman 	exit;						\
2265428312SEduard Zingerman "	:
2365428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
2465428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
2565428312SEduard Zingerman 	: __clobber_all);
2665428312SEduard Zingerman }
2765428312SEduard Zingerman 
2865428312SEduard Zingerman SEC("xdp")
2965428312SEduard Zingerman __description("meta access, test2")
3065428312SEduard Zingerman __failure __msg("invalid access to packet, off=-8")
meta_access_test2(void)3165428312SEduard Zingerman __naked void meta_access_test2(void)
3265428312SEduard Zingerman {
3365428312SEduard Zingerman 	asm volatile ("					\
3465428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
3565428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
3665428312SEduard Zingerman 	r0 = r2;					\
3765428312SEduard Zingerman 	r0 -= 8;					\
3865428312SEduard Zingerman 	r4 = r2;					\
3965428312SEduard Zingerman 	r4 += 8;					\
4065428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
4165428312SEduard Zingerman 	r0 = *(u8*)(r0 + 0);				\
4265428312SEduard Zingerman l0_%=:	r0 = 0;						\
4365428312SEduard Zingerman 	exit;						\
4465428312SEduard Zingerman "	:
4565428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
4665428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
4765428312SEduard Zingerman 	: __clobber_all);
4865428312SEduard Zingerman }
4965428312SEduard Zingerman 
5065428312SEduard Zingerman SEC("xdp")
5165428312SEduard Zingerman __description("meta access, test3")
5265428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test3(void)5365428312SEduard Zingerman __naked void meta_access_test3(void)
5465428312SEduard Zingerman {
5565428312SEduard Zingerman 	asm volatile ("					\
5665428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
5765428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
5865428312SEduard Zingerman 	r0 = r2;					\
5965428312SEduard Zingerman 	r0 += 8;					\
6065428312SEduard Zingerman 	if r0 > r3 goto l0_%=;				\
6165428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
6265428312SEduard Zingerman l0_%=:	r0 = 0;						\
6365428312SEduard Zingerman 	exit;						\
6465428312SEduard Zingerman "	:
6565428312SEduard Zingerman 	: __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
6665428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
6765428312SEduard Zingerman 	: __clobber_all);
6865428312SEduard Zingerman }
6965428312SEduard Zingerman 
7065428312SEduard Zingerman SEC("xdp")
7165428312SEduard Zingerman __description("meta access, test4")
7265428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test4(void)7365428312SEduard Zingerman __naked void meta_access_test4(void)
7465428312SEduard Zingerman {
7565428312SEduard Zingerman 	asm volatile ("					\
7665428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
7765428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\
7865428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data]);		\
7965428312SEduard Zingerman 	r0 = r4;					\
8065428312SEduard Zingerman 	r0 += 8;					\
8165428312SEduard Zingerman 	if r0 > r3 goto l0_%=;				\
8265428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
8365428312SEduard Zingerman l0_%=:	r0 = 0;						\
8465428312SEduard Zingerman 	exit;						\
8565428312SEduard Zingerman "	:
8665428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
8765428312SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
8865428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
8965428312SEduard Zingerman 	: __clobber_all);
9065428312SEduard Zingerman }
9165428312SEduard Zingerman 
9265428312SEduard Zingerman SEC("xdp")
9365428312SEduard Zingerman __description("meta access, test5")
9465428312SEduard Zingerman __failure __msg("R3 !read_ok")
meta_access_test5(void)9565428312SEduard Zingerman __naked void meta_access_test5(void)
9665428312SEduard Zingerman {
9765428312SEduard Zingerman 	asm volatile ("					\
9865428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
9965428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data]);		\
10065428312SEduard Zingerman 	r0 = r3;					\
10165428312SEduard Zingerman 	r0 += 8;					\
10265428312SEduard Zingerman 	if r0 > r4 goto l0_%=;				\
10365428312SEduard Zingerman 	r2 = -8;					\
10465428312SEduard Zingerman 	call %[bpf_xdp_adjust_meta];			\
10565428312SEduard Zingerman 	r0 = *(u8*)(r3 + 0);				\
10665428312SEduard Zingerman l0_%=:	r0 = 0;						\
10765428312SEduard Zingerman 	exit;						\
10865428312SEduard Zingerman "	:
10965428312SEduard Zingerman 	: __imm(bpf_xdp_adjust_meta),
11065428312SEduard Zingerman 	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
11165428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
11265428312SEduard Zingerman 	: __clobber_all);
11365428312SEduard Zingerman }
11465428312SEduard Zingerman 
11565428312SEduard Zingerman SEC("xdp")
11665428312SEduard Zingerman __description("meta access, test6")
11765428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test6(void)11865428312SEduard Zingerman __naked void meta_access_test6(void)
11965428312SEduard Zingerman {
12065428312SEduard Zingerman 	asm volatile ("					\
12165428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
12265428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
12365428312SEduard Zingerman 	r0 = r3;					\
12465428312SEduard Zingerman 	r0 += 8;					\
12565428312SEduard Zingerman 	r4 = r2;					\
12665428312SEduard Zingerman 	r4 += 8;					\
12765428312SEduard Zingerman 	if r4 > r0 goto l0_%=;				\
12865428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
12965428312SEduard Zingerman l0_%=:	r0 = 0;						\
13065428312SEduard Zingerman 	exit;						\
13165428312SEduard Zingerman "	:
13265428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
13365428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
13465428312SEduard Zingerman 	: __clobber_all);
13565428312SEduard Zingerman }
13665428312SEduard Zingerman 
13765428312SEduard Zingerman SEC("xdp")
13865428312SEduard Zingerman __description("meta access, test7")
13965428312SEduard Zingerman __success __retval(0)
meta_access_test7(void)14065428312SEduard Zingerman __naked void meta_access_test7(void)
14165428312SEduard Zingerman {
14265428312SEduard Zingerman 	asm volatile ("					\
14365428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
14465428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
14565428312SEduard Zingerman 	r0 = r3;					\
14665428312SEduard Zingerman 	r0 += 8;					\
14765428312SEduard Zingerman 	r4 = r2;					\
14865428312SEduard Zingerman 	r4 += 8;					\
14965428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
15065428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
15165428312SEduard Zingerman l0_%=:	r0 = 0;						\
15265428312SEduard Zingerman 	exit;						\
15365428312SEduard Zingerman "	:
15465428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
15565428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
15665428312SEduard Zingerman 	: __clobber_all);
15765428312SEduard Zingerman }
15865428312SEduard Zingerman 
15965428312SEduard Zingerman SEC("xdp")
16065428312SEduard Zingerman __description("meta access, test8")
16165428312SEduard Zingerman __success __retval(0)
meta_access_test8(void)16265428312SEduard Zingerman __naked void meta_access_test8(void)
16365428312SEduard Zingerman {
16465428312SEduard Zingerman 	asm volatile ("					\
16565428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
16665428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
16765428312SEduard Zingerman 	r4 = r2;					\
16865428312SEduard Zingerman 	r4 += 0xFFFF;					\
16965428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
17065428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
17165428312SEduard Zingerman l0_%=:	r0 = 0;						\
17265428312SEduard Zingerman 	exit;						\
17365428312SEduard Zingerman "	:
17465428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
17565428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
17665428312SEduard Zingerman 	: __clobber_all);
17765428312SEduard Zingerman }
17865428312SEduard Zingerman 
17965428312SEduard Zingerman SEC("xdp")
18065428312SEduard Zingerman __description("meta access, test9")
18165428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test9(void)18265428312SEduard Zingerman __naked void meta_access_test9(void)
18365428312SEduard Zingerman {
18465428312SEduard Zingerman 	asm volatile ("					\
18565428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
18665428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
18765428312SEduard Zingerman 	r4 = r2;					\
18865428312SEduard Zingerman 	r4 += 0xFFFF;					\
18965428312SEduard Zingerman 	r4 += 1;					\
19065428312SEduard Zingerman 	if r4 > r3 goto l0_%=;				\
19165428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
19265428312SEduard Zingerman l0_%=:	r0 = 0;						\
19365428312SEduard Zingerman 	exit;						\
19465428312SEduard Zingerman "	:
19565428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
19665428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
19765428312SEduard Zingerman 	: __clobber_all);
19865428312SEduard Zingerman }
19965428312SEduard Zingerman 
20065428312SEduard Zingerman SEC("xdp")
20165428312SEduard Zingerman __description("meta access, test10")
20265428312SEduard Zingerman __failure __msg("invalid access to packet")
meta_access_test10(void)20365428312SEduard Zingerman __naked void meta_access_test10(void)
20465428312SEduard Zingerman {
20565428312SEduard Zingerman 	asm volatile ("					\
20665428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
20765428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
20865428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data_end]);		\
20965428312SEduard Zingerman 	r5 = 42;					\
21065428312SEduard Zingerman 	r6 = 24;					\
21165428312SEduard Zingerman 	*(u64*)(r10 - 8) = r5;				\
21265428312SEduard Zingerman 	lock *(u64 *)(r10 - 8) += r6;			\
21365428312SEduard Zingerman 	r5 = *(u64*)(r10 - 8);				\
21465428312SEduard Zingerman 	if r5 > 100 goto l0_%=;				\
21565428312SEduard Zingerman 	r3 += r5;					\
21665428312SEduard Zingerman 	r5 = r3;					\
21765428312SEduard Zingerman 	r6 = r2;					\
21865428312SEduard Zingerman 	r6 += 8;					\
21965428312SEduard Zingerman 	if r6 > r5 goto l0_%=;				\
22065428312SEduard Zingerman 	r2 = *(u8*)(r2 + 0);				\
22165428312SEduard Zingerman l0_%=:	r0 = 0;						\
22265428312SEduard Zingerman 	exit;						\
22365428312SEduard Zingerman "	:
22465428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
22565428312SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
22665428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
22765428312SEduard Zingerman 	: __clobber_all);
22865428312SEduard Zingerman }
22965428312SEduard Zingerman 
23065428312SEduard Zingerman SEC("xdp")
23165428312SEduard Zingerman __description("meta access, test11")
23265428312SEduard Zingerman __success __retval(0)
meta_access_test11(void)23365428312SEduard Zingerman __naked void meta_access_test11(void)
23465428312SEduard Zingerman {
23565428312SEduard Zingerman 	asm volatile ("					\
23665428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
23765428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
23865428312SEduard Zingerman 	r5 = 42;					\
23965428312SEduard Zingerman 	r6 = 24;					\
24065428312SEduard Zingerman 	*(u64*)(r10 - 8) = r5;				\
24165428312SEduard Zingerman 	lock *(u64 *)(r10 - 8) += r6;			\
24265428312SEduard Zingerman 	r5 = *(u64*)(r10 - 8);				\
24365428312SEduard Zingerman 	if r5 > 100 goto l0_%=;				\
24465428312SEduard Zingerman 	r2 += r5;					\
24565428312SEduard Zingerman 	r5 = r2;					\
24665428312SEduard Zingerman 	r6 = r2;					\
24765428312SEduard Zingerman 	r6 += 8;					\
24865428312SEduard Zingerman 	if r6 > r3 goto l0_%=;				\
24965428312SEduard Zingerman 	r5 = *(u8*)(r5 + 0);				\
25065428312SEduard Zingerman l0_%=:	r0 = 0;						\
25165428312SEduard Zingerman 	exit;						\
25265428312SEduard Zingerman "	:
25365428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
25465428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
25565428312SEduard Zingerman 	: __clobber_all);
25665428312SEduard Zingerman }
25765428312SEduard Zingerman 
25865428312SEduard Zingerman SEC("xdp")
25965428312SEduard Zingerman __description("meta access, test12")
26065428312SEduard Zingerman __success __retval(0)
meta_access_test12(void)26165428312SEduard Zingerman __naked void meta_access_test12(void)
26265428312SEduard Zingerman {
26365428312SEduard Zingerman 	asm volatile ("					\
26465428312SEduard Zingerman 	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\
26565428312SEduard Zingerman 	r3 = *(u32*)(r1 + %[xdp_md_data]);		\
26665428312SEduard Zingerman 	r4 = *(u32*)(r1 + %[xdp_md_data_end]);		\
26765428312SEduard Zingerman 	r5 = r3;					\
26865428312SEduard Zingerman 	r5 += 16;					\
26965428312SEduard Zingerman 	if r5 > r4 goto l0_%=;				\
27065428312SEduard Zingerman 	r0 = *(u8*)(r3 + 0);				\
27165428312SEduard Zingerman 	r5 = r2;					\
27265428312SEduard Zingerman 	r5 += 16;					\
27365428312SEduard Zingerman 	if r5 > r3 goto l0_%=;				\
27465428312SEduard Zingerman 	r0 = *(u8*)(r2 + 0);				\
27565428312SEduard Zingerman l0_%=:	r0 = 0;						\
27665428312SEduard Zingerman 	exit;						\
27765428312SEduard Zingerman "	:
27865428312SEduard Zingerman 	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),
27965428312SEduard Zingerman 	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),
28065428312SEduard Zingerman 	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))
28165428312SEduard Zingerman 	: __clobber_all);
28265428312SEduard Zingerman }
28365428312SEduard Zingerman 
28465428312SEduard Zingerman char _license[] SEC("license") = "GPL";
285