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