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