Linux Audio

Check our new training course

Real-Time Linux with PREEMPT_RT training

Feb 18-20, 2025
Register
Loading...
Note: File does not exist in v5.4.
   1// SPDX-License-Identifier: GPL-2.0
   2/* 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";