brintos

brintos / linux-shallow public Read only

0
0
Text · 7.1 KiB · d81722f Raw
285 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Converted from tools/testing/selftests/bpf/verifier/meta_access.c */3 4#include <linux/bpf.h>5#include <bpf/bpf_helpers.h>6#include "bpf_misc.h"7 8SEC("xdp")9__description("meta access, test1")10__success __retval(0)11__naked void meta_access_test1(void)12{13	asm volatile ("					\14	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\15	r3 = *(u32*)(r1 + %[xdp_md_data]);		\16	r0 = r2;					\17	r0 += 8;					\18	if r0 > r3 goto l0_%=;				\19	r0 = *(u8*)(r2 + 0);				\20l0_%=:	r0 = 0;						\21	exit;						\22"	:23	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),24	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))25	: __clobber_all);26}27 28SEC("xdp")29__description("meta access, test2")30__failure __msg("invalid access to packet, off=-8")31__naked void meta_access_test2(void)32{33	asm volatile ("					\34	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\35	r3 = *(u32*)(r1 + %[xdp_md_data]);		\36	r0 = r2;					\37	r0 -= 8;					\38	r4 = r2;					\39	r4 += 8;					\40	if r4 > r3 goto l0_%=;				\41	r0 = *(u8*)(r0 + 0);				\42l0_%=:	r0 = 0;						\43	exit;						\44"	:45	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),46	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))47	: __clobber_all);48}49 50SEC("xdp")51__description("meta access, test3")52__failure __msg("invalid access to packet")53__naked void meta_access_test3(void)54{55	asm volatile ("					\56	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\57	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\58	r0 = r2;					\59	r0 += 8;					\60	if r0 > r3 goto l0_%=;				\61	r0 = *(u8*)(r2 + 0);				\62l0_%=:	r0 = 0;						\63	exit;						\64"	:65	: __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),66	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))67	: __clobber_all);68}69 70SEC("xdp")71__description("meta access, test4")72__failure __msg("invalid access to packet")73__naked void meta_access_test4(void)74{75	asm volatile ("					\76	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\77	r3 = *(u32*)(r1 + %[xdp_md_data_end]);		\78	r4 = *(u32*)(r1 + %[xdp_md_data]);		\79	r0 = r4;					\80	r0 += 8;					\81	if r0 > r3 goto l0_%=;				\82	r0 = *(u8*)(r2 + 0);				\83l0_%=:	r0 = 0;						\84	exit;						\85"	:86	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),87	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),88	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))89	: __clobber_all);90}91 92SEC("xdp")93__description("meta access, test5")94__failure __msg("R3 !read_ok")95__naked void meta_access_test5(void)96{97	asm volatile ("					\98	r3 = *(u32*)(r1 + %[xdp_md_data_meta]);		\99	r4 = *(u32*)(r1 + %[xdp_md_data]);		\100	r0 = r3;					\101	r0 += 8;					\102	if r0 > r4 goto l0_%=;				\103	r2 = -8;					\104	call %[bpf_xdp_adjust_meta];			\105	r0 = *(u8*)(r3 + 0);				\106l0_%=:	r0 = 0;						\107	exit;						\108"	:109	: __imm(bpf_xdp_adjust_meta),110	  __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),111	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))112	: __clobber_all);113}114 115SEC("xdp")116__description("meta access, test6")117__failure __msg("invalid access to packet")118__naked void meta_access_test6(void)119{120	asm volatile ("					\121	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\122	r3 = *(u32*)(r1 + %[xdp_md_data]);		\123	r0 = r3;					\124	r0 += 8;					\125	r4 = r2;					\126	r4 += 8;					\127	if r4 > r0 goto l0_%=;				\128	r0 = *(u8*)(r2 + 0);				\129l0_%=:	r0 = 0;						\130	exit;						\131"	:132	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),133	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))134	: __clobber_all);135}136 137SEC("xdp")138__description("meta access, test7")139__success __retval(0)140__naked void meta_access_test7(void)141{142	asm volatile ("					\143	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\144	r3 = *(u32*)(r1 + %[xdp_md_data]);		\145	r0 = r3;					\146	r0 += 8;					\147	r4 = r2;					\148	r4 += 8;					\149	if r4 > r3 goto l0_%=;				\150	r0 = *(u8*)(r2 + 0);				\151l0_%=:	r0 = 0;						\152	exit;						\153"	:154	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),155	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))156	: __clobber_all);157}158 159SEC("xdp")160__description("meta access, test8")161__success __retval(0)162__naked void meta_access_test8(void)163{164	asm volatile ("					\165	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\166	r3 = *(u32*)(r1 + %[xdp_md_data]);		\167	r4 = r2;					\168	r4 += 0xFFFF;					\169	if r4 > r3 goto l0_%=;				\170	r0 = *(u8*)(r2 + 0);				\171l0_%=:	r0 = 0;						\172	exit;						\173"	:174	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),175	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))176	: __clobber_all);177}178 179SEC("xdp")180__description("meta access, test9")181__failure __msg("invalid access to packet")182__naked void meta_access_test9(void)183{184	asm volatile ("					\185	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\186	r3 = *(u32*)(r1 + %[xdp_md_data]);		\187	r4 = r2;					\188	r4 += 0xFFFF;					\189	r4 += 1;					\190	if r4 > r3 goto l0_%=;				\191	r0 = *(u8*)(r2 + 0);				\192l0_%=:	r0 = 0;						\193	exit;						\194"	:195	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),196	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))197	: __clobber_all);198}199 200SEC("xdp")201__description("meta access, test10")202__failure __msg("invalid access to packet")203__naked void meta_access_test10(void)204{205	asm volatile ("					\206	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\207	r3 = *(u32*)(r1 + %[xdp_md_data]);		\208	r4 = *(u32*)(r1 + %[xdp_md_data_end]);		\209	r5 = 42;					\210	r6 = 24;					\211	*(u64*)(r10 - 8) = r5;				\212	lock *(u64 *)(r10 - 8) += r6;			\213	r5 = *(u64*)(r10 - 8);				\214	if r5 > 100 goto l0_%=;				\215	r3 += r5;					\216	r5 = r3;					\217	r6 = r2;					\218	r6 += 8;					\219	if r6 > r5 goto l0_%=;				\220	r2 = *(u8*)(r2 + 0);				\221l0_%=:	r0 = 0;						\222	exit;						\223"	:224	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),225	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),226	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))227	: __clobber_all);228}229 230SEC("xdp")231__description("meta access, test11")232__success __retval(0)233__naked void meta_access_test11(void)234{235	asm volatile ("					\236	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\237	r3 = *(u32*)(r1 + %[xdp_md_data]);		\238	r5 = 42;					\239	r6 = 24;					\240	*(u64*)(r10 - 8) = r5;				\241	lock *(u64 *)(r10 - 8) += r6;			\242	r5 = *(u64*)(r10 - 8);				\243	if r5 > 100 goto l0_%=;				\244	r2 += r5;					\245	r5 = r2;					\246	r6 = r2;					\247	r6 += 8;					\248	if r6 > r3 goto l0_%=;				\249	r5 = *(u8*)(r5 + 0);				\250l0_%=:	r0 = 0;						\251	exit;						\252"	:253	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),254	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))255	: __clobber_all);256}257 258SEC("xdp")259__description("meta access, test12")260__success __retval(0)261__naked void meta_access_test12(void)262{263	asm volatile ("					\264	r2 = *(u32*)(r1 + %[xdp_md_data_meta]);		\265	r3 = *(u32*)(r1 + %[xdp_md_data]);		\266	r4 = *(u32*)(r1 + %[xdp_md_data_end]);		\267	r5 = r3;					\268	r5 += 16;					\269	if r5 > r4 goto l0_%=;				\270	r0 = *(u8*)(r3 + 0);				\271	r5 = r2;					\272	r5 += 16;					\273	if r5 > r3 goto l0_%=;				\274	r0 = *(u8*)(r2 + 0);				\275l0_%=:	r0 = 0;						\276	exit;						\277"	:278	: __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),279	  __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end)),280	  __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))281	: __clobber_all);282}283 284char _license[] SEC("license") = "GPL";285