1723 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Converted from tools/testing/selftests/bpf/verifier/xdp_direct_packet_access.c */3 4#include <linux/bpf.h>5#include <bpf/bpf_helpers.h>6#include "bpf_misc.h"7 8SEC("xdp")9__description("XDP pkt read, pkt_end mangling, bad access 1")10__failure __msg("R3 pointer arithmetic on pkt_end")11__naked void end_mangling_bad_access_1(void)12{13 asm volatile (" \14 r2 = *(u32*)(r1 + %[xdp_md_data]); \15 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \16 r1 = r2; \17 r1 += 8; \18 r3 += 8; \19 if r1 > r3 goto l0_%=; \20 r0 = *(u64*)(r1 - 8); \21l0_%=: r0 = 0; \22 exit; \23" :24 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),25 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))26 : __clobber_all);27}28 29SEC("xdp")30__description("XDP pkt read, pkt_end mangling, bad access 2")31__failure __msg("R3 pointer arithmetic on pkt_end")32__naked void end_mangling_bad_access_2(void)33{34 asm volatile (" \35 r2 = *(u32*)(r1 + %[xdp_md_data]); \36 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \37 r1 = r2; \38 r1 += 8; \39 r3 -= 8; \40 if r1 > r3 goto l0_%=; \41 r0 = *(u64*)(r1 - 8); \42l0_%=: r0 = 0; \43 exit; \44" :45 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),46 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))47 : __clobber_all);48}49 50SEC("xdp")51__description("XDP pkt read, pkt_data' > pkt_end, corner case, good access")52__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)53__naked void end_corner_case_good_access_1(void)54{55 asm volatile (" \56 r2 = *(u32*)(r1 + %[xdp_md_data]); \57 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \58 r1 = r2; \59 r1 += 8; \60 if r1 > r3 goto l0_%=; \61 r0 = *(u64*)(r1 - 8); \62l0_%=: r0 = 0; \63 exit; \64" :65 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),66 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))67 : __clobber_all);68}69 70SEC("xdp")71__description("XDP pkt read, pkt_data' > pkt_end, bad access 1")72__failure __msg("R1 offset is outside of the packet")73__flag(BPF_F_ANY_ALIGNMENT)74__naked void pkt_end_bad_access_1_1(void)75{76 asm volatile (" \77 r2 = *(u32*)(r1 + %[xdp_md_data]); \78 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \79 r1 = r2; \80 r1 += 8; \81 if r1 > r3 goto l0_%=; \82 r0 = *(u64*)(r1 - 4); \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 : __clobber_all);89}90 91SEC("xdp")92__description("XDP pkt read, pkt_data' > pkt_end, bad access 2")93__failure __msg("R1 offset is outside of the packet")94__flag(BPF_F_ANY_ALIGNMENT)95__naked void pkt_end_bad_access_2_1(void)96{97 asm volatile (" \98 r2 = *(u32*)(r1 + %[xdp_md_data]); \99 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \100 r1 = r2; \101 r1 += 8; \102 if r1 > r3 goto l0_%=; \103l0_%=: r0 = *(u64*)(r1 - 8); \104 r0 = 0; \105 exit; \106" :107 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),108 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))109 : __clobber_all);110}111 112SEC("xdp")113__description("XDP pkt read, pkt_data' > pkt_end, corner case +1, good access")114__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)115__naked void corner_case_1_good_access_1(void)116{117 asm volatile (" \118 r2 = *(u32*)(r1 + %[xdp_md_data]); \119 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \120 r1 = r2; \121 r1 += 9; \122 if r1 > r3 goto l0_%=; \123 r0 = *(u64*)(r1 - 9); \124l0_%=: r0 = 0; \125 exit; \126" :127 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),128 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))129 : __clobber_all);130}131 132SEC("xdp")133__description("XDP pkt read, pkt_data' > pkt_end, corner case -1, bad access")134__failure __msg("R1 offset is outside of the packet")135__flag(BPF_F_ANY_ALIGNMENT)136__naked void corner_case_1_bad_access_1(void)137{138 asm volatile (" \139 r2 = *(u32*)(r1 + %[xdp_md_data]); \140 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \141 r1 = r2; \142 r1 += 7; \143 if r1 > r3 goto l0_%=; \144 r0 = *(u64*)(r1 - 7); \145l0_%=: r0 = 0; \146 exit; \147" :148 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),149 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))150 : __clobber_all);151}152 153SEC("xdp")154__description("XDP pkt read, pkt_end > pkt_data', good access")155__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)156__naked void end_pkt_data_good_access_1(void)157{158 asm volatile (" \159 r2 = *(u32*)(r1 + %[xdp_md_data]); \160 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \161 r1 = r2; \162 r1 += 8; \163 if r3 > r1 goto l0_%=; \164 goto l1_%=; \165l0_%=: r0 = *(u32*)(r1 - 5); \166l1_%=: r0 = 0; \167 exit; \168" :169 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),170 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))171 : __clobber_all);172}173 174SEC("xdp")175__description("XDP pkt read, pkt_end > pkt_data', corner case -1, bad access")176__failure __msg("R1 offset is outside of the packet")177__flag(BPF_F_ANY_ALIGNMENT)178__naked void corner_case_1_bad_access_2(void)179{180 asm volatile (" \181 r2 = *(u32*)(r1 + %[xdp_md_data]); \182 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \183 r1 = r2; \184 r1 += 6; \185 if r3 > r1 goto l0_%=; \186 goto l1_%=; \187l0_%=: r0 = *(u64*)(r1 - 6); \188l1_%=: r0 = 0; \189 exit; \190" :191 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),192 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))193 : __clobber_all);194}195 196SEC("xdp")197__description("XDP pkt read, pkt_end > pkt_data', bad access 2")198__failure __msg("R1 offset is outside of the packet")199__flag(BPF_F_ANY_ALIGNMENT)200__naked void pkt_data_bad_access_2_1(void)201{202 asm volatile (" \203 r2 = *(u32*)(r1 + %[xdp_md_data]); \204 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \205 r1 = r2; \206 r1 += 8; \207 if r3 > r1 goto l0_%=; \208 r0 = *(u64*)(r1 - 8); \209l0_%=: r0 = 0; \210 exit; \211" :212 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),213 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))214 : __clobber_all);215}216 217SEC("xdp")218__description("XDP pkt read, pkt_end > pkt_data', corner case, good access")219__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)220__naked void data_corner_case_good_access_1(void)221{222 asm volatile (" \223 r2 = *(u32*)(r1 + %[xdp_md_data]); \224 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \225 r1 = r2; \226 r1 += 7; \227 if r3 > r1 goto l0_%=; \228 goto l1_%=; \229l0_%=: r0 = *(u64*)(r1 - 7); \230l1_%=: r0 = 0; \231 exit; \232" :233 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),234 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))235 : __clobber_all);236}237 238SEC("xdp")239__description("XDP pkt read, pkt_end > pkt_data', corner case +1, good access")240__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)241__naked void corner_case_1_good_access_2(void)242{243 asm volatile (" \244 r2 = *(u32*)(r1 + %[xdp_md_data]); \245 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \246 r1 = r2; \247 r1 += 8; \248 if r3 > r1 goto l0_%=; \249 goto l1_%=; \250l0_%=: r0 = *(u64*)(r1 - 8); \251l1_%=: r0 = 0; \252 exit; \253" :254 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),255 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))256 : __clobber_all);257}258 259SEC("xdp")260__description("XDP pkt read, pkt_data' < pkt_end, good access")261__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)262__naked void data_pkt_end_good_access_1(void)263{264 asm volatile (" \265 r2 = *(u32*)(r1 + %[xdp_md_data]); \266 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \267 r1 = r2; \268 r1 += 8; \269 if r1 < r3 goto l0_%=; \270 goto l1_%=; \271l0_%=: r0 = *(u32*)(r1 - 5); \272l1_%=: r0 = 0; \273 exit; \274" :275 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),276 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))277 : __clobber_all);278}279 280SEC("xdp")281__description("XDP pkt read, pkt_data' < pkt_end, corner case -1, bad access")282__failure __msg("R1 offset is outside of the packet")283__flag(BPF_F_ANY_ALIGNMENT)284__naked void corner_case_1_bad_access_3(void)285{286 asm volatile (" \287 r2 = *(u32*)(r1 + %[xdp_md_data]); \288 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \289 r1 = r2; \290 r1 += 6; \291 if r1 < r3 goto l0_%=; \292 goto l1_%=; \293l0_%=: r0 = *(u64*)(r1 - 6); \294l1_%=: r0 = 0; \295 exit; \296" :297 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),298 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))299 : __clobber_all);300}301 302SEC("xdp")303__description("XDP pkt read, pkt_data' < pkt_end, bad access 2")304__failure __msg("R1 offset is outside of the packet")305__flag(BPF_F_ANY_ALIGNMENT)306__naked void pkt_end_bad_access_2_2(void)307{308 asm volatile (" \309 r2 = *(u32*)(r1 + %[xdp_md_data]); \310 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \311 r1 = r2; \312 r1 += 8; \313 if r1 < r3 goto l0_%=; \314 r0 = *(u64*)(r1 - 8); \315l0_%=: r0 = 0; \316 exit; \317" :318 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),319 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))320 : __clobber_all);321}322 323SEC("xdp")324__description("XDP pkt read, pkt_data' < pkt_end, corner case, good access")325__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)326__naked void end_corner_case_good_access_2(void)327{328 asm volatile (" \329 r2 = *(u32*)(r1 + %[xdp_md_data]); \330 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \331 r1 = r2; \332 r1 += 7; \333 if r1 < r3 goto l0_%=; \334 goto l1_%=; \335l0_%=: r0 = *(u64*)(r1 - 7); \336l1_%=: r0 = 0; \337 exit; \338" :339 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),340 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))341 : __clobber_all);342}343 344SEC("xdp")345__description("XDP pkt read, pkt_data' < pkt_end, corner case +1, good access")346__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)347__naked void corner_case_1_good_access_3(void)348{349 asm volatile (" \350 r2 = *(u32*)(r1 + %[xdp_md_data]); \351 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \352 r1 = r2; \353 r1 += 8; \354 if r1 < r3 goto l0_%=; \355 goto l1_%=; \356l0_%=: r0 = *(u64*)(r1 - 8); \357l1_%=: r0 = 0; \358 exit; \359" :360 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),361 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))362 : __clobber_all);363}364 365SEC("xdp")366__description("XDP pkt read, pkt_end < pkt_data', corner case, good access")367__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)368__naked void data_corner_case_good_access_2(void)369{370 asm volatile (" \371 r2 = *(u32*)(r1 + %[xdp_md_data]); \372 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \373 r1 = r2; \374 r1 += 8; \375 if r3 < r1 goto l0_%=; \376 r0 = *(u64*)(r1 - 8); \377l0_%=: r0 = 0; \378 exit; \379" :380 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),381 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))382 : __clobber_all);383}384 385SEC("xdp")386__description("XDP pkt read, pkt_end < pkt_data', bad access 1")387__failure __msg("R1 offset is outside of the packet")388__flag(BPF_F_ANY_ALIGNMENT)389__naked void pkt_data_bad_access_1_1(void)390{391 asm volatile (" \392 r2 = *(u32*)(r1 + %[xdp_md_data]); \393 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \394 r1 = r2; \395 r1 += 8; \396 if r3 < r1 goto l0_%=; \397 r0 = *(u64*)(r1 - 4); \398l0_%=: r0 = 0; \399 exit; \400" :401 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),402 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))403 : __clobber_all);404}405 406SEC("xdp")407__description("XDP pkt read, pkt_end < pkt_data', bad access 2")408__failure __msg("R1 offset is outside of the packet")409__flag(BPF_F_ANY_ALIGNMENT)410__naked void pkt_data_bad_access_2_2(void)411{412 asm volatile (" \413 r2 = *(u32*)(r1 + %[xdp_md_data]); \414 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \415 r1 = r2; \416 r1 += 8; \417 if r3 < r1 goto l0_%=; \418l0_%=: r0 = *(u64*)(r1 - 8); \419 r0 = 0; \420 exit; \421" :422 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),423 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))424 : __clobber_all);425}426 427SEC("xdp")428__description("XDP pkt read, pkt_end < pkt_data', corner case +1, good access")429__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)430__naked void corner_case_1_good_access_4(void)431{432 asm volatile (" \433 r2 = *(u32*)(r1 + %[xdp_md_data]); \434 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \435 r1 = r2; \436 r1 += 9; \437 if r3 < r1 goto l0_%=; \438 r0 = *(u64*)(r1 - 9); \439l0_%=: r0 = 0; \440 exit; \441" :442 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),443 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))444 : __clobber_all);445}446 447SEC("xdp")448__description("XDP pkt read, pkt_end < pkt_data', corner case -1, bad access")449__failure __msg("R1 offset is outside of the packet")450__flag(BPF_F_ANY_ALIGNMENT)451__naked void corner_case_1_bad_access_4(void)452{453 asm volatile (" \454 r2 = *(u32*)(r1 + %[xdp_md_data]); \455 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \456 r1 = r2; \457 r1 += 7; \458 if r3 < r1 goto l0_%=; \459 r0 = *(u64*)(r1 - 7); \460l0_%=: r0 = 0; \461 exit; \462" :463 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),464 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))465 : __clobber_all);466}467 468SEC("xdp")469__description("XDP pkt read, pkt_data' >= pkt_end, good access")470__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)471__naked void data_pkt_end_good_access_2(void)472{473 asm volatile (" \474 r2 = *(u32*)(r1 + %[xdp_md_data]); \475 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \476 r1 = r2; \477 r1 += 8; \478 if r1 >= r3 goto l0_%=; \479 r0 = *(u32*)(r1 - 5); \480l0_%=: r0 = 0; \481 exit; \482" :483 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),484 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))485 : __clobber_all);486}487 488SEC("xdp")489__description("XDP pkt read, pkt_data' >= pkt_end, corner case -1, bad access")490__failure __msg("R1 offset is outside of the packet")491__flag(BPF_F_ANY_ALIGNMENT)492__naked void corner_case_1_bad_access_5(void)493{494 asm volatile (" \495 r2 = *(u32*)(r1 + %[xdp_md_data]); \496 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \497 r1 = r2; \498 r1 += 6; \499 if r1 >= r3 goto l0_%=; \500 r0 = *(u64*)(r1 - 6); \501l0_%=: r0 = 0; \502 exit; \503" :504 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),505 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))506 : __clobber_all);507}508 509SEC("xdp")510__description("XDP pkt read, pkt_data' >= pkt_end, bad access 2")511__failure __msg("R1 offset is outside of the packet")512__flag(BPF_F_ANY_ALIGNMENT)513__naked void pkt_end_bad_access_2_3(void)514{515 asm volatile (" \516 r2 = *(u32*)(r1 + %[xdp_md_data]); \517 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \518 r1 = r2; \519 r1 += 8; \520 if r1 >= r3 goto l0_%=; \521l0_%=: r0 = *(u32*)(r1 - 5); \522 r0 = 0; \523 exit; \524" :525 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),526 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))527 : __clobber_all);528}529 530SEC("xdp")531__description("XDP pkt read, pkt_data' >= pkt_end, corner case, good access")532__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)533__naked void end_corner_case_good_access_3(void)534{535 asm volatile (" \536 r2 = *(u32*)(r1 + %[xdp_md_data]); \537 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \538 r1 = r2; \539 r1 += 7; \540 if r1 >= r3 goto l0_%=; \541 r0 = *(u64*)(r1 - 7); \542l0_%=: r0 = 0; \543 exit; \544" :545 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),546 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))547 : __clobber_all);548}549 550SEC("xdp")551__description("XDP pkt read, pkt_data' >= pkt_end, corner case +1, good access")552__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)553__naked void corner_case_1_good_access_5(void)554{555 asm volatile (" \556 r2 = *(u32*)(r1 + %[xdp_md_data]); \557 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \558 r1 = r2; \559 r1 += 8; \560 if r1 >= r3 goto l0_%=; \561 r0 = *(u64*)(r1 - 8); \562l0_%=: r0 = 0; \563 exit; \564" :565 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),566 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))567 : __clobber_all);568}569 570SEC("xdp")571__description("XDP pkt read, pkt_end >= pkt_data', corner case, good access")572__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)573__naked void data_corner_case_good_access_3(void)574{575 asm volatile (" \576 r2 = *(u32*)(r1 + %[xdp_md_data]); \577 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \578 r1 = r2; \579 r1 += 8; \580 if r3 >= r1 goto l0_%=; \581 goto l1_%=; \582l0_%=: r0 = *(u64*)(r1 - 8); \583l1_%=: r0 = 0; \584 exit; \585" :586 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),587 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))588 : __clobber_all);589}590 591SEC("xdp")592__description("XDP pkt read, pkt_end >= pkt_data', bad access 1")593__failure __msg("R1 offset is outside of the packet")594__flag(BPF_F_ANY_ALIGNMENT)595__naked void pkt_data_bad_access_1_2(void)596{597 asm volatile (" \598 r2 = *(u32*)(r1 + %[xdp_md_data]); \599 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \600 r1 = r2; \601 r1 += 8; \602 if r3 >= r1 goto l0_%=; \603 goto l1_%=; \604l0_%=: r0 = *(u64*)(r1 - 4); \605l1_%=: r0 = 0; \606 exit; \607" :608 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),609 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))610 : __clobber_all);611}612 613SEC("xdp")614__description("XDP pkt read, pkt_end >= pkt_data', bad access 2")615__failure __msg("R1 offset is outside of the packet")616__flag(BPF_F_ANY_ALIGNMENT)617__naked void pkt_data_bad_access_2_3(void)618{619 asm volatile (" \620 r2 = *(u32*)(r1 + %[xdp_md_data]); \621 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \622 r1 = r2; \623 r1 += 8; \624 if r3 >= r1 goto l0_%=; \625 r0 = *(u64*)(r1 - 8); \626l0_%=: r0 = 0; \627 exit; \628" :629 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),630 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))631 : __clobber_all);632}633 634SEC("xdp")635__description("XDP pkt read, pkt_end >= pkt_data', corner case +1, good access")636__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)637__naked void corner_case_1_good_access_6(void)638{639 asm volatile (" \640 r2 = *(u32*)(r1 + %[xdp_md_data]); \641 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \642 r1 = r2; \643 r1 += 9; \644 if r3 >= r1 goto l0_%=; \645 goto l1_%=; \646l0_%=: r0 = *(u64*)(r1 - 9); \647l1_%=: r0 = 0; \648 exit; \649" :650 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),651 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))652 : __clobber_all);653}654 655SEC("xdp")656__description("XDP pkt read, pkt_end >= pkt_data', corner case -1, bad access")657__failure __msg("R1 offset is outside of the packet")658__flag(BPF_F_ANY_ALIGNMENT)659__naked void corner_case_1_bad_access_6(void)660{661 asm volatile (" \662 r2 = *(u32*)(r1 + %[xdp_md_data]); \663 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \664 r1 = r2; \665 r1 += 7; \666 if r3 >= r1 goto l0_%=; \667 goto l1_%=; \668l0_%=: r0 = *(u64*)(r1 - 7); \669l1_%=: r0 = 0; \670 exit; \671" :672 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),673 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))674 : __clobber_all);675}676 677SEC("xdp")678__description("XDP pkt read, pkt_data' <= pkt_end, corner case, good access")679__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)680__naked void end_corner_case_good_access_4(void)681{682 asm volatile (" \683 r2 = *(u32*)(r1 + %[xdp_md_data]); \684 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \685 r1 = r2; \686 r1 += 8; \687 if r1 <= r3 goto l0_%=; \688 goto l1_%=; \689l0_%=: r0 = *(u64*)(r1 - 8); \690l1_%=: r0 = 0; \691 exit; \692" :693 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),694 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))695 : __clobber_all);696}697 698SEC("xdp")699__description("XDP pkt read, pkt_data' <= pkt_end, bad access 1")700__failure __msg("R1 offset is outside of the packet")701__flag(BPF_F_ANY_ALIGNMENT)702__naked void pkt_end_bad_access_1_2(void)703{704 asm volatile (" \705 r2 = *(u32*)(r1 + %[xdp_md_data]); \706 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \707 r1 = r2; \708 r1 += 8; \709 if r1 <= r3 goto l0_%=; \710 goto l1_%=; \711l0_%=: r0 = *(u64*)(r1 - 4); \712l1_%=: r0 = 0; \713 exit; \714" :715 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),716 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))717 : __clobber_all);718}719 720SEC("xdp")721__description("XDP pkt read, pkt_data' <= pkt_end, bad access 2")722__failure __msg("R1 offset is outside of the packet")723__flag(BPF_F_ANY_ALIGNMENT)724__naked void pkt_end_bad_access_2_4(void)725{726 asm volatile (" \727 r2 = *(u32*)(r1 + %[xdp_md_data]); \728 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \729 r1 = r2; \730 r1 += 8; \731 if r1 <= r3 goto l0_%=; \732 r0 = *(u64*)(r1 - 8); \733l0_%=: r0 = 0; \734 exit; \735" :736 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),737 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))738 : __clobber_all);739}740 741SEC("xdp")742__description("XDP pkt read, pkt_data' <= pkt_end, corner case +1, good access")743__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)744__naked void corner_case_1_good_access_7(void)745{746 asm volatile (" \747 r2 = *(u32*)(r1 + %[xdp_md_data]); \748 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \749 r1 = r2; \750 r1 += 9; \751 if r1 <= r3 goto l0_%=; \752 goto l1_%=; \753l0_%=: r0 = *(u64*)(r1 - 9); \754l1_%=: r0 = 0; \755 exit; \756" :757 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),758 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))759 : __clobber_all);760}761 762SEC("xdp")763__description("XDP pkt read, pkt_data' <= pkt_end, corner case -1, bad access")764__failure __msg("R1 offset is outside of the packet")765__flag(BPF_F_ANY_ALIGNMENT)766__naked void corner_case_1_bad_access_7(void)767{768 asm volatile (" \769 r2 = *(u32*)(r1 + %[xdp_md_data]); \770 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \771 r1 = r2; \772 r1 += 7; \773 if r1 <= r3 goto l0_%=; \774 goto l1_%=; \775l0_%=: r0 = *(u64*)(r1 - 7); \776l1_%=: r0 = 0; \777 exit; \778" :779 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),780 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))781 : __clobber_all);782}783 784SEC("xdp")785__description("XDP pkt read, pkt_end <= pkt_data', good access")786__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)787__naked void end_pkt_data_good_access_2(void)788{789 asm volatile (" \790 r2 = *(u32*)(r1 + %[xdp_md_data]); \791 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \792 r1 = r2; \793 r1 += 8; \794 if r3 <= r1 goto l0_%=; \795 r0 = *(u32*)(r1 - 5); \796l0_%=: r0 = 0; \797 exit; \798" :799 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),800 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))801 : __clobber_all);802}803 804SEC("xdp")805__description("XDP pkt read, pkt_end <= pkt_data', corner case -1, bad access")806__failure __msg("R1 offset is outside of the packet")807__flag(BPF_F_ANY_ALIGNMENT)808__naked void corner_case_1_bad_access_8(void)809{810 asm volatile (" \811 r2 = *(u32*)(r1 + %[xdp_md_data]); \812 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \813 r1 = r2; \814 r1 += 6; \815 if r3 <= r1 goto l0_%=; \816 r0 = *(u64*)(r1 - 6); \817l0_%=: r0 = 0; \818 exit; \819" :820 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),821 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))822 : __clobber_all);823}824 825SEC("xdp")826__description("XDP pkt read, pkt_end <= pkt_data', bad access 2")827__failure __msg("R1 offset is outside of the packet")828__flag(BPF_F_ANY_ALIGNMENT)829__naked void pkt_data_bad_access_2_4(void)830{831 asm volatile (" \832 r2 = *(u32*)(r1 + %[xdp_md_data]); \833 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \834 r1 = r2; \835 r1 += 8; \836 if r3 <= r1 goto l0_%=; \837l0_%=: r0 = *(u32*)(r1 - 5); \838 r0 = 0; \839 exit; \840" :841 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),842 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))843 : __clobber_all);844}845 846SEC("xdp")847__description("XDP pkt read, pkt_end <= pkt_data', corner case, good access")848__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)849__naked void data_corner_case_good_access_4(void)850{851 asm volatile (" \852 r2 = *(u32*)(r1 + %[xdp_md_data]); \853 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \854 r1 = r2; \855 r1 += 7; \856 if r3 <= r1 goto l0_%=; \857 r0 = *(u64*)(r1 - 7); \858l0_%=: r0 = 0; \859 exit; \860" :861 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),862 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))863 : __clobber_all);864}865 866SEC("xdp")867__description("XDP pkt read, pkt_end <= pkt_data', corner case +1, good access")868__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)869__naked void corner_case_1_good_access_8(void)870{871 asm volatile (" \872 r2 = *(u32*)(r1 + %[xdp_md_data]); \873 r3 = *(u32*)(r1 + %[xdp_md_data_end]); \874 r1 = r2; \875 r1 += 8; \876 if r3 <= r1 goto l0_%=; \877 r0 = *(u64*)(r1 - 8); \878l0_%=: r0 = 0; \879 exit; \880" :881 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),882 __imm_const(xdp_md_data_end, offsetof(struct xdp_md, data_end))883 : __clobber_all);884}885 886SEC("xdp")887__description("XDP pkt read, pkt_meta' > pkt_data, corner case, good access")888__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)889__naked void data_corner_case_good_access_5(void)890{891 asm volatile (" \892 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \893 r3 = *(u32*)(r1 + %[xdp_md_data]); \894 r1 = r2; \895 r1 += 8; \896 if r1 > r3 goto l0_%=; \897 r0 = *(u64*)(r1 - 8); \898l0_%=: r0 = 0; \899 exit; \900" :901 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),902 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))903 : __clobber_all);904}905 906SEC("xdp")907__description("XDP pkt read, pkt_meta' > pkt_data, bad access 1")908__failure __msg("R1 offset is outside of the packet")909__flag(BPF_F_ANY_ALIGNMENT)910__naked void pkt_data_bad_access_1_3(void)911{912 asm volatile (" \913 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \914 r3 = *(u32*)(r1 + %[xdp_md_data]); \915 r1 = r2; \916 r1 += 8; \917 if r1 > r3 goto l0_%=; \918 r0 = *(u64*)(r1 - 4); \919l0_%=: r0 = 0; \920 exit; \921" :922 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),923 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))924 : __clobber_all);925}926 927SEC("xdp")928__description("XDP pkt read, pkt_meta' > pkt_data, bad access 2")929__failure __msg("R1 offset is outside of the packet")930__flag(BPF_F_ANY_ALIGNMENT)931__naked void pkt_data_bad_access_2_5(void)932{933 asm volatile (" \934 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \935 r3 = *(u32*)(r1 + %[xdp_md_data]); \936 r1 = r2; \937 r1 += 8; \938 if r1 > r3 goto l0_%=; \939l0_%=: r0 = *(u64*)(r1 - 8); \940 r0 = 0; \941 exit; \942" :943 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),944 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))945 : __clobber_all);946}947 948SEC("xdp")949__description("XDP pkt read, pkt_meta' > pkt_data, corner case +1, good access")950__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)951__naked void corner_case_1_good_access_9(void)952{953 asm volatile (" \954 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \955 r3 = *(u32*)(r1 + %[xdp_md_data]); \956 r1 = r2; \957 r1 += 9; \958 if r1 > r3 goto l0_%=; \959 r0 = *(u64*)(r1 - 9); \960l0_%=: r0 = 0; \961 exit; \962" :963 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),964 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))965 : __clobber_all);966}967 968SEC("xdp")969__description("XDP pkt read, pkt_meta' > pkt_data, corner case -1, bad access")970__failure __msg("R1 offset is outside of the packet")971__flag(BPF_F_ANY_ALIGNMENT)972__naked void corner_case_1_bad_access_9(void)973{974 asm volatile (" \975 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \976 r3 = *(u32*)(r1 + %[xdp_md_data]); \977 r1 = r2; \978 r1 += 7; \979 if r1 > r3 goto l0_%=; \980 r0 = *(u64*)(r1 - 7); \981l0_%=: r0 = 0; \982 exit; \983" :984 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),985 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))986 : __clobber_all);987}988 989SEC("xdp")990__description("XDP pkt read, pkt_data > pkt_meta', good access")991__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)992__naked void data_pkt_meta_good_access_1(void)993{994 asm volatile (" \995 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \996 r3 = *(u32*)(r1 + %[xdp_md_data]); \997 r1 = r2; \998 r1 += 8; \999 if r3 > r1 goto l0_%=; \1000 goto l1_%=; \1001l0_%=: r0 = *(u32*)(r1 - 5); \1002l1_%=: r0 = 0; \1003 exit; \1004" :1005 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1006 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1007 : __clobber_all);1008}1009 1010SEC("xdp")1011__description("XDP pkt read, pkt_data > pkt_meta', corner case -1, bad access")1012__failure __msg("R1 offset is outside of the packet")1013__flag(BPF_F_ANY_ALIGNMENT)1014__naked void corner_case_1_bad_access_10(void)1015{1016 asm volatile (" \1017 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1018 r3 = *(u32*)(r1 + %[xdp_md_data]); \1019 r1 = r2; \1020 r1 += 6; \1021 if r3 > r1 goto l0_%=; \1022 goto l1_%=; \1023l0_%=: r0 = *(u64*)(r1 - 6); \1024l1_%=: r0 = 0; \1025 exit; \1026" :1027 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1028 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1029 : __clobber_all);1030}1031 1032SEC("xdp")1033__description("XDP pkt read, pkt_data > pkt_meta', bad access 2")1034__failure __msg("R1 offset is outside of the packet")1035__flag(BPF_F_ANY_ALIGNMENT)1036__naked void pkt_meta_bad_access_2_1(void)1037{1038 asm volatile (" \1039 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1040 r3 = *(u32*)(r1 + %[xdp_md_data]); \1041 r1 = r2; \1042 r1 += 8; \1043 if r3 > r1 goto l0_%=; \1044 r0 = *(u64*)(r1 - 8); \1045l0_%=: r0 = 0; \1046 exit; \1047" :1048 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1049 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1050 : __clobber_all);1051}1052 1053SEC("xdp")1054__description("XDP pkt read, pkt_data > pkt_meta', corner case, good access")1055__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1056__naked void meta_corner_case_good_access_1(void)1057{1058 asm volatile (" \1059 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1060 r3 = *(u32*)(r1 + %[xdp_md_data]); \1061 r1 = r2; \1062 r1 += 7; \1063 if r3 > r1 goto l0_%=; \1064 goto l1_%=; \1065l0_%=: r0 = *(u64*)(r1 - 7); \1066l1_%=: r0 = 0; \1067 exit; \1068" :1069 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1070 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1071 : __clobber_all);1072}1073 1074SEC("xdp")1075__description("XDP pkt read, pkt_data > pkt_meta', corner case +1, good access")1076__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1077__naked void corner_case_1_good_access_10(void)1078{1079 asm volatile (" \1080 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1081 r3 = *(u32*)(r1 + %[xdp_md_data]); \1082 r1 = r2; \1083 r1 += 8; \1084 if r3 > r1 goto l0_%=; \1085 goto l1_%=; \1086l0_%=: r0 = *(u64*)(r1 - 8); \1087l1_%=: r0 = 0; \1088 exit; \1089" :1090 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1091 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1092 : __clobber_all);1093}1094 1095SEC("xdp")1096__description("XDP pkt read, pkt_meta' < pkt_data, good access")1097__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1098__naked void meta_pkt_data_good_access_1(void)1099{1100 asm volatile (" \1101 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1102 r3 = *(u32*)(r1 + %[xdp_md_data]); \1103 r1 = r2; \1104 r1 += 8; \1105 if r1 < r3 goto l0_%=; \1106 goto l1_%=; \1107l0_%=: r0 = *(u32*)(r1 - 5); \1108l1_%=: r0 = 0; \1109 exit; \1110" :1111 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1112 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1113 : __clobber_all);1114}1115 1116SEC("xdp")1117__description("XDP pkt read, pkt_meta' < pkt_data, corner case -1, bad access")1118__failure __msg("R1 offset is outside of the packet")1119__flag(BPF_F_ANY_ALIGNMENT)1120__naked void corner_case_1_bad_access_11(void)1121{1122 asm volatile (" \1123 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1124 r3 = *(u32*)(r1 + %[xdp_md_data]); \1125 r1 = r2; \1126 r1 += 6; \1127 if r1 < r3 goto l0_%=; \1128 goto l1_%=; \1129l0_%=: r0 = *(u64*)(r1 - 6); \1130l1_%=: r0 = 0; \1131 exit; \1132" :1133 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1134 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1135 : __clobber_all);1136}1137 1138SEC("xdp")1139__description("XDP pkt read, pkt_meta' < pkt_data, bad access 2")1140__failure __msg("R1 offset is outside of the packet")1141__flag(BPF_F_ANY_ALIGNMENT)1142__naked void pkt_data_bad_access_2_6(void)1143{1144 asm volatile (" \1145 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1146 r3 = *(u32*)(r1 + %[xdp_md_data]); \1147 r1 = r2; \1148 r1 += 8; \1149 if r1 < r3 goto l0_%=; \1150 r0 = *(u64*)(r1 - 8); \1151l0_%=: r0 = 0; \1152 exit; \1153" :1154 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1155 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1156 : __clobber_all);1157}1158 1159SEC("xdp")1160__description("XDP pkt read, pkt_meta' < pkt_data, corner case, good access")1161__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1162__naked void data_corner_case_good_access_6(void)1163{1164 asm volatile (" \1165 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1166 r3 = *(u32*)(r1 + %[xdp_md_data]); \1167 r1 = r2; \1168 r1 += 7; \1169 if r1 < r3 goto l0_%=; \1170 goto l1_%=; \1171l0_%=: r0 = *(u64*)(r1 - 7); \1172l1_%=: r0 = 0; \1173 exit; \1174" :1175 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1176 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1177 : __clobber_all);1178}1179 1180SEC("xdp")1181__description("XDP pkt read, pkt_meta' < pkt_data, corner case +1, good access")1182__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1183__naked void corner_case_1_good_access_11(void)1184{1185 asm volatile (" \1186 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1187 r3 = *(u32*)(r1 + %[xdp_md_data]); \1188 r1 = r2; \1189 r1 += 8; \1190 if r1 < r3 goto l0_%=; \1191 goto l1_%=; \1192l0_%=: r0 = *(u64*)(r1 - 8); \1193l1_%=: r0 = 0; \1194 exit; \1195" :1196 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1197 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1198 : __clobber_all);1199}1200 1201SEC("xdp")1202__description("XDP pkt read, pkt_data < pkt_meta', corner case, good access")1203__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1204__naked void meta_corner_case_good_access_2(void)1205{1206 asm volatile (" \1207 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1208 r3 = *(u32*)(r1 + %[xdp_md_data]); \1209 r1 = r2; \1210 r1 += 8; \1211 if r3 < r1 goto l0_%=; \1212 r0 = *(u64*)(r1 - 8); \1213l0_%=: r0 = 0; \1214 exit; \1215" :1216 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1217 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1218 : __clobber_all);1219}1220 1221SEC("xdp")1222__description("XDP pkt read, pkt_data < pkt_meta', bad access 1")1223__failure __msg("R1 offset is outside of the packet")1224__flag(BPF_F_ANY_ALIGNMENT)1225__naked void pkt_meta_bad_access_1_1(void)1226{1227 asm volatile (" \1228 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1229 r3 = *(u32*)(r1 + %[xdp_md_data]); \1230 r1 = r2; \1231 r1 += 8; \1232 if r3 < r1 goto l0_%=; \1233 r0 = *(u64*)(r1 - 4); \1234l0_%=: r0 = 0; \1235 exit; \1236" :1237 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1238 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1239 : __clobber_all);1240}1241 1242SEC("xdp")1243__description("XDP pkt read, pkt_data < pkt_meta', bad access 2")1244__failure __msg("R1 offset is outside of the packet")1245__flag(BPF_F_ANY_ALIGNMENT)1246__naked void pkt_meta_bad_access_2_2(void)1247{1248 asm volatile (" \1249 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1250 r3 = *(u32*)(r1 + %[xdp_md_data]); \1251 r1 = r2; \1252 r1 += 8; \1253 if r3 < r1 goto l0_%=; \1254l0_%=: r0 = *(u64*)(r1 - 8); \1255 r0 = 0; \1256 exit; \1257" :1258 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1259 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1260 : __clobber_all);1261}1262 1263SEC("xdp")1264__description("XDP pkt read, pkt_data < pkt_meta', corner case +1, good access")1265__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1266__naked void corner_case_1_good_access_12(void)1267{1268 asm volatile (" \1269 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1270 r3 = *(u32*)(r1 + %[xdp_md_data]); \1271 r1 = r2; \1272 r1 += 9; \1273 if r3 < r1 goto l0_%=; \1274 r0 = *(u64*)(r1 - 9); \1275l0_%=: r0 = 0; \1276 exit; \1277" :1278 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1279 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1280 : __clobber_all);1281}1282 1283SEC("xdp")1284__description("XDP pkt read, pkt_data < pkt_meta', corner case -1, bad access")1285__failure __msg("R1 offset is outside of the packet")1286__flag(BPF_F_ANY_ALIGNMENT)1287__naked void corner_case_1_bad_access_12(void)1288{1289 asm volatile (" \1290 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1291 r3 = *(u32*)(r1 + %[xdp_md_data]); \1292 r1 = r2; \1293 r1 += 7; \1294 if r3 < r1 goto l0_%=; \1295 r0 = *(u64*)(r1 - 7); \1296l0_%=: r0 = 0; \1297 exit; \1298" :1299 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1300 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1301 : __clobber_all);1302}1303 1304SEC("xdp")1305__description("XDP pkt read, pkt_meta' >= pkt_data, good access")1306__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1307__naked void meta_pkt_data_good_access_2(void)1308{1309 asm volatile (" \1310 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1311 r3 = *(u32*)(r1 + %[xdp_md_data]); \1312 r1 = r2; \1313 r1 += 8; \1314 if r1 >= r3 goto l0_%=; \1315 r0 = *(u32*)(r1 - 5); \1316l0_%=: r0 = 0; \1317 exit; \1318" :1319 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1320 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1321 : __clobber_all);1322}1323 1324SEC("xdp")1325__description("XDP pkt read, pkt_meta' >= pkt_data, corner case -1, bad access")1326__failure __msg("R1 offset is outside of the packet")1327__flag(BPF_F_ANY_ALIGNMENT)1328__naked void corner_case_1_bad_access_13(void)1329{1330 asm volatile (" \1331 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1332 r3 = *(u32*)(r1 + %[xdp_md_data]); \1333 r1 = r2; \1334 r1 += 6; \1335 if r1 >= r3 goto l0_%=; \1336 r0 = *(u64*)(r1 - 6); \1337l0_%=: r0 = 0; \1338 exit; \1339" :1340 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1341 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1342 : __clobber_all);1343}1344 1345SEC("xdp")1346__description("XDP pkt read, pkt_meta' >= pkt_data, bad access 2")1347__failure __msg("R1 offset is outside of the packet")1348__flag(BPF_F_ANY_ALIGNMENT)1349__naked void pkt_data_bad_access_2_7(void)1350{1351 asm volatile (" \1352 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1353 r3 = *(u32*)(r1 + %[xdp_md_data]); \1354 r1 = r2; \1355 r1 += 8; \1356 if r1 >= r3 goto l0_%=; \1357l0_%=: r0 = *(u32*)(r1 - 5); \1358 r0 = 0; \1359 exit; \1360" :1361 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1362 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1363 : __clobber_all);1364}1365 1366SEC("xdp")1367__description("XDP pkt read, pkt_meta' >= pkt_data, corner case, good access")1368__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1369__naked void data_corner_case_good_access_7(void)1370{1371 asm volatile (" \1372 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1373 r3 = *(u32*)(r1 + %[xdp_md_data]); \1374 r1 = r2; \1375 r1 += 7; \1376 if r1 >= r3 goto l0_%=; \1377 r0 = *(u64*)(r1 - 7); \1378l0_%=: r0 = 0; \1379 exit; \1380" :1381 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1382 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1383 : __clobber_all);1384}1385 1386SEC("xdp")1387__description("XDP pkt read, pkt_meta' >= pkt_data, corner case +1, good access")1388__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1389__naked void corner_case_1_good_access_13(void)1390{1391 asm volatile (" \1392 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1393 r3 = *(u32*)(r1 + %[xdp_md_data]); \1394 r1 = r2; \1395 r1 += 8; \1396 if r1 >= r3 goto l0_%=; \1397 r0 = *(u64*)(r1 - 8); \1398l0_%=: r0 = 0; \1399 exit; \1400" :1401 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1402 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1403 : __clobber_all);1404}1405 1406SEC("xdp")1407__description("XDP pkt read, pkt_data >= pkt_meta', corner case, good access")1408__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1409__naked void meta_corner_case_good_access_3(void)1410{1411 asm volatile (" \1412 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1413 r3 = *(u32*)(r1 + %[xdp_md_data]); \1414 r1 = r2; \1415 r1 += 8; \1416 if r3 >= r1 goto l0_%=; \1417 goto l1_%=; \1418l0_%=: r0 = *(u64*)(r1 - 8); \1419l1_%=: r0 = 0; \1420 exit; \1421" :1422 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1423 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1424 : __clobber_all);1425}1426 1427SEC("xdp")1428__description("XDP pkt read, pkt_data >= pkt_meta', bad access 1")1429__failure __msg("R1 offset is outside of the packet")1430__flag(BPF_F_ANY_ALIGNMENT)1431__naked void pkt_meta_bad_access_1_2(void)1432{1433 asm volatile (" \1434 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1435 r3 = *(u32*)(r1 + %[xdp_md_data]); \1436 r1 = r2; \1437 r1 += 8; \1438 if r3 >= r1 goto l0_%=; \1439 goto l1_%=; \1440l0_%=: r0 = *(u64*)(r1 - 4); \1441l1_%=: r0 = 0; \1442 exit; \1443" :1444 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1445 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1446 : __clobber_all);1447}1448 1449SEC("xdp")1450__description("XDP pkt read, pkt_data >= pkt_meta', bad access 2")1451__failure __msg("R1 offset is outside of the packet")1452__flag(BPF_F_ANY_ALIGNMENT)1453__naked void pkt_meta_bad_access_2_3(void)1454{1455 asm volatile (" \1456 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1457 r3 = *(u32*)(r1 + %[xdp_md_data]); \1458 r1 = r2; \1459 r1 += 8; \1460 if r3 >= r1 goto l0_%=; \1461 r0 = *(u64*)(r1 - 8); \1462l0_%=: r0 = 0; \1463 exit; \1464" :1465 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1466 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1467 : __clobber_all);1468}1469 1470SEC("xdp")1471__description("XDP pkt read, pkt_data >= pkt_meta', corner case +1, good access")1472__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1473__naked void corner_case_1_good_access_14(void)1474{1475 asm volatile (" \1476 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1477 r3 = *(u32*)(r1 + %[xdp_md_data]); \1478 r1 = r2; \1479 r1 += 9; \1480 if r3 >= r1 goto l0_%=; \1481 goto l1_%=; \1482l0_%=: r0 = *(u64*)(r1 - 9); \1483l1_%=: r0 = 0; \1484 exit; \1485" :1486 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1487 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1488 : __clobber_all);1489}1490 1491SEC("xdp")1492__description("XDP pkt read, pkt_data >= pkt_meta', corner case -1, bad access")1493__failure __msg("R1 offset is outside of the packet")1494__flag(BPF_F_ANY_ALIGNMENT)1495__naked void corner_case_1_bad_access_14(void)1496{1497 asm volatile (" \1498 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1499 r3 = *(u32*)(r1 + %[xdp_md_data]); \1500 r1 = r2; \1501 r1 += 7; \1502 if r3 >= r1 goto l0_%=; \1503 goto l1_%=; \1504l0_%=: r0 = *(u64*)(r1 - 7); \1505l1_%=: r0 = 0; \1506 exit; \1507" :1508 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1509 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1510 : __clobber_all);1511}1512 1513SEC("xdp")1514__description("XDP pkt read, pkt_meta' <= pkt_data, corner case, good access")1515__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1516__naked void data_corner_case_good_access_8(void)1517{1518 asm volatile (" \1519 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1520 r3 = *(u32*)(r1 + %[xdp_md_data]); \1521 r1 = r2; \1522 r1 += 8; \1523 if r1 <= r3 goto l0_%=; \1524 goto l1_%=; \1525l0_%=: r0 = *(u64*)(r1 - 8); \1526l1_%=: r0 = 0; \1527 exit; \1528" :1529 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1530 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1531 : __clobber_all);1532}1533 1534SEC("xdp")1535__description("XDP pkt read, pkt_meta' <= pkt_data, bad access 1")1536__failure __msg("R1 offset is outside of the packet")1537__flag(BPF_F_ANY_ALIGNMENT)1538__naked void pkt_data_bad_access_1_4(void)1539{1540 asm volatile (" \1541 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1542 r3 = *(u32*)(r1 + %[xdp_md_data]); \1543 r1 = r2; \1544 r1 += 8; \1545 if r1 <= r3 goto l0_%=; \1546 goto l1_%=; \1547l0_%=: r0 = *(u64*)(r1 - 4); \1548l1_%=: r0 = 0; \1549 exit; \1550" :1551 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1552 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1553 : __clobber_all);1554}1555 1556SEC("xdp")1557__description("XDP pkt read, pkt_meta' <= pkt_data, bad access 2")1558__failure __msg("R1 offset is outside of the packet")1559__flag(BPF_F_ANY_ALIGNMENT)1560__naked void pkt_data_bad_access_2_8(void)1561{1562 asm volatile (" \1563 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1564 r3 = *(u32*)(r1 + %[xdp_md_data]); \1565 r1 = r2; \1566 r1 += 8; \1567 if r1 <= r3 goto l0_%=; \1568 r0 = *(u64*)(r1 - 8); \1569l0_%=: r0 = 0; \1570 exit; \1571" :1572 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1573 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1574 : __clobber_all);1575}1576 1577SEC("xdp")1578__description("XDP pkt read, pkt_meta' <= pkt_data, corner case +1, good access")1579__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1580__naked void corner_case_1_good_access_15(void)1581{1582 asm volatile (" \1583 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1584 r3 = *(u32*)(r1 + %[xdp_md_data]); \1585 r1 = r2; \1586 r1 += 9; \1587 if r1 <= r3 goto l0_%=; \1588 goto l1_%=; \1589l0_%=: r0 = *(u64*)(r1 - 9); \1590l1_%=: r0 = 0; \1591 exit; \1592" :1593 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1594 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1595 : __clobber_all);1596}1597 1598SEC("xdp")1599__description("XDP pkt read, pkt_meta' <= pkt_data, corner case -1, bad access")1600__failure __msg("R1 offset is outside of the packet")1601__flag(BPF_F_ANY_ALIGNMENT)1602__naked void corner_case_1_bad_access_15(void)1603{1604 asm volatile (" \1605 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1606 r3 = *(u32*)(r1 + %[xdp_md_data]); \1607 r1 = r2; \1608 r1 += 7; \1609 if r1 <= r3 goto l0_%=; \1610 goto l1_%=; \1611l0_%=: r0 = *(u64*)(r1 - 7); \1612l1_%=: r0 = 0; \1613 exit; \1614" :1615 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1616 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1617 : __clobber_all);1618}1619 1620SEC("xdp")1621__description("XDP pkt read, pkt_data <= pkt_meta', good access")1622__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1623__naked void data_pkt_meta_good_access_2(void)1624{1625 asm volatile (" \1626 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1627 r3 = *(u32*)(r1 + %[xdp_md_data]); \1628 r1 = r2; \1629 r1 += 8; \1630 if r3 <= r1 goto l0_%=; \1631 r0 = *(u32*)(r1 - 5); \1632l0_%=: r0 = 0; \1633 exit; \1634" :1635 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1636 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1637 : __clobber_all);1638}1639 1640SEC("xdp")1641__description("XDP pkt read, pkt_data <= pkt_meta', corner case -1, bad access")1642__failure __msg("R1 offset is outside of the packet")1643__flag(BPF_F_ANY_ALIGNMENT)1644__naked void corner_case_1_bad_access_16(void)1645{1646 asm volatile (" \1647 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1648 r3 = *(u32*)(r1 + %[xdp_md_data]); \1649 r1 = r2; \1650 r1 += 6; \1651 if r3 <= r1 goto l0_%=; \1652 r0 = *(u64*)(r1 - 6); \1653l0_%=: r0 = 0; \1654 exit; \1655" :1656 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1657 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1658 : __clobber_all);1659}1660 1661SEC("xdp")1662__description("XDP pkt read, pkt_data <= pkt_meta', bad access 2")1663__failure __msg("R1 offset is outside of the packet")1664__flag(BPF_F_ANY_ALIGNMENT)1665__naked void pkt_meta_bad_access_2_4(void)1666{1667 asm volatile (" \1668 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1669 r3 = *(u32*)(r1 + %[xdp_md_data]); \1670 r1 = r2; \1671 r1 += 8; \1672 if r3 <= r1 goto l0_%=; \1673l0_%=: r0 = *(u32*)(r1 - 5); \1674 r0 = 0; \1675 exit; \1676" :1677 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1678 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1679 : __clobber_all);1680}1681 1682SEC("xdp")1683__description("XDP pkt read, pkt_data <= pkt_meta', corner case, good access")1684__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1685__naked void meta_corner_case_good_access_4(void)1686{1687 asm volatile (" \1688 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1689 r3 = *(u32*)(r1 + %[xdp_md_data]); \1690 r1 = r2; \1691 r1 += 7; \1692 if r3 <= r1 goto l0_%=; \1693 r0 = *(u64*)(r1 - 7); \1694l0_%=: r0 = 0; \1695 exit; \1696" :1697 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1698 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1699 : __clobber_all);1700}1701 1702SEC("xdp")1703__description("XDP pkt read, pkt_data <= pkt_meta', corner case +1, good access")1704__success __retval(0) __flag(BPF_F_ANY_ALIGNMENT)1705__naked void corner_case_1_good_access_16(void)1706{1707 asm volatile (" \1708 r2 = *(u32*)(r1 + %[xdp_md_data_meta]); \1709 r3 = *(u32*)(r1 + %[xdp_md_data]); \1710 r1 = r2; \1711 r1 += 8; \1712 if r3 <= r1 goto l0_%=; \1713 r0 = *(u64*)(r1 - 8); \1714l0_%=: r0 = 0; \1715 exit; \1716" :1717 : __imm_const(xdp_md_data, offsetof(struct xdp_md, data)),1718 __imm_const(xdp_md_data_meta, offsetof(struct xdp_md, data_meta))1719 : __clobber_all);1720}1721 1722char _license[] SEC("license") = "GPL";1723