Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
   1/*
   2 * Testsuite for BPF interpreter and BPF JIT compiler
   3 *
   4 * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of version 2 of the GNU General Public
   8 * License as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 * General Public License for more details.
  14 */
  15
  16#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  17
  18#include <linux/init.h>
  19#include <linux/module.h>
  20#include <linux/filter.h>
  21#include <linux/bpf.h>
  22#include <linux/skbuff.h>
  23#include <linux/netdevice.h>
  24#include <linux/if_vlan.h>
  25#include <linux/random.h>
  26#include <linux/highmem.h>
  27#include <linux/sched.h>
  28
  29/* General test specific settings */
  30#define MAX_SUBTESTS	3
  31#define MAX_TESTRUNS	1000
  32#define MAX_DATA	128
  33#define MAX_INSNS	512
  34#define MAX_K		0xffffFFFF
  35
  36/* Few constants used to init test 'skb' */
  37#define SKB_TYPE	3
  38#define SKB_MARK	0x1234aaaa
  39#define SKB_HASH	0x1234aaab
  40#define SKB_QUEUE_MAP	123
  41#define SKB_VLAN_TCI	0xffff
  42#define SKB_DEV_IFINDEX	577
  43#define SKB_DEV_TYPE	588
  44
  45/* Redefine REGs to make tests less verbose */
  46#define R0		BPF_REG_0
  47#define R1		BPF_REG_1
  48#define R2		BPF_REG_2
  49#define R3		BPF_REG_3
  50#define R4		BPF_REG_4
  51#define R5		BPF_REG_5
  52#define R6		BPF_REG_6
  53#define R7		BPF_REG_7
  54#define R8		BPF_REG_8
  55#define R9		BPF_REG_9
  56#define R10		BPF_REG_10
  57
  58/* Flags that can be passed to test cases */
  59#define FLAG_NO_DATA		BIT(0)
  60#define FLAG_EXPECTED_FAIL	BIT(1)
  61#define FLAG_SKB_FRAG		BIT(2)
  62
  63enum {
  64	CLASSIC  = BIT(6),	/* Old BPF instructions only. */
  65	INTERNAL = BIT(7),	/* Extended instruction set.  */
  66};
  67
  68#define TEST_TYPE_MASK		(CLASSIC | INTERNAL)
  69
  70struct bpf_test {
  71	const char *descr;
  72	union {
  73		struct sock_filter insns[MAX_INSNS];
  74		struct bpf_insn insns_int[MAX_INSNS];
  75		struct {
  76			void *insns;
  77			unsigned int len;
  78		} ptr;
  79	} u;
  80	__u8 aux;
  81	__u8 data[MAX_DATA];
  82	struct {
  83		int data_size;
  84		__u32 result;
  85	} test[MAX_SUBTESTS];
  86	int (*fill_helper)(struct bpf_test *self);
  87	int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
  88	__u8 frag_data[MAX_DATA];
  89	int stack_depth; /* for eBPF only, since tests don't call verifier */
  90};
  91
  92/* Large test cases need separate allocation and fill handler. */
  93
  94static int bpf_fill_maxinsns1(struct bpf_test *self)
  95{
  96	unsigned int len = BPF_MAXINSNS;
  97	struct sock_filter *insn;
  98	__u32 k = ~0;
  99	int i;
 100
 101	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 102	if (!insn)
 103		return -ENOMEM;
 104
 105	for (i = 0; i < len; i++, k--)
 106		insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
 107
 108	self->u.ptr.insns = insn;
 109	self->u.ptr.len = len;
 110
 111	return 0;
 112}
 113
 114static int bpf_fill_maxinsns2(struct bpf_test *self)
 115{
 116	unsigned int len = BPF_MAXINSNS;
 117	struct sock_filter *insn;
 118	int i;
 119
 120	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 121	if (!insn)
 122		return -ENOMEM;
 123
 124	for (i = 0; i < len; i++)
 125		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
 126
 127	self->u.ptr.insns = insn;
 128	self->u.ptr.len = len;
 129
 130	return 0;
 131}
 132
 133static int bpf_fill_maxinsns3(struct bpf_test *self)
 134{
 135	unsigned int len = BPF_MAXINSNS;
 136	struct sock_filter *insn;
 137	struct rnd_state rnd;
 138	int i;
 139
 140	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 141	if (!insn)
 142		return -ENOMEM;
 143
 144	prandom_seed_state(&rnd, 3141592653589793238ULL);
 145
 146	for (i = 0; i < len - 1; i++) {
 147		__u32 k = prandom_u32_state(&rnd);
 148
 149		insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
 150	}
 151
 152	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 153
 154	self->u.ptr.insns = insn;
 155	self->u.ptr.len = len;
 156
 157	return 0;
 158}
 159
 160static int bpf_fill_maxinsns4(struct bpf_test *self)
 161{
 162	unsigned int len = BPF_MAXINSNS + 1;
 163	struct sock_filter *insn;
 164	int i;
 165
 166	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 167	if (!insn)
 168		return -ENOMEM;
 169
 170	for (i = 0; i < len; i++)
 171		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
 172
 173	self->u.ptr.insns = insn;
 174	self->u.ptr.len = len;
 175
 176	return 0;
 177}
 178
 179static int bpf_fill_maxinsns5(struct bpf_test *self)
 180{
 181	unsigned int len = BPF_MAXINSNS;
 182	struct sock_filter *insn;
 183	int i;
 184
 185	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 186	if (!insn)
 187		return -ENOMEM;
 188
 189	insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
 190
 191	for (i = 1; i < len - 1; i++)
 192		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
 193
 194	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
 195
 196	self->u.ptr.insns = insn;
 197	self->u.ptr.len = len;
 198
 199	return 0;
 200}
 201
 202static int bpf_fill_maxinsns6(struct bpf_test *self)
 203{
 204	unsigned int len = BPF_MAXINSNS;
 205	struct sock_filter *insn;
 206	int i;
 207
 208	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 209	if (!insn)
 210		return -ENOMEM;
 211
 212	for (i = 0; i < len - 1; i++)
 213		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
 214				     SKF_AD_VLAN_TAG_PRESENT);
 215
 216	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 217
 218	self->u.ptr.insns = insn;
 219	self->u.ptr.len = len;
 220
 221	return 0;
 222}
 223
 224static int bpf_fill_maxinsns7(struct bpf_test *self)
 225{
 226	unsigned int len = BPF_MAXINSNS;
 227	struct sock_filter *insn;
 228	int i;
 229
 230	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 231	if (!insn)
 232		return -ENOMEM;
 233
 234	for (i = 0; i < len - 4; i++)
 235		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
 236				     SKF_AD_CPU);
 237
 238	insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
 239	insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
 240				   SKF_AD_CPU);
 241	insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
 242	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 243
 244	self->u.ptr.insns = insn;
 245	self->u.ptr.len = len;
 246
 247	return 0;
 248}
 249
 250static int bpf_fill_maxinsns8(struct bpf_test *self)
 251{
 252	unsigned int len = BPF_MAXINSNS;
 253	struct sock_filter *insn;
 254	int i, jmp_off = len - 3;
 255
 256	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 257	if (!insn)
 258		return -ENOMEM;
 259
 260	insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
 261
 262	for (i = 1; i < len - 1; i++)
 263		insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
 264
 265	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
 266
 267	self->u.ptr.insns = insn;
 268	self->u.ptr.len = len;
 269
 270	return 0;
 271}
 272
 273static int bpf_fill_maxinsns9(struct bpf_test *self)
 274{
 275	unsigned int len = BPF_MAXINSNS;
 276	struct bpf_insn *insn;
 277	int i;
 278
 279	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 280	if (!insn)
 281		return -ENOMEM;
 282
 283	insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
 284	insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
 285	insn[2] = BPF_EXIT_INSN();
 286
 287	for (i = 3; i < len - 2; i++)
 288		insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
 289
 290	insn[len - 2] = BPF_EXIT_INSN();
 291	insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
 292
 293	self->u.ptr.insns = insn;
 294	self->u.ptr.len = len;
 295
 296	return 0;
 297}
 298
 299static int bpf_fill_maxinsns10(struct bpf_test *self)
 300{
 301	unsigned int len = BPF_MAXINSNS, hlen = len - 2;
 302	struct bpf_insn *insn;
 303	int i;
 304
 305	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 306	if (!insn)
 307		return -ENOMEM;
 308
 309	for (i = 0; i < hlen / 2; i++)
 310		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
 311	for (i = hlen - 1; i > hlen / 2; i--)
 312		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
 313
 314	insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
 315	insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
 316	insn[hlen + 1] = BPF_EXIT_INSN();
 317
 318	self->u.ptr.insns = insn;
 319	self->u.ptr.len = len;
 320
 321	return 0;
 322}
 323
 324static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
 325			 unsigned int plen)
 326{
 327	struct sock_filter *insn;
 328	unsigned int rlen;
 329	int i, j;
 330
 331	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 332	if (!insn)
 333		return -ENOMEM;
 334
 335	rlen = (len % plen) - 1;
 336
 337	for (i = 0; i + plen < len; i += plen)
 338		for (j = 0; j < plen; j++)
 339			insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
 340						 plen - 1 - j, 0, 0);
 341	for (j = 0; j < rlen; j++)
 342		insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
 343					 0, 0);
 344
 345	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
 346
 347	self->u.ptr.insns = insn;
 348	self->u.ptr.len = len;
 349
 350	return 0;
 351}
 352
 353static int bpf_fill_maxinsns11(struct bpf_test *self)
 354{
 355	/* Hits 70 passes on x86_64, so cannot get JITed there. */
 356	return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
 357}
 358
 359static int bpf_fill_ja(struct bpf_test *self)
 360{
 361	/* Hits exactly 11 passes on x86_64 JIT. */
 362	return __bpf_fill_ja(self, 12, 9);
 363}
 364
 365static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
 366{
 367	unsigned int len = BPF_MAXINSNS;
 368	struct sock_filter *insn;
 369	int i;
 370
 371	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 372	if (!insn)
 373		return -ENOMEM;
 374
 375	for (i = 0; i < len - 1; i += 2) {
 376		insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
 377		insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 378					 SKF_AD_OFF + SKF_AD_CPU);
 379	}
 380
 381	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
 382
 383	self->u.ptr.insns = insn;
 384	self->u.ptr.len = len;
 385
 386	return 0;
 387}
 388
 389#define PUSH_CNT 68
 390/* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */
 391static int bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self)
 392{
 393	unsigned int len = BPF_MAXINSNS;
 394	struct bpf_insn *insn;
 395	int i = 0, j, k = 0;
 396
 397	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 398	if (!insn)
 399		return -ENOMEM;
 400
 401	insn[i++] = BPF_MOV64_REG(R6, R1);
 402loop:
 403	for (j = 0; j < PUSH_CNT; j++) {
 404		insn[i++] = BPF_LD_ABS(BPF_B, 0);
 405		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
 406		i++;
 407		insn[i++] = BPF_MOV64_REG(R1, R6);
 408		insn[i++] = BPF_MOV64_IMM(R2, 1);
 409		insn[i++] = BPF_MOV64_IMM(R3, 2);
 410		insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
 411					 bpf_skb_vlan_push_proto.func - __bpf_call_base);
 412		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
 413		i++;
 414	}
 415
 416	for (j = 0; j < PUSH_CNT; j++) {
 417		insn[i++] = BPF_LD_ABS(BPF_B, 0);
 418		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0x34, len - i - 2);
 419		i++;
 420		insn[i++] = BPF_MOV64_REG(R1, R6);
 421		insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
 422					 bpf_skb_vlan_pop_proto.func - __bpf_call_base);
 423		insn[i] = BPF_JMP_IMM(BPF_JNE, R0, 0, len - i - 2);
 424		i++;
 425	}
 426	if (++k < 5)
 427		goto loop;
 428
 429	for (; i < len - 1; i++)
 430		insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xbef);
 431
 432	insn[len - 1] = BPF_EXIT_INSN();
 433
 434	self->u.ptr.insns = insn;
 435	self->u.ptr.len = len;
 436
 437	return 0;
 438}
 439
 440static int bpf_fill_ld_abs_vlan_push_pop2(struct bpf_test *self)
 441{
 442	struct bpf_insn *insn;
 443
 444	insn = kmalloc_array(16, sizeof(*insn), GFP_KERNEL);
 445	if (!insn)
 446		return -ENOMEM;
 447
 448	/* Due to func address being non-const, we need to
 449	 * assemble this here.
 450	 */
 451	insn[0] = BPF_MOV64_REG(R6, R1);
 452	insn[1] = BPF_LD_ABS(BPF_B, 0);
 453	insn[2] = BPF_LD_ABS(BPF_H, 0);
 454	insn[3] = BPF_LD_ABS(BPF_W, 0);
 455	insn[4] = BPF_MOV64_REG(R7, R6);
 456	insn[5] = BPF_MOV64_IMM(R6, 0);
 457	insn[6] = BPF_MOV64_REG(R1, R7);
 458	insn[7] = BPF_MOV64_IMM(R2, 1);
 459	insn[8] = BPF_MOV64_IMM(R3, 2);
 460	insn[9] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
 461			       bpf_skb_vlan_push_proto.func - __bpf_call_base);
 462	insn[10] = BPF_MOV64_REG(R6, R7);
 463	insn[11] = BPF_LD_ABS(BPF_B, 0);
 464	insn[12] = BPF_LD_ABS(BPF_H, 0);
 465	insn[13] = BPF_LD_ABS(BPF_W, 0);
 466	insn[14] = BPF_MOV64_IMM(R0, 42);
 467	insn[15] = BPF_EXIT_INSN();
 468
 469	self->u.ptr.insns = insn;
 470	self->u.ptr.len = 16;
 471
 472	return 0;
 473}
 474
 475static int bpf_fill_jump_around_ld_abs(struct bpf_test *self)
 476{
 477	unsigned int len = BPF_MAXINSNS;
 478	struct bpf_insn *insn;
 479	int i = 0;
 480
 481	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 482	if (!insn)
 483		return -ENOMEM;
 484
 485	insn[i++] = BPF_MOV64_REG(R6, R1);
 486	insn[i++] = BPF_LD_ABS(BPF_B, 0);
 487	insn[i] = BPF_JMP_IMM(BPF_JEQ, R0, 10, len - i - 2);
 488	i++;
 489	while (i < len - 1)
 490		insn[i++] = BPF_LD_ABS(BPF_B, 1);
 491	insn[i] = BPF_EXIT_INSN();
 492
 493	self->u.ptr.insns = insn;
 494	self->u.ptr.len = len;
 495
 496	return 0;
 497}
 498
 499static int __bpf_fill_stxdw(struct bpf_test *self, int size)
 500{
 501	unsigned int len = BPF_MAXINSNS;
 502	struct bpf_insn *insn;
 503	int i;
 504
 505	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
 506	if (!insn)
 507		return -ENOMEM;
 508
 509	insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
 510	insn[1] = BPF_ST_MEM(size, R10, -40, 42);
 511
 512	for (i = 2; i < len - 2; i++)
 513		insn[i] = BPF_STX_XADD(size, R10, R0, -40);
 514
 515	insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
 516	insn[len - 1] = BPF_EXIT_INSN();
 517
 518	self->u.ptr.insns = insn;
 519	self->u.ptr.len = len;
 520	self->stack_depth = 40;
 521
 522	return 0;
 523}
 524
 525static int bpf_fill_stxw(struct bpf_test *self)
 526{
 527	return __bpf_fill_stxdw(self, BPF_W);
 528}
 529
 530static int bpf_fill_stxdw(struct bpf_test *self)
 531{
 532	return __bpf_fill_stxdw(self, BPF_DW);
 533}
 534
 535static struct bpf_test tests[] = {
 536	{
 537		"TAX",
 538		.u.insns = {
 539			BPF_STMT(BPF_LD | BPF_IMM, 1),
 540			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 541			BPF_STMT(BPF_LD | BPF_IMM, 2),
 542			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 543			BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
 544			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 545			BPF_STMT(BPF_LD | BPF_LEN, 0),
 546			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 547			BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
 548			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
 549			BPF_STMT(BPF_RET | BPF_A, 0)
 550		},
 551		CLASSIC,
 552		{ 10, 20, 30, 40, 50 },
 553		{ { 2, 10 }, { 3, 20 }, { 4, 30 } },
 554	},
 555	{
 556		"TXA",
 557		.u.insns = {
 558			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 559			BPF_STMT(BPF_MISC | BPF_TXA, 0),
 560			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 561			BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
 562		},
 563		CLASSIC,
 564		{ 10, 20, 30, 40, 50 },
 565		{ { 1, 2 }, { 3, 6 }, { 4, 8 } },
 566	},
 567	{
 568		"ADD_SUB_MUL_K",
 569		.u.insns = {
 570			BPF_STMT(BPF_LD | BPF_IMM, 1),
 571			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
 572			BPF_STMT(BPF_LDX | BPF_IMM, 3),
 573			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
 574			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
 575			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
 576			BPF_STMT(BPF_RET | BPF_A, 0)
 577		},
 578		CLASSIC | FLAG_NO_DATA,
 579		{ },
 580		{ { 0, 0xfffffffd } }
 581	},
 582	{
 583		"DIV_MOD_KX",
 584		.u.insns = {
 585			BPF_STMT(BPF_LD | BPF_IMM, 8),
 586			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
 587			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 588			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 589			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
 590			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 591			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 592			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
 593			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 594			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 595			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
 596			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 597			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
 598			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
 599			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 600			BPF_STMT(BPF_RET | BPF_A, 0)
 601		},
 602		CLASSIC | FLAG_NO_DATA,
 603		{ },
 604		{ { 0, 0x20000000 } }
 605	},
 606	{
 607		"AND_OR_LSH_K",
 608		.u.insns = {
 609			BPF_STMT(BPF_LD | BPF_IMM, 0xff),
 610			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
 611			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
 612			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 613			BPF_STMT(BPF_LD | BPF_IMM, 0xf),
 614			BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
 615			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 616			BPF_STMT(BPF_RET | BPF_A, 0)
 617		},
 618		CLASSIC | FLAG_NO_DATA,
 619		{ },
 620		{ { 0, 0x800000ff }, { 1, 0x800000ff } },
 621	},
 622	{
 623		"LD_IMM_0",
 624		.u.insns = {
 625			BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
 626			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
 627			BPF_STMT(BPF_RET | BPF_K, 0),
 628			BPF_STMT(BPF_RET | BPF_K, 1),
 629		},
 630		CLASSIC,
 631		{ },
 632		{ { 1, 1 } },
 633	},
 634	{
 635		"LD_IND",
 636		.u.insns = {
 637			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 638			BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
 639			BPF_STMT(BPF_RET | BPF_K, 1)
 640		},
 641		CLASSIC,
 642		{ },
 643		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
 644	},
 645	{
 646		"LD_ABS",
 647		.u.insns = {
 648			BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
 649			BPF_STMT(BPF_RET | BPF_K, 1)
 650		},
 651		CLASSIC,
 652		{ },
 653		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
 654	},
 655	{
 656		"LD_ABS_LL",
 657		.u.insns = {
 658			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
 659			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 660			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
 661			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 662			BPF_STMT(BPF_RET | BPF_A, 0)
 663		},
 664		CLASSIC,
 665		{ 1, 2, 3 },
 666		{ { 1, 0 }, { 2, 3 } },
 667	},
 668	{
 669		"LD_IND_LL",
 670		.u.insns = {
 671			BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
 672			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 673			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 674			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 675			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
 676			BPF_STMT(BPF_RET | BPF_A, 0)
 677		},
 678		CLASSIC,
 679		{ 1, 2, 3, 0xff },
 680		{ { 1, 1 }, { 3, 3 }, { 4, 0xff } },
 681	},
 682	{
 683		"LD_ABS_NET",
 684		.u.insns = {
 685			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
 686			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 687			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
 688			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 689			BPF_STMT(BPF_RET | BPF_A, 0)
 690		},
 691		CLASSIC,
 692		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
 693		{ { 15, 0 }, { 16, 3 } },
 694	},
 695	{
 696		"LD_IND_NET",
 697		.u.insns = {
 698			BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
 699			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 700			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
 701			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 702			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
 703			BPF_STMT(BPF_RET | BPF_A, 0)
 704		},
 705		CLASSIC,
 706		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
 707		{ { 14, 0 }, { 15, 1 }, { 17, 3 } },
 708	},
 709	{
 710		"LD_PKTTYPE",
 711		.u.insns = {
 712			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 713				 SKF_AD_OFF + SKF_AD_PKTTYPE),
 714			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
 715			BPF_STMT(BPF_RET | BPF_K, 1),
 716			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 717				 SKF_AD_OFF + SKF_AD_PKTTYPE),
 718			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
 719			BPF_STMT(BPF_RET | BPF_K, 1),
 720			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 721				 SKF_AD_OFF + SKF_AD_PKTTYPE),
 722			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
 723			BPF_STMT(BPF_RET | BPF_K, 1),
 724			BPF_STMT(BPF_RET | BPF_A, 0)
 725		},
 726		CLASSIC,
 727		{ },
 728		{ { 1, 3 }, { 10, 3 } },
 729	},
 730	{
 731		"LD_MARK",
 732		.u.insns = {
 733			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 734				 SKF_AD_OFF + SKF_AD_MARK),
 735			BPF_STMT(BPF_RET | BPF_A, 0)
 736		},
 737		CLASSIC,
 738		{ },
 739		{ { 1, SKB_MARK}, { 10, SKB_MARK} },
 740	},
 741	{
 742		"LD_RXHASH",
 743		.u.insns = {
 744			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 745				 SKF_AD_OFF + SKF_AD_RXHASH),
 746			BPF_STMT(BPF_RET | BPF_A, 0)
 747		},
 748		CLASSIC,
 749		{ },
 750		{ { 1, SKB_HASH}, { 10, SKB_HASH} },
 751	},
 752	{
 753		"LD_QUEUE",
 754		.u.insns = {
 755			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 756				 SKF_AD_OFF + SKF_AD_QUEUE),
 757			BPF_STMT(BPF_RET | BPF_A, 0)
 758		},
 759		CLASSIC,
 760		{ },
 761		{ { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
 762	},
 763	{
 764		"LD_PROTOCOL",
 765		.u.insns = {
 766			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
 767			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
 768			BPF_STMT(BPF_RET | BPF_K, 0),
 769			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 770				 SKF_AD_OFF + SKF_AD_PROTOCOL),
 771			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 772			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 773			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
 774			BPF_STMT(BPF_RET | BPF_K, 0),
 775			BPF_STMT(BPF_MISC | BPF_TXA, 0),
 776			BPF_STMT(BPF_RET | BPF_A, 0)
 777		},
 778		CLASSIC,
 779		{ 10, 20, 30 },
 780		{ { 10, ETH_P_IP }, { 100, ETH_P_IP } },
 781	},
 782	{
 783		"LD_VLAN_TAG",
 784		.u.insns = {
 785			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 786				 SKF_AD_OFF + SKF_AD_VLAN_TAG),
 787			BPF_STMT(BPF_RET | BPF_A, 0)
 788		},
 789		CLASSIC,
 790		{ },
 791		{
 792			{ 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
 793			{ 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
 794		},
 795	},
 796	{
 797		"LD_VLAN_TAG_PRESENT",
 798		.u.insns = {
 799			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 800				 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
 801			BPF_STMT(BPF_RET | BPF_A, 0)
 802		},
 803		CLASSIC,
 804		{ },
 805		{
 806			{ 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
 807			{ 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
 808		},
 809	},
 810	{
 811		"LD_IFINDEX",
 812		.u.insns = {
 813			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 814				 SKF_AD_OFF + SKF_AD_IFINDEX),
 815			BPF_STMT(BPF_RET | BPF_A, 0)
 816		},
 817		CLASSIC,
 818		{ },
 819		{ { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
 820	},
 821	{
 822		"LD_HATYPE",
 823		.u.insns = {
 824			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 825				 SKF_AD_OFF + SKF_AD_HATYPE),
 826			BPF_STMT(BPF_RET | BPF_A, 0)
 827		},
 828		CLASSIC,
 829		{ },
 830		{ { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
 831	},
 832	{
 833		"LD_CPU",
 834		.u.insns = {
 835			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 836				 SKF_AD_OFF + SKF_AD_CPU),
 837			BPF_STMT(BPF_MISC | BPF_TAX, 0),
 838			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 839				 SKF_AD_OFF + SKF_AD_CPU),
 840			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
 841			BPF_STMT(BPF_RET | BPF_A, 0)
 842		},
 843		CLASSIC,
 844		{ },
 845		{ { 1, 0 }, { 10, 0 } },
 846	},
 847	{
 848		"LD_NLATTR",
 849		.u.insns = {
 850			BPF_STMT(BPF_LDX | BPF_IMM, 2),
 851			BPF_STMT(BPF_MISC | BPF_TXA, 0),
 852			BPF_STMT(BPF_LDX | BPF_IMM, 3),
 853			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 854				 SKF_AD_OFF + SKF_AD_NLATTR),
 855			BPF_STMT(BPF_RET | BPF_A, 0)
 856		},
 857		CLASSIC,
 858#ifdef __BIG_ENDIAN
 859		{ 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
 860#else
 861		{ 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
 862#endif
 863		{ { 4, 0 }, { 20, 6 } },
 864	},
 865	{
 866		"LD_NLATTR_NEST",
 867		.u.insns = {
 868			BPF_STMT(BPF_LD | BPF_IMM, 2),
 869			BPF_STMT(BPF_LDX | BPF_IMM, 3),
 870			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 871				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 872			BPF_STMT(BPF_LD | BPF_IMM, 2),
 873			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 874				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 875			BPF_STMT(BPF_LD | BPF_IMM, 2),
 876			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 877				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 878			BPF_STMT(BPF_LD | BPF_IMM, 2),
 879			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 880				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 881			BPF_STMT(BPF_LD | BPF_IMM, 2),
 882			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 883				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 884			BPF_STMT(BPF_LD | BPF_IMM, 2),
 885			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 886				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 887			BPF_STMT(BPF_LD | BPF_IMM, 2),
 888			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 889				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 890			BPF_STMT(BPF_LD | BPF_IMM, 2),
 891			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 892				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
 893			BPF_STMT(BPF_RET | BPF_A, 0)
 894		},
 895		CLASSIC,
 896#ifdef __BIG_ENDIAN
 897		{ 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
 898#else
 899		{ 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
 900#endif
 901		{ { 4, 0 }, { 20, 10 } },
 902	},
 903	{
 904		"LD_PAYLOAD_OFF",
 905		.u.insns = {
 906			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 907				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 908			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 909				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 910			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 911				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 912			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 913				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 914			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 915				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
 916			BPF_STMT(BPF_RET | BPF_A, 0)
 917		},
 918		CLASSIC,
 919		/* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
 920		 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
 921		 * id 9737, seq 1, length 64
 922		 */
 923		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 924		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 925		  0x08, 0x00,
 926		  0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
 927		  0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
 928		{ { 30, 0 }, { 100, 42 } },
 929	},
 930	{
 931		"LD_ANC_XOR",
 932		.u.insns = {
 933			BPF_STMT(BPF_LD | BPF_IMM, 10),
 934			BPF_STMT(BPF_LDX | BPF_IMM, 300),
 935			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
 936				 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
 937			BPF_STMT(BPF_RET | BPF_A, 0)
 938		},
 939		CLASSIC,
 940		{ },
 941		{ { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
 942	},
 943	{
 944		"SPILL_FILL",
 945		.u.insns = {
 946			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 947			BPF_STMT(BPF_LD | BPF_IMM, 2),
 948			BPF_STMT(BPF_ALU | BPF_RSH, 1),
 949			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
 950			BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
 951			BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
 952			BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
 953			BPF_STMT(BPF_STX, 15), /* M3 = len */
 954			BPF_STMT(BPF_LDX | BPF_MEM, 1),
 955			BPF_STMT(BPF_LD | BPF_MEM, 2),
 956			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
 957			BPF_STMT(BPF_LDX | BPF_MEM, 15),
 958			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
 959			BPF_STMT(BPF_RET | BPF_A, 0)
 960		},
 961		CLASSIC,
 962		{ },
 963		{ { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
 964	},
 965	{
 966		"JEQ",
 967		.u.insns = {
 968			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 969			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 970			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
 971			BPF_STMT(BPF_RET | BPF_K, 1),
 972			BPF_STMT(BPF_RET | BPF_K, MAX_K)
 973		},
 974		CLASSIC,
 975		{ 3, 3, 3, 3, 3 },
 976		{ { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
 977	},
 978	{
 979		"JGT",
 980		.u.insns = {
 981			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 982			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 983			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
 984			BPF_STMT(BPF_RET | BPF_K, 1),
 985			BPF_STMT(BPF_RET | BPF_K, MAX_K)
 986		},
 987		CLASSIC,
 988		{ 4, 4, 4, 3, 3 },
 989		{ { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
 990	},
 991	{
 992		"JGE (jt 0), test 1",
 993		.u.insns = {
 994			BPF_STMT(BPF_LDX | BPF_LEN, 0),
 995			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
 996			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
 997			BPF_STMT(BPF_RET | BPF_K, 1),
 998			BPF_STMT(BPF_RET | BPF_K, MAX_K)
 999		},
1000		CLASSIC,
1001		{ 4, 4, 4, 3, 3 },
1002		{ { 2, 0 }, { 3, 1 }, { 4, 1 } },
1003	},
1004	{
1005		"JGE (jt 0), test 2",
1006		.u.insns = {
1007			BPF_STMT(BPF_LDX | BPF_LEN, 0),
1008			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
1009			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
1010			BPF_STMT(BPF_RET | BPF_K, 1),
1011			BPF_STMT(BPF_RET | BPF_K, MAX_K)
1012		},
1013		CLASSIC,
1014		{ 4, 4, 5, 3, 3 },
1015		{ { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
1016	},
1017	{
1018		"JGE",
1019		.u.insns = {
1020			BPF_STMT(BPF_LDX | BPF_LEN, 0),
1021			BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
1022			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
1023			BPF_STMT(BPF_RET | BPF_K, 10),
1024			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
1025			BPF_STMT(BPF_RET | BPF_K, 20),
1026			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
1027			BPF_STMT(BPF_RET | BPF_K, 30),
1028			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
1029			BPF_STMT(BPF_RET | BPF_K, 40),
1030			BPF_STMT(BPF_RET | BPF_K, MAX_K)
1031		},
1032		CLASSIC,
1033		{ 1, 2, 3, 4, 5 },
1034		{ { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
1035	},
1036	{
1037		"JSET",
1038		.u.insns = {
1039			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1040			BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
1041			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1042			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
1043			BPF_STMT(BPF_LDX | BPF_LEN, 0),
1044			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1045			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
1046			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1047			BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
1048			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
1049			BPF_STMT(BPF_RET | BPF_K, 10),
1050			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
1051			BPF_STMT(BPF_RET | BPF_K, 20),
1052			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1053			BPF_STMT(BPF_RET | BPF_K, 30),
1054			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1055			BPF_STMT(BPF_RET | BPF_K, 30),
1056			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1057			BPF_STMT(BPF_RET | BPF_K, 30),
1058			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1059			BPF_STMT(BPF_RET | BPF_K, 30),
1060			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
1061			BPF_STMT(BPF_RET | BPF_K, 30),
1062			BPF_STMT(BPF_RET | BPF_K, MAX_K)
1063		},
1064		CLASSIC,
1065		{ 0, 0xAA, 0x55, 1 },
1066		{ { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
1067	},
1068	{
1069		"tcpdump port 22",
1070		.u.insns = {
1071			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1072			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
1073			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
1074			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1075			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1076			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
1077			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
1078			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
1079			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
1080			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
1081			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
1082			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1083			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1084			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1085			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
1086			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1087			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
1088			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1089			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1090			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1091			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1092			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
1093			BPF_STMT(BPF_RET | BPF_K, 0xffff),
1094			BPF_STMT(BPF_RET | BPF_K, 0),
1095		},
1096		CLASSIC,
1097		/* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
1098		 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
1099		 * seq 1305692979:1305693027, ack 3650467037, win 65535,
1100		 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
1101		 */
1102		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1103		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1104		  0x08, 0x00,
1105		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1106		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1107		  0x0a, 0x01, 0x01, 0x95, /* ip src */
1108		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1109		  0xc2, 0x24,
1110		  0x00, 0x16 /* dst port */ },
1111		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1112	},
1113	{
1114		"tcpdump complex",
1115		.u.insns = {
1116			/* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
1117			 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
1118			 * (len > 115 or len < 30000000000)' -d
1119			 */
1120			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1121			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
1122			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
1123			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1124			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
1125			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1126			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
1127			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1128			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1129			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1130			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1131			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
1132			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
1133			BPF_STMT(BPF_ST, 1),
1134			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
1135			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
1136			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
1137			BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
1138			BPF_STMT(BPF_LD | BPF_MEM, 1),
1139			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
1140			BPF_STMT(BPF_ST, 5),
1141			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1142			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
1143			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
1144			BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
1145			BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
1146			BPF_STMT(BPF_LD | BPF_MEM, 5),
1147			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
1148			BPF_STMT(BPF_LD | BPF_LEN, 0),
1149			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
1150			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
1151			BPF_STMT(BPF_RET | BPF_K, 0xffff),
1152			BPF_STMT(BPF_RET | BPF_K, 0),
1153		},
1154		CLASSIC,
1155		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1156		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1157		  0x08, 0x00,
1158		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1159		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1160		  0x0a, 0x01, 0x01, 0x95, /* ip src */
1161		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1162		  0xc2, 0x24,
1163		  0x00, 0x16 /* dst port */ },
1164		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1165	},
1166	{
1167		"RET_A",
1168		.u.insns = {
1169			/* check that unitialized X and A contain zeros */
1170			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1171			BPF_STMT(BPF_RET | BPF_A, 0)
1172		},
1173		CLASSIC,
1174		{ },
1175		{ {1, 0}, {2, 0} },
1176	},
1177	{
1178		"INT: ADD trivial",
1179		.u.insns_int = {
1180			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1181			BPF_ALU64_IMM(BPF_ADD, R1, 2),
1182			BPF_ALU64_IMM(BPF_MOV, R2, 3),
1183			BPF_ALU64_REG(BPF_SUB, R1, R2),
1184			BPF_ALU64_IMM(BPF_ADD, R1, -1),
1185			BPF_ALU64_IMM(BPF_MUL, R1, 3),
1186			BPF_ALU64_REG(BPF_MOV, R0, R1),
1187			BPF_EXIT_INSN(),
1188		},
1189		INTERNAL,
1190		{ },
1191		{ { 0, 0xfffffffd } }
1192	},
1193	{
1194		"INT: MUL_X",
1195		.u.insns_int = {
1196			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1197			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1198			BPF_ALU64_IMM(BPF_MOV, R2, 3),
1199			BPF_ALU64_REG(BPF_MUL, R1, R2),
1200			BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
1201			BPF_EXIT_INSN(),
1202			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1203			BPF_EXIT_INSN(),
1204		},
1205		INTERNAL,
1206		{ },
1207		{ { 0, 1 } }
1208	},
1209	{
1210		"INT: MUL_X2",
1211		.u.insns_int = {
1212			BPF_ALU32_IMM(BPF_MOV, R0, -1),
1213			BPF_ALU32_IMM(BPF_MOV, R1, -1),
1214			BPF_ALU32_IMM(BPF_MOV, R2, 3),
1215			BPF_ALU64_REG(BPF_MUL, R1, R2),
1216			BPF_ALU64_IMM(BPF_RSH, R1, 8),
1217			BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
1218			BPF_EXIT_INSN(),
1219			BPF_ALU32_IMM(BPF_MOV, R0, 1),
1220			BPF_EXIT_INSN(),
1221		},
1222		INTERNAL,
1223		{ },
1224		{ { 0, 1 } }
1225	},
1226	{
1227		"INT: MUL32_X",
1228		.u.insns_int = {
1229			BPF_ALU32_IMM(BPF_MOV, R0, -1),
1230			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1231			BPF_ALU32_IMM(BPF_MOV, R2, 3),
1232			BPF_ALU32_REG(BPF_MUL, R1, R2),
1233			BPF_ALU64_IMM(BPF_RSH, R1, 8),
1234			BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
1235			BPF_EXIT_INSN(),
1236			BPF_ALU32_IMM(BPF_MOV, R0, 1),
1237			BPF_EXIT_INSN(),
1238		},
1239		INTERNAL,
1240		{ },
1241		{ { 0, 1 } }
1242	},
1243	{
1244		/* Have to test all register combinations, since
1245		 * JITing of different registers will produce
1246		 * different asm code.
1247		 */
1248		"INT: ADD 64-bit",
1249		.u.insns_int = {
1250			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1251			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1252			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1253			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1254			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1255			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1256			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1257			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1258			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1259			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1260			BPF_ALU64_IMM(BPF_ADD, R0, 20),
1261			BPF_ALU64_IMM(BPF_ADD, R1, 20),
1262			BPF_ALU64_IMM(BPF_ADD, R2, 20),
1263			BPF_ALU64_IMM(BPF_ADD, R3, 20),
1264			BPF_ALU64_IMM(BPF_ADD, R4, 20),
1265			BPF_ALU64_IMM(BPF_ADD, R5, 20),
1266			BPF_ALU64_IMM(BPF_ADD, R6, 20),
1267			BPF_ALU64_IMM(BPF_ADD, R7, 20),
1268			BPF_ALU64_IMM(BPF_ADD, R8, 20),
1269			BPF_ALU64_IMM(BPF_ADD, R9, 20),
1270			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1271			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1272			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1273			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1274			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1275			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1276			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1277			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1278			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1279			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1280			BPF_ALU64_REG(BPF_ADD, R0, R0),
1281			BPF_ALU64_REG(BPF_ADD, R0, R1),
1282			BPF_ALU64_REG(BPF_ADD, R0, R2),
1283			BPF_ALU64_REG(BPF_ADD, R0, R3),
1284			BPF_ALU64_REG(BPF_ADD, R0, R4),
1285			BPF_ALU64_REG(BPF_ADD, R0, R5),
1286			BPF_ALU64_REG(BPF_ADD, R0, R6),
1287			BPF_ALU64_REG(BPF_ADD, R0, R7),
1288			BPF_ALU64_REG(BPF_ADD, R0, R8),
1289			BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1290			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1291			BPF_EXIT_INSN(),
1292			BPF_ALU64_REG(BPF_ADD, R1, R0),
1293			BPF_ALU64_REG(BPF_ADD, R1, R1),
1294			BPF_ALU64_REG(BPF_ADD, R1, R2),
1295			BPF_ALU64_REG(BPF_ADD, R1, R3),
1296			BPF_ALU64_REG(BPF_ADD, R1, R4),
1297			BPF_ALU64_REG(BPF_ADD, R1, R5),
1298			BPF_ALU64_REG(BPF_ADD, R1, R6),
1299			BPF_ALU64_REG(BPF_ADD, R1, R7),
1300			BPF_ALU64_REG(BPF_ADD, R1, R8),
1301			BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1302			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1303			BPF_EXIT_INSN(),
1304			BPF_ALU64_REG(BPF_ADD, R2, R0),
1305			BPF_ALU64_REG(BPF_ADD, R2, R1),
1306			BPF_ALU64_REG(BPF_ADD, R2, R2),
1307			BPF_ALU64_REG(BPF_ADD, R2, R3),
1308			BPF_ALU64_REG(BPF_ADD, R2, R4),
1309			BPF_ALU64_REG(BPF_ADD, R2, R5),
1310			BPF_ALU64_REG(BPF_ADD, R2, R6),
1311			BPF_ALU64_REG(BPF_ADD, R2, R7),
1312			BPF_ALU64_REG(BPF_ADD, R2, R8),
1313			BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1314			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1315			BPF_EXIT_INSN(),
1316			BPF_ALU64_REG(BPF_ADD, R3, R0),
1317			BPF_ALU64_REG(BPF_ADD, R3, R1),
1318			BPF_ALU64_REG(BPF_ADD, R3, R2),
1319			BPF_ALU64_REG(BPF_ADD, R3, R3),
1320			BPF_ALU64_REG(BPF_ADD, R3, R4),
1321			BPF_ALU64_REG(BPF_ADD, R3, R5),
1322			BPF_ALU64_REG(BPF_ADD, R3, R6),
1323			BPF_ALU64_REG(BPF_ADD, R3, R7),
1324			BPF_ALU64_REG(BPF_ADD, R3, R8),
1325			BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1326			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1327			BPF_EXIT_INSN(),
1328			BPF_ALU64_REG(BPF_ADD, R4, R0),
1329			BPF_ALU64_REG(BPF_ADD, R4, R1),
1330			BPF_ALU64_REG(BPF_ADD, R4, R2),
1331			BPF_ALU64_REG(BPF_ADD, R4, R3),
1332			BPF_ALU64_REG(BPF_ADD, R4, R4),
1333			BPF_ALU64_REG(BPF_ADD, R4, R5),
1334			BPF_ALU64_REG(BPF_ADD, R4, R6),
1335			BPF_ALU64_REG(BPF_ADD, R4, R7),
1336			BPF_ALU64_REG(BPF_ADD, R4, R8),
1337			BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1338			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1339			BPF_EXIT_INSN(),
1340			BPF_ALU64_REG(BPF_ADD, R5, R0),
1341			BPF_ALU64_REG(BPF_ADD, R5, R1),
1342			BPF_ALU64_REG(BPF_ADD, R5, R2),
1343			BPF_ALU64_REG(BPF_ADD, R5, R3),
1344			BPF_ALU64_REG(BPF_ADD, R5, R4),
1345			BPF_ALU64_REG(BPF_ADD, R5, R5),
1346			BPF_ALU64_REG(BPF_ADD, R5, R6),
1347			BPF_ALU64_REG(BPF_ADD, R5, R7),
1348			BPF_ALU64_REG(BPF_ADD, R5, R8),
1349			BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1350			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1351			BPF_EXIT_INSN(),
1352			BPF_ALU64_REG(BPF_ADD, R6, R0),
1353			BPF_ALU64_REG(BPF_ADD, R6, R1),
1354			BPF_ALU64_REG(BPF_ADD, R6, R2),
1355			BPF_ALU64_REG(BPF_ADD, R6, R3),
1356			BPF_ALU64_REG(BPF_ADD, R6, R4),
1357			BPF_ALU64_REG(BPF_ADD, R6, R5),
1358			BPF_ALU64_REG(BPF_ADD, R6, R6),
1359			BPF_ALU64_REG(BPF_ADD, R6, R7),
1360			BPF_ALU64_REG(BPF_ADD, R6, R8),
1361			BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1362			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1363			BPF_EXIT_INSN(),
1364			BPF_ALU64_REG(BPF_ADD, R7, R0),
1365			BPF_ALU64_REG(BPF_ADD, R7, R1),
1366			BPF_ALU64_REG(BPF_ADD, R7, R2),
1367			BPF_ALU64_REG(BPF_ADD, R7, R3),
1368			BPF_ALU64_REG(BPF_ADD, R7, R4),
1369			BPF_ALU64_REG(BPF_ADD, R7, R5),
1370			BPF_ALU64_REG(BPF_ADD, R7, R6),
1371			BPF_ALU64_REG(BPF_ADD, R7, R7),
1372			BPF_ALU64_REG(BPF_ADD, R7, R8),
1373			BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1374			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1375			BPF_EXIT_INSN(),
1376			BPF_ALU64_REG(BPF_ADD, R8, R0),
1377			BPF_ALU64_REG(BPF_ADD, R8, R1),
1378			BPF_ALU64_REG(BPF_ADD, R8, R2),
1379			BPF_ALU64_REG(BPF_ADD, R8, R3),
1380			BPF_ALU64_REG(BPF_ADD, R8, R4),
1381			BPF_ALU64_REG(BPF_ADD, R8, R5),
1382			BPF_ALU64_REG(BPF_ADD, R8, R6),
1383			BPF_ALU64_REG(BPF_ADD, R8, R7),
1384			BPF_ALU64_REG(BPF_ADD, R8, R8),
1385			BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1386			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1387			BPF_EXIT_INSN(),
1388			BPF_ALU64_REG(BPF_ADD, R9, R0),
1389			BPF_ALU64_REG(BPF_ADD, R9, R1),
1390			BPF_ALU64_REG(BPF_ADD, R9, R2),
1391			BPF_ALU64_REG(BPF_ADD, R9, R3),
1392			BPF_ALU64_REG(BPF_ADD, R9, R4),
1393			BPF_ALU64_REG(BPF_ADD, R9, R5),
1394			BPF_ALU64_REG(BPF_ADD, R9, R6),
1395			BPF_ALU64_REG(BPF_ADD, R9, R7),
1396			BPF_ALU64_REG(BPF_ADD, R9, R8),
1397			BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1398			BPF_ALU64_REG(BPF_MOV, R0, R9),
1399			BPF_EXIT_INSN(),
1400		},
1401		INTERNAL,
1402		{ },
1403		{ { 0, 2957380 } }
1404	},
1405	{
1406		"INT: ADD 32-bit",
1407		.u.insns_int = {
1408			BPF_ALU32_IMM(BPF_MOV, R0, 20),
1409			BPF_ALU32_IMM(BPF_MOV, R1, 1),
1410			BPF_ALU32_IMM(BPF_MOV, R2, 2),
1411			BPF_ALU32_IMM(BPF_MOV, R3, 3),
1412			BPF_ALU32_IMM(BPF_MOV, R4, 4),
1413			BPF_ALU32_IMM(BPF_MOV, R5, 5),
1414			BPF_ALU32_IMM(BPF_MOV, R6, 6),
1415			BPF_ALU32_IMM(BPF_MOV, R7, 7),
1416			BPF_ALU32_IMM(BPF_MOV, R8, 8),
1417			BPF_ALU32_IMM(BPF_MOV, R9, 9),
1418			BPF_ALU64_IMM(BPF_ADD, R1, 10),
1419			BPF_ALU64_IMM(BPF_ADD, R2, 10),
1420			BPF_ALU64_IMM(BPF_ADD, R3, 10),
1421			BPF_ALU64_IMM(BPF_ADD, R4, 10),
1422			BPF_ALU64_IMM(BPF_ADD, R5, 10),
1423			BPF_ALU64_IMM(BPF_ADD, R6, 10),
1424			BPF_ALU64_IMM(BPF_ADD, R7, 10),
1425			BPF_ALU64_IMM(BPF_ADD, R8, 10),
1426			BPF_ALU64_IMM(BPF_ADD, R9, 10),
1427			BPF_ALU32_REG(BPF_ADD, R0, R1),
1428			BPF_ALU32_REG(BPF_ADD, R0, R2),
1429			BPF_ALU32_REG(BPF_ADD, R0, R3),
1430			BPF_ALU32_REG(BPF_ADD, R0, R4),
1431			BPF_ALU32_REG(BPF_ADD, R0, R5),
1432			BPF_ALU32_REG(BPF_ADD, R0, R6),
1433			BPF_ALU32_REG(BPF_ADD, R0, R7),
1434			BPF_ALU32_REG(BPF_ADD, R0, R8),
1435			BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1436			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1437			BPF_EXIT_INSN(),
1438			BPF_ALU32_REG(BPF_ADD, R1, R0),
1439			BPF_ALU32_REG(BPF_ADD, R1, R1),
1440			BPF_ALU32_REG(BPF_ADD, R1, R2),
1441			BPF_ALU32_REG(BPF_ADD, R1, R3),
1442			BPF_ALU32_REG(BPF_ADD, R1, R4),
1443			BPF_ALU32_REG(BPF_ADD, R1, R5),
1444			BPF_ALU32_REG(BPF_ADD, R1, R6),
1445			BPF_ALU32_REG(BPF_ADD, R1, R7),
1446			BPF_ALU32_REG(BPF_ADD, R1, R8),
1447			BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1448			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1449			BPF_EXIT_INSN(),
1450			BPF_ALU32_REG(BPF_ADD, R2, R0),
1451			BPF_ALU32_REG(BPF_ADD, R2, R1),
1452			BPF_ALU32_REG(BPF_ADD, R2, R2),
1453			BPF_ALU32_REG(BPF_ADD, R2, R3),
1454			BPF_ALU32_REG(BPF_ADD, R2, R4),
1455			BPF_ALU32_REG(BPF_ADD, R2, R5),
1456			BPF_ALU32_REG(BPF_ADD, R2, R6),
1457			BPF_ALU32_REG(BPF_ADD, R2, R7),
1458			BPF_ALU32_REG(BPF_ADD, R2, R8),
1459			BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1460			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1461			BPF_EXIT_INSN(),
1462			BPF_ALU32_REG(BPF_ADD, R3, R0),
1463			BPF_ALU32_REG(BPF_ADD, R3, R1),
1464			BPF_ALU32_REG(BPF_ADD, R3, R2),
1465			BPF_ALU32_REG(BPF_ADD, R3, R3),
1466			BPF_ALU32_REG(BPF_ADD, R3, R4),
1467			BPF_ALU32_REG(BPF_ADD, R3, R5),
1468			BPF_ALU32_REG(BPF_ADD, R3, R6),
1469			BPF_ALU32_REG(BPF_ADD, R3, R7),
1470			BPF_ALU32_REG(BPF_ADD, R3, R8),
1471			BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1472			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1473			BPF_EXIT_INSN(),
1474			BPF_ALU32_REG(BPF_ADD, R4, R0),
1475			BPF_ALU32_REG(BPF_ADD, R4, R1),
1476			BPF_ALU32_REG(BPF_ADD, R4, R2),
1477			BPF_ALU32_REG(BPF_ADD, R4, R3),
1478			BPF_ALU32_REG(BPF_ADD, R4, R4),
1479			BPF_ALU32_REG(BPF_ADD, R4, R5),
1480			BPF_ALU32_REG(BPF_ADD, R4, R6),
1481			BPF_ALU32_REG(BPF_ADD, R4, R7),
1482			BPF_ALU32_REG(BPF_ADD, R4, R8),
1483			BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1484			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1485			BPF_EXIT_INSN(),
1486			BPF_ALU32_REG(BPF_ADD, R5, R0),
1487			BPF_ALU32_REG(BPF_ADD, R5, R1),
1488			BPF_ALU32_REG(BPF_ADD, R5, R2),
1489			BPF_ALU32_REG(BPF_ADD, R5, R3),
1490			BPF_ALU32_REG(BPF_ADD, R5, R4),
1491			BPF_ALU32_REG(BPF_ADD, R5, R5),
1492			BPF_ALU32_REG(BPF_ADD, R5, R6),
1493			BPF_ALU32_REG(BPF_ADD, R5, R7),
1494			BPF_ALU32_REG(BPF_ADD, R5, R8),
1495			BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1496			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1497			BPF_EXIT_INSN(),
1498			BPF_ALU32_REG(BPF_ADD, R6, R0),
1499			BPF_ALU32_REG(BPF_ADD, R6, R1),
1500			BPF_ALU32_REG(BPF_ADD, R6, R2),
1501			BPF_ALU32_REG(BPF_ADD, R6, R3),
1502			BPF_ALU32_REG(BPF_ADD, R6, R4),
1503			BPF_ALU32_REG(BPF_ADD, R6, R5),
1504			BPF_ALU32_REG(BPF_ADD, R6, R6),
1505			BPF_ALU32_REG(BPF_ADD, R6, R7),
1506			BPF_ALU32_REG(BPF_ADD, R6, R8),
1507			BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1508			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1509			BPF_EXIT_INSN(),
1510			BPF_ALU32_REG(BPF_ADD, R7, R0),
1511			BPF_ALU32_REG(BPF_ADD, R7, R1),
1512			BPF_ALU32_REG(BPF_ADD, R7, R2),
1513			BPF_ALU32_REG(BPF_ADD, R7, R3),
1514			BPF_ALU32_REG(BPF_ADD, R7, R4),
1515			BPF_ALU32_REG(BPF_ADD, R7, R5),
1516			BPF_ALU32_REG(BPF_ADD, R7, R6),
1517			BPF_ALU32_REG(BPF_ADD, R7, R7),
1518			BPF_ALU32_REG(BPF_ADD, R7, R8),
1519			BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1520			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1521			BPF_EXIT_INSN(),
1522			BPF_ALU32_REG(BPF_ADD, R8, R0),
1523			BPF_ALU32_REG(BPF_ADD, R8, R1),
1524			BPF_ALU32_REG(BPF_ADD, R8, R2),
1525			BPF_ALU32_REG(BPF_ADD, R8, R3),
1526			BPF_ALU32_REG(BPF_ADD, R8, R4),
1527			BPF_ALU32_REG(BPF_ADD, R8, R5),
1528			BPF_ALU32_REG(BPF_ADD, R8, R6),
1529			BPF_ALU32_REG(BPF_ADD, R8, R7),
1530			BPF_ALU32_REG(BPF_ADD, R8, R8),
1531			BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1532			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1533			BPF_EXIT_INSN(),
1534			BPF_ALU32_REG(BPF_ADD, R9, R0),
1535			BPF_ALU32_REG(BPF_ADD, R9, R1),
1536			BPF_ALU32_REG(BPF_ADD, R9, R2),
1537			BPF_ALU32_REG(BPF_ADD, R9, R3),
1538			BPF_ALU32_REG(BPF_ADD, R9, R4),
1539			BPF_ALU32_REG(BPF_ADD, R9, R5),
1540			BPF_ALU32_REG(BPF_ADD, R9, R6),
1541			BPF_ALU32_REG(BPF_ADD, R9, R7),
1542			BPF_ALU32_REG(BPF_ADD, R9, R8),
1543			BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1544			BPF_ALU32_REG(BPF_MOV, R0, R9),
1545			BPF_EXIT_INSN(),
1546		},
1547		INTERNAL,
1548		{ },
1549		{ { 0, 2957380 } }
1550	},
1551	{	/* Mainly checking JIT here. */
1552		"INT: SUB",
1553		.u.insns_int = {
1554			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1555			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1556			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1557			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1558			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1559			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1560			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1561			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1562			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1563			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1564			BPF_ALU64_REG(BPF_SUB, R0, R0),
1565			BPF_ALU64_REG(BPF_SUB, R0, R1),
1566			BPF_ALU64_REG(BPF_SUB, R0, R2),
1567			BPF_ALU64_REG(BPF_SUB, R0, R3),
1568			BPF_ALU64_REG(BPF_SUB, R0, R4),
1569			BPF_ALU64_REG(BPF_SUB, R0, R5),
1570			BPF_ALU64_REG(BPF_SUB, R0, R6),
1571			BPF_ALU64_REG(BPF_SUB, R0, R7),
1572			BPF_ALU64_REG(BPF_SUB, R0, R8),
1573			BPF_ALU64_REG(BPF_SUB, R0, R9),
1574			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1575			BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1576			BPF_EXIT_INSN(),
1577			BPF_ALU64_REG(BPF_SUB, R1, R0),
1578			BPF_ALU64_REG(BPF_SUB, R1, R2),
1579			BPF_ALU64_REG(BPF_SUB, R1, R3),
1580			BPF_ALU64_REG(BPF_SUB, R1, R4),
1581			BPF_ALU64_REG(BPF_SUB, R1, R5),
1582			BPF_ALU64_REG(BPF_SUB, R1, R6),
1583			BPF_ALU64_REG(BPF_SUB, R1, R7),
1584			BPF_ALU64_REG(BPF_SUB, R1, R8),
1585			BPF_ALU64_REG(BPF_SUB, R1, R9),
1586			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1587			BPF_ALU64_REG(BPF_SUB, R2, R0),
1588			BPF_ALU64_REG(BPF_SUB, R2, R1),
1589			BPF_ALU64_REG(BPF_SUB, R2, R3),
1590			BPF_ALU64_REG(BPF_SUB, R2, R4),
1591			BPF_ALU64_REG(BPF_SUB, R2, R5),
1592			BPF_ALU64_REG(BPF_SUB, R2, R6),
1593			BPF_ALU64_REG(BPF_SUB, R2, R7),
1594			BPF_ALU64_REG(BPF_SUB, R2, R8),
1595			BPF_ALU64_REG(BPF_SUB, R2, R9),
1596			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1597			BPF_ALU64_REG(BPF_SUB, R3, R0),
1598			BPF_ALU64_REG(BPF_SUB, R3, R1),
1599			BPF_ALU64_REG(BPF_SUB, R3, R2),
1600			BPF_ALU64_REG(BPF_SUB, R3, R4),
1601			BPF_ALU64_REG(BPF_SUB, R3, R5),
1602			BPF_ALU64_REG(BPF_SUB, R3, R6),
1603			BPF_ALU64_REG(BPF_SUB, R3, R7),
1604			BPF_ALU64_REG(BPF_SUB, R3, R8),
1605			BPF_ALU64_REG(BPF_SUB, R3, R9),
1606			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1607			BPF_ALU64_REG(BPF_SUB, R4, R0),
1608			BPF_ALU64_REG(BPF_SUB, R4, R1),
1609			BPF_ALU64_REG(BPF_SUB, R4, R2),
1610			BPF_ALU64_REG(BPF_SUB, R4, R3),
1611			BPF_ALU64_REG(BPF_SUB, R4, R5),
1612			BPF_ALU64_REG(BPF_SUB, R4, R6),
1613			BPF_ALU64_REG(BPF_SUB, R4, R7),
1614			BPF_ALU64_REG(BPF_SUB, R4, R8),
1615			BPF_ALU64_REG(BPF_SUB, R4, R9),
1616			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1617			BPF_ALU64_REG(BPF_SUB, R5, R0),
1618			BPF_ALU64_REG(BPF_SUB, R5, R1),
1619			BPF_ALU64_REG(BPF_SUB, R5, R2),
1620			BPF_ALU64_REG(BPF_SUB, R5, R3),
1621			BPF_ALU64_REG(BPF_SUB, R5, R4),
1622			BPF_ALU64_REG(BPF_SUB, R5, R6),
1623			BPF_ALU64_REG(BPF_SUB, R5, R7),
1624			BPF_ALU64_REG(BPF_SUB, R5, R8),
1625			BPF_ALU64_REG(BPF_SUB, R5, R9),
1626			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1627			BPF_ALU64_REG(BPF_SUB, R6, R0),
1628			BPF_ALU64_REG(BPF_SUB, R6, R1),
1629			BPF_ALU64_REG(BPF_SUB, R6, R2),
1630			BPF_ALU64_REG(BPF_SUB, R6, R3),
1631			BPF_ALU64_REG(BPF_SUB, R6, R4),
1632			BPF_ALU64_REG(BPF_SUB, R6, R5),
1633			BPF_ALU64_REG(BPF_SUB, R6, R7),
1634			BPF_ALU64_REG(BPF_SUB, R6, R8),
1635			BPF_ALU64_REG(BPF_SUB, R6, R9),
1636			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1637			BPF_ALU64_REG(BPF_SUB, R7, R0),
1638			BPF_ALU64_REG(BPF_SUB, R7, R1),
1639			BPF_ALU64_REG(BPF_SUB, R7, R2),
1640			BPF_ALU64_REG(BPF_SUB, R7, R3),
1641			BPF_ALU64_REG(BPF_SUB, R7, R4),
1642			BPF_ALU64_REG(BPF_SUB, R7, R5),
1643			BPF_ALU64_REG(BPF_SUB, R7, R6),
1644			BPF_ALU64_REG(BPF_SUB, R7, R8),
1645			BPF_ALU64_REG(BPF_SUB, R7, R9),
1646			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1647			BPF_ALU64_REG(BPF_SUB, R8, R0),
1648			BPF_ALU64_REG(BPF_SUB, R8, R1),
1649			BPF_ALU64_REG(BPF_SUB, R8, R2),
1650			BPF_ALU64_REG(BPF_SUB, R8, R3),
1651			BPF_ALU64_REG(BPF_SUB, R8, R4),
1652			BPF_ALU64_REG(BPF_SUB, R8, R5),
1653			BPF_ALU64_REG(BPF_SUB, R8, R6),
1654			BPF_ALU64_REG(BPF_SUB, R8, R7),
1655			BPF_ALU64_REG(BPF_SUB, R8, R9),
1656			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1657			BPF_ALU64_REG(BPF_SUB, R9, R0),
1658			BPF_ALU64_REG(BPF_SUB, R9, R1),
1659			BPF_ALU64_REG(BPF_SUB, R9, R2),
1660			BPF_ALU64_REG(BPF_SUB, R9, R3),
1661			BPF_ALU64_REG(BPF_SUB, R9, R4),
1662			BPF_ALU64_REG(BPF_SUB, R9, R5),
1663			BPF_ALU64_REG(BPF_SUB, R9, R6),
1664			BPF_ALU64_REG(BPF_SUB, R9, R7),
1665			BPF_ALU64_REG(BPF_SUB, R9, R8),
1666			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1667			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1668			BPF_ALU64_IMM(BPF_NEG, R0, 0),
1669			BPF_ALU64_REG(BPF_SUB, R0, R1),
1670			BPF_ALU64_REG(BPF_SUB, R0, R2),
1671			BPF_ALU64_REG(BPF_SUB, R0, R3),
1672			BPF_ALU64_REG(BPF_SUB, R0, R4),
1673			BPF_ALU64_REG(BPF_SUB, R0, R5),
1674			BPF_ALU64_REG(BPF_SUB, R0, R6),
1675			BPF_ALU64_REG(BPF_SUB, R0, R7),
1676			BPF_ALU64_REG(BPF_SUB, R0, R8),
1677			BPF_ALU64_REG(BPF_SUB, R0, R9),
1678			BPF_EXIT_INSN(),
1679		},
1680		INTERNAL,
1681		{ },
1682		{ { 0, 11 } }
1683	},
1684	{	/* Mainly checking JIT here. */
1685		"INT: XOR",
1686		.u.insns_int = {
1687			BPF_ALU64_REG(BPF_SUB, R0, R0),
1688			BPF_ALU64_REG(BPF_XOR, R1, R1),
1689			BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1690			BPF_EXIT_INSN(),
1691			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1692			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1693			BPF_ALU64_REG(BPF_SUB, R1, R1),
1694			BPF_ALU64_REG(BPF_XOR, R2, R2),
1695			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1696			BPF_EXIT_INSN(),
1697			BPF_ALU64_REG(BPF_SUB, R2, R2),
1698			BPF_ALU64_REG(BPF_XOR, R3, R3),
1699			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1700			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1701			BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1702			BPF_EXIT_INSN(),
1703			BPF_ALU64_REG(BPF_SUB, R3, R3),
1704			BPF_ALU64_REG(BPF_XOR, R4, R4),
1705			BPF_ALU64_IMM(BPF_MOV, R2, 1),
1706			BPF_ALU64_IMM(BPF_MOV, R5, -1),
1707			BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1708			BPF_EXIT_INSN(),
1709			BPF_ALU64_REG(BPF_SUB, R4, R4),
1710			BPF_ALU64_REG(BPF_XOR, R5, R5),
1711			BPF_ALU64_IMM(BPF_MOV, R3, 1),
1712			BPF_ALU64_IMM(BPF_MOV, R7, -1),
1713			BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1714			BPF_EXIT_INSN(),
1715			BPF_ALU64_IMM(BPF_MOV, R5, 1),
1716			BPF_ALU64_REG(BPF_SUB, R5, R5),
1717			BPF_ALU64_REG(BPF_XOR, R6, R6),
1718			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1719			BPF_ALU64_IMM(BPF_MOV, R8, -1),
1720			BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1721			BPF_EXIT_INSN(),
1722			BPF_ALU64_REG(BPF_SUB, R6, R6),
1723			BPF_ALU64_REG(BPF_XOR, R7, R7),
1724			BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1725			BPF_EXIT_INSN(),
1726			BPF_ALU64_REG(BPF_SUB, R7, R7),
1727			BPF_ALU64_REG(BPF_XOR, R8, R8),
1728			BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1729			BPF_EXIT_INSN(),
1730			BPF_ALU64_REG(BPF_SUB, R8, R8),
1731			BPF_ALU64_REG(BPF_XOR, R9, R9),
1732			BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1733			BPF_EXIT_INSN(),
1734			BPF_ALU64_REG(BPF_SUB, R9, R9),
1735			BPF_ALU64_REG(BPF_XOR, R0, R0),
1736			BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1737			BPF_EXIT_INSN(),
1738			BPF_ALU64_REG(BPF_SUB, R1, R1),
1739			BPF_ALU64_REG(BPF_XOR, R0, R0),
1740			BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1741			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1742			BPF_EXIT_INSN(),
1743			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1744			BPF_EXIT_INSN(),
1745		},
1746		INTERNAL,
1747		{ },
1748		{ { 0, 1 } }
1749	},
1750	{	/* Mainly checking JIT here. */
1751		"INT: MUL",
1752		.u.insns_int = {
1753			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1754			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1755			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1756			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1757			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1758			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1759			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1760			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1761			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1762			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1763			BPF_ALU64_REG(BPF_MUL, R0, R0),
1764			BPF_ALU64_REG(BPF_MUL, R0, R1),
1765			BPF_ALU64_REG(BPF_MUL, R0, R2),
1766			BPF_ALU64_REG(BPF_MUL, R0, R3),
1767			BPF_ALU64_REG(BPF_MUL, R0, R4),
1768			BPF_ALU64_REG(BPF_MUL, R0, R5),
1769			BPF_ALU64_REG(BPF_MUL, R0, R6),
1770			BPF_ALU64_REG(BPF_MUL, R0, R7),
1771			BPF_ALU64_REG(BPF_MUL, R0, R8),
1772			BPF_ALU64_REG(BPF_MUL, R0, R9),
1773			BPF_ALU64_IMM(BPF_MUL, R0, 10),
1774			BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1775			BPF_EXIT_INSN(),
1776			BPF_ALU64_REG(BPF_MUL, R1, R0),
1777			BPF_ALU64_REG(BPF_MUL, R1, R2),
1778			BPF_ALU64_REG(BPF_MUL, R1, R3),
1779			BPF_ALU64_REG(BPF_MUL, R1, R4),
1780			BPF_ALU64_REG(BPF_MUL, R1, R5),
1781			BPF_ALU64_REG(BPF_MUL, R1, R6),
1782			BPF_ALU64_REG(BPF_MUL, R1, R7),
1783			BPF_ALU64_REG(BPF_MUL, R1, R8),
1784			BPF_ALU64_REG(BPF_MUL, R1, R9),
1785			BPF_ALU64_IMM(BPF_MUL, R1, 10),
1786			BPF_ALU64_REG(BPF_MOV, R2, R1),
1787			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1788			BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1789			BPF_EXIT_INSN(),
1790			BPF_ALU64_IMM(BPF_LSH, R1, 32),
1791			BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1792			BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1793			BPF_EXIT_INSN(),
1794			BPF_ALU64_REG(BPF_MUL, R2, R0),
1795			BPF_ALU64_REG(BPF_MUL, R2, R1),
1796			BPF_ALU64_REG(BPF_MUL, R2, R3),
1797			BPF_ALU64_REG(BPF_MUL, R2, R4),
1798			BPF_ALU64_REG(BPF_MUL, R2, R5),
1799			BPF_ALU64_REG(BPF_MUL, R2, R6),
1800			BPF_ALU64_REG(BPF_MUL, R2, R7),
1801			BPF_ALU64_REG(BPF_MUL, R2, R8),
1802			BPF_ALU64_REG(BPF_MUL, R2, R9),
1803			BPF_ALU64_IMM(BPF_MUL, R2, 10),
1804			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1805			BPF_ALU64_REG(BPF_MOV, R0, R2),
1806			BPF_EXIT_INSN(),
1807		},
1808		INTERNAL,
1809		{ },
1810		{ { 0, 0x35d97ef2 } }
1811	},
1812	{	/* Mainly checking JIT here. */
1813		"MOV REG64",
1814		.u.insns_int = {
1815			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1816			BPF_MOV64_REG(R1, R0),
1817			BPF_MOV64_REG(R2, R1),
1818			BPF_MOV64_REG(R3, R2),
1819			BPF_MOV64_REG(R4, R3),
1820			BPF_MOV64_REG(R5, R4),
1821			BPF_MOV64_REG(R6, R5),
1822			BPF_MOV64_REG(R7, R6),
1823			BPF_MOV64_REG(R8, R7),
1824			BPF_MOV64_REG(R9, R8),
1825			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1826			BPF_ALU64_IMM(BPF_MOV, R1, 0),
1827			BPF_ALU64_IMM(BPF_MOV, R2, 0),
1828			BPF_ALU64_IMM(BPF_MOV, R3, 0),
1829			BPF_ALU64_IMM(BPF_MOV, R4, 0),
1830			BPF_ALU64_IMM(BPF_MOV, R5, 0),
1831			BPF_ALU64_IMM(BPF_MOV, R6, 0),
1832			BPF_ALU64_IMM(BPF_MOV, R7, 0),
1833			BPF_ALU64_IMM(BPF_MOV, R8, 0),
1834			BPF_ALU64_IMM(BPF_MOV, R9, 0),
1835			BPF_ALU64_REG(BPF_ADD, R0, R0),
1836			BPF_ALU64_REG(BPF_ADD, R0, R1),
1837			BPF_ALU64_REG(BPF_ADD, R0, R2),
1838			BPF_ALU64_REG(BPF_ADD, R0, R3),
1839			BPF_ALU64_REG(BPF_ADD, R0, R4),
1840			BPF_ALU64_REG(BPF_ADD, R0, R5),
1841			BPF_ALU64_REG(BPF_ADD, R0, R6),
1842			BPF_ALU64_REG(BPF_ADD, R0, R7),
1843			BPF_ALU64_REG(BPF_ADD, R0, R8),
1844			BPF_ALU64_REG(BPF_ADD, R0, R9),
1845			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1846			BPF_EXIT_INSN(),
1847		},
1848		INTERNAL,
1849		{ },
1850		{ { 0, 0xfefe } }
1851	},
1852	{	/* Mainly checking JIT here. */
1853		"MOV REG32",
1854		.u.insns_int = {
1855			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1856			BPF_MOV64_REG(R1, R0),
1857			BPF_MOV64_REG(R2, R1),
1858			BPF_MOV64_REG(R3, R2),
1859			BPF_MOV64_REG(R4, R3),
1860			BPF_MOV64_REG(R5, R4),
1861			BPF_MOV64_REG(R6, R5),
1862			BPF_MOV64_REG(R7, R6),
1863			BPF_MOV64_REG(R8, R7),
1864			BPF_MOV64_REG(R9, R8),
1865			BPF_ALU32_IMM(BPF_MOV, R0, 0),
1866			BPF_ALU32_IMM(BPF_MOV, R1, 0),
1867			BPF_ALU32_IMM(BPF_MOV, R2, 0),
1868			BPF_ALU32_IMM(BPF_MOV, R3, 0),
1869			BPF_ALU32_IMM(BPF_MOV, R4, 0),
1870			BPF_ALU32_IMM(BPF_MOV, R5, 0),
1871			BPF_ALU32_IMM(BPF_MOV, R6, 0),
1872			BPF_ALU32_IMM(BPF_MOV, R7, 0),
1873			BPF_ALU32_IMM(BPF_MOV, R8, 0),
1874			BPF_ALU32_IMM(BPF_MOV, R9, 0),
1875			BPF_ALU64_REG(BPF_ADD, R0, R0),
1876			BPF_ALU64_REG(BPF_ADD, R0, R1),
1877			BPF_ALU64_REG(BPF_ADD, R0, R2),
1878			BPF_ALU64_REG(BPF_ADD, R0, R3),
1879			BPF_ALU64_REG(BPF_ADD, R0, R4),
1880			BPF_ALU64_REG(BPF_ADD, R0, R5),
1881			BPF_ALU64_REG(BPF_ADD, R0, R6),
1882			BPF_ALU64_REG(BPF_ADD, R0, R7),
1883			BPF_ALU64_REG(BPF_ADD, R0, R8),
1884			BPF_ALU64_REG(BPF_ADD, R0, R9),
1885			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1886			BPF_EXIT_INSN(),
1887		},
1888		INTERNAL,
1889		{ },
1890		{ { 0, 0xfefe } }
1891	},
1892	{	/* Mainly checking JIT here. */
1893		"LD IMM64",
1894		.u.insns_int = {
1895			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1896			BPF_MOV64_REG(R1, R0),
1897			BPF_MOV64_REG(R2, R1),
1898			BPF_MOV64_REG(R3, R2),
1899			BPF_MOV64_REG(R4, R3),
1900			BPF_MOV64_REG(R5, R4),
1901			BPF_MOV64_REG(R6, R5),
1902			BPF_MOV64_REG(R7, R6),
1903			BPF_MOV64_REG(R8, R7),
1904			BPF_MOV64_REG(R9, R8),
1905			BPF_LD_IMM64(R0, 0x0LL),
1906			BPF_LD_IMM64(R1, 0x0LL),
1907			BPF_LD_IMM64(R2, 0x0LL),
1908			BPF_LD_IMM64(R3, 0x0LL),
1909			BPF_LD_IMM64(R4, 0x0LL),
1910			BPF_LD_IMM64(R5, 0x0LL),
1911			BPF_LD_IMM64(R6, 0x0LL),
1912			BPF_LD_IMM64(R7, 0x0LL),
1913			BPF_LD_IMM64(R8, 0x0LL),
1914			BPF_LD_IMM64(R9, 0x0LL),
1915			BPF_ALU64_REG(BPF_ADD, R0, R0),
1916			BPF_ALU64_REG(BPF_ADD, R0, R1),
1917			BPF_ALU64_REG(BPF_ADD, R0, R2),
1918			BPF_ALU64_REG(BPF_ADD, R0, R3),
1919			BPF_ALU64_REG(BPF_ADD, R0, R4),
1920			BPF_ALU64_REG(BPF_ADD, R0, R5),
1921			BPF_ALU64_REG(BPF_ADD, R0, R6),
1922			BPF_ALU64_REG(BPF_ADD, R0, R7),
1923			BPF_ALU64_REG(BPF_ADD, R0, R8),
1924			BPF_ALU64_REG(BPF_ADD, R0, R9),
1925			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1926			BPF_EXIT_INSN(),
1927		},
1928		INTERNAL,
1929		{ },
1930		{ { 0, 0xfefe } }
1931	},
1932	{
1933		"INT: ALU MIX",
1934		.u.insns_int = {
1935			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1936			BPF_ALU64_IMM(BPF_ADD, R0, -1),
1937			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1938			BPF_ALU64_IMM(BPF_XOR, R2, 3),
1939			BPF_ALU64_REG(BPF_DIV, R0, R2),
1940			BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1941			BPF_EXIT_INSN(),
1942			BPF_ALU64_IMM(BPF_MOD, R0, 3),
1943			BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1944			BPF_EXIT_INSN(),
1945			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1946			BPF_EXIT_INSN(),
1947		},
1948		INTERNAL,
1949		{ },
1950		{ { 0, -1 } }
1951	},
1952	{
1953		"INT: shifts by register",
1954		.u.insns_int = {
1955			BPF_MOV64_IMM(R0, -1234),
1956			BPF_MOV64_IMM(R1, 1),
1957			BPF_ALU32_REG(BPF_RSH, R0, R1),
1958			BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1959			BPF_EXIT_INSN(),
1960			BPF_MOV64_IMM(R2, 1),
1961			BPF_ALU64_REG(BPF_LSH, R0, R2),
1962			BPF_MOV32_IMM(R4, -1234),
1963			BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1964			BPF_EXIT_INSN(),
1965			BPF_ALU64_IMM(BPF_AND, R4, 63),
1966			BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1967			BPF_MOV64_IMM(R3, 47),
1968			BPF_ALU64_REG(BPF_ARSH, R0, R3),
1969			BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1970			BPF_EXIT_INSN(),
1971			BPF_MOV64_IMM(R2, 1),
1972			BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1973			BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1974			BPF_EXIT_INSN(),
1975			BPF_MOV64_IMM(R4, 4),
1976			BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1977			BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1978			BPF_EXIT_INSN(),
1979			BPF_MOV64_IMM(R4, 5),
1980			BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1981			BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1982			BPF_EXIT_INSN(),
1983			BPF_MOV64_IMM(R0, -1),
1984			BPF_EXIT_INSN(),
1985		},
1986		INTERNAL,
1987		{ },
1988		{ { 0, -1 } }
1989	},
1990	{
1991		"INT: DIV + ABS",
1992		.u.insns_int = {
1993			BPF_ALU64_REG(BPF_MOV, R6, R1),
1994			BPF_LD_ABS(BPF_B, 3),
1995			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1996			BPF_ALU32_REG(BPF_DIV, R0, R2),
1997			BPF_ALU64_REG(BPF_MOV, R8, R0),
1998			BPF_LD_ABS(BPF_B, 4),
1999			BPF_ALU64_REG(BPF_ADD, R8, R0),
2000			BPF_LD_IND(BPF_B, R8, -70),
2001			BPF_EXIT_INSN(),
2002		},
2003		INTERNAL,
2004		{ 10, 20, 30, 40, 50 },
2005		{ { 4, 0 }, { 5, 10 } }
2006	},
2007	{
2008		/* This one doesn't go through verifier, but is just raw insn
2009		 * as opposed to cBPF tests from here. Thus div by 0 tests are
2010		 * done in test_verifier in BPF kselftests.
2011		 */
2012		"INT: DIV by -1",
2013		.u.insns_int = {
2014			BPF_ALU64_REG(BPF_MOV, R6, R1),
2015			BPF_ALU64_IMM(BPF_MOV, R7, -1),
2016			BPF_LD_ABS(BPF_B, 3),
2017			BPF_ALU32_REG(BPF_DIV, R0, R7),
2018			BPF_EXIT_INSN(),
2019		},
2020		INTERNAL,
2021		{ 10, 20, 30, 40, 50 },
2022		{ { 3, 0 }, { 4, 0 } }
2023	},
2024	{
2025		"check: missing ret",
2026		.u.insns = {
2027			BPF_STMT(BPF_LD | BPF_IMM, 1),
2028		},
2029		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2030		{ },
2031		{ },
2032		.fill_helper = NULL,
2033		.expected_errcode = -EINVAL,
2034	},
2035	{
2036		"check: div_k_0",
2037		.u.insns = {
2038			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
2039			BPF_STMT(BPF_RET | BPF_K, 0)
2040		},
2041		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2042		{ },
2043		{ },
2044		.fill_helper = NULL,
2045		.expected_errcode = -EINVAL,
2046	},
2047	{
2048		"check: unknown insn",
2049		.u.insns = {
2050			/* seccomp insn, rejected in socket filter */
2051			BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
2052			BPF_STMT(BPF_RET | BPF_K, 0)
2053		},
2054		CLASSIC | FLAG_EXPECTED_FAIL,
2055		{ },
2056		{ },
2057		.fill_helper = NULL,
2058		.expected_errcode = -EINVAL,
2059	},
2060	{
2061		"check: out of range spill/fill",
2062		.u.insns = {
2063			BPF_STMT(BPF_STX, 16),
2064			BPF_STMT(BPF_RET | BPF_K, 0)
2065		},
2066		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2067		{ },
2068		{ },
2069		.fill_helper = NULL,
2070		.expected_errcode = -EINVAL,
2071	},
2072	{
2073		"JUMPS + HOLES",
2074		.u.insns = {
2075			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2076			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
2077			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2078			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2079			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2080			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2081			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2082			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2083			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2084			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2085			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2086			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2087			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2088			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2089			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2090			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
2091			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2092			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
2093			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2094			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
2095			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
2096			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2097			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2098			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2099			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2100			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2101			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2102			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2103			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2104			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2105			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2106			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2107			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2108			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2109			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
2110			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
2111			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2112			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
2113			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
2114			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2115			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2116			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2117			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2118			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2119			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2120			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2121			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2122			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2123			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2124			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2125			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2126			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2127			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
2128			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
2129			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2130			BPF_STMT(BPF_RET | BPF_A, 0),
2131			BPF_STMT(BPF_RET | BPF_A, 0),
2132		},
2133		CLASSIC,
2134		{ 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
2135		  0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
2136		  0x08, 0x00,
2137		  0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
2138		  0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
2139		  0xc0, 0xa8, 0x33, 0x01,
2140		  0xc0, 0xa8, 0x33, 0x02,
2141		  0xbb, 0xb6,
2142		  0xa9, 0xfa,
2143		  0x00, 0x14, 0x00, 0x00,
2144		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2145		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2146		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2147		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2148		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2149		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2150		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2151		  0xcc, 0xcc, 0xcc, 0xcc },
2152		{ { 88, 0x001b } }
2153	},
2154	{
2155		"check: RET X",
2156		.u.insns = {
2157			BPF_STMT(BPF_RET | BPF_X, 0),
2158		},
2159		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2160		{ },
2161		{ },
2162		.fill_helper = NULL,
2163		.expected_errcode = -EINVAL,
2164	},
2165	{
2166		"check: LDX + RET X",
2167		.u.insns = {
2168			BPF_STMT(BPF_LDX | BPF_IMM, 42),
2169			BPF_STMT(BPF_RET | BPF_X, 0),
2170		},
2171		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2172		{ },
2173		{ },
2174		.fill_helper = NULL,
2175		.expected_errcode = -EINVAL,
2176	},
2177	{	/* Mainly checking JIT here. */
2178		"M[]: alt STX + LDX",
2179		.u.insns = {
2180			BPF_STMT(BPF_LDX | BPF_IMM, 100),
2181			BPF_STMT(BPF_STX, 0),
2182			BPF_STMT(BPF_LDX | BPF_MEM, 0),
2183			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2184			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2185			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2186			BPF_STMT(BPF_STX, 1),
2187			BPF_STMT(BPF_LDX | BPF_MEM, 1),
2188			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2189			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2190			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2191			BPF_STMT(BPF_STX, 2),
2192			BPF_STMT(BPF_LDX | BPF_MEM, 2),
2193			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2194			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2195			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2196			BPF_STMT(BPF_STX, 3),
2197			BPF_STMT(BPF_LDX | BPF_MEM, 3),
2198			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2199			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2200			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2201			BPF_STMT(BPF_STX, 4),
2202			BPF_STMT(BPF_LDX | BPF_MEM, 4),
2203			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2204			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2205			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2206			BPF_STMT(BPF_STX, 5),
2207			BPF_STMT(BPF_LDX | BPF_MEM, 5),
2208			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2209			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2210			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2211			BPF_STMT(BPF_STX, 6),
2212			BPF_STMT(BPF_LDX | BPF_MEM, 6),
2213			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2214			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2215			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2216			BPF_STMT(BPF_STX, 7),
2217			BPF_STMT(BPF_LDX | BPF_MEM, 7),
2218			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2219			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2220			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2221			BPF_STMT(BPF_STX, 8),
2222			BPF_STMT(BPF_LDX | BPF_MEM, 8),
2223			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2224			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2225			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2226			BPF_STMT(BPF_STX, 9),
2227			BPF_STMT(BPF_LDX | BPF_MEM, 9),
2228			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2229			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2230			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2231			BPF_STMT(BPF_STX, 10),
2232			BPF_STMT(BPF_LDX | BPF_MEM, 10),
2233			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2234			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2235			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2236			BPF_STMT(BPF_STX, 11),
2237			BPF_STMT(BPF_LDX | BPF_MEM, 11),
2238			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2239			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2240			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2241			BPF_STMT(BPF_STX, 12),
2242			BPF_STMT(BPF_LDX | BPF_MEM, 12),
2243			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2244			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2245			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2246			BPF_STMT(BPF_STX, 13),
2247			BPF_STMT(BPF_LDX | BPF_MEM, 13),
2248			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2249			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2250			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2251			BPF_STMT(BPF_STX, 14),
2252			BPF_STMT(BPF_LDX | BPF_MEM, 14),
2253			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2254			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2255			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2256			BPF_STMT(BPF_STX, 15),
2257			BPF_STMT(BPF_LDX | BPF_MEM, 15),
2258			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2259			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2260			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2261			BPF_STMT(BPF_RET | BPF_A, 0),
2262		},
2263		CLASSIC | FLAG_NO_DATA,
2264		{ },
2265		{ { 0, 116 } },
2266	},
2267	{	/* Mainly checking JIT here. */
2268		"M[]: full STX + full LDX",
2269		.u.insns = {
2270			BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
2271			BPF_STMT(BPF_STX, 0),
2272			BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
2273			BPF_STMT(BPF_STX, 1),
2274			BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
2275			BPF_STMT(BPF_STX, 2),
2276			BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
2277			BPF_STMT(BPF_STX, 3),
2278			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
2279			BPF_STMT(BPF_STX, 4),
2280			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
2281			BPF_STMT(BPF_STX, 5),
2282			BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
2283			BPF_STMT(BPF_STX, 6),
2284			BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
2285			BPF_STMT(BPF_STX, 7),
2286			BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
2287			BPF_STMT(BPF_STX, 8),
2288			BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
2289			BPF_STMT(BPF_STX, 9),
2290			BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
2291			BPF_STMT(BPF_STX, 10),
2292			BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
2293			BPF_STMT(BPF_STX, 11),
2294			BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
2295			BPF_STMT(BPF_STX, 12),
2296			BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
2297			BPF_STMT(BPF_STX, 13),
2298			BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
2299			BPF_STMT(BPF_STX, 14),
2300			BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
2301			BPF_STMT(BPF_STX, 15),
2302			BPF_STMT(BPF_LDX | BPF_MEM, 0),
2303			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2304			BPF_STMT(BPF_LDX | BPF_MEM, 1),
2305			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2306			BPF_STMT(BPF_LDX | BPF_MEM, 2),
2307			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2308			BPF_STMT(BPF_LDX | BPF_MEM, 3),
2309			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2310			BPF_STMT(BPF_LDX | BPF_MEM, 4),
2311			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2312			BPF_STMT(BPF_LDX | BPF_MEM, 5),
2313			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2314			BPF_STMT(BPF_LDX | BPF_MEM, 6),
2315			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2316			BPF_STMT(BPF_LDX | BPF_MEM, 7),
2317			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2318			BPF_STMT(BPF_LDX | BPF_MEM, 8),
2319			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2320			BPF_STMT(BPF_LDX | BPF_MEM, 9),
2321			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2322			BPF_STMT(BPF_LDX | BPF_MEM, 10),
2323			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2324			BPF_STMT(BPF_LDX | BPF_MEM, 11),
2325			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2326			BPF_STMT(BPF_LDX | BPF_MEM, 12),
2327			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2328			BPF_STMT(BPF_LDX | BPF_MEM, 13),
2329			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2330			BPF_STMT(BPF_LDX | BPF_MEM, 14),
2331			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2332			BPF_STMT(BPF_LDX | BPF_MEM, 15),
2333			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2334			BPF_STMT(BPF_RET | BPF_A, 0),
2335		},
2336		CLASSIC | FLAG_NO_DATA,
2337		{ },
2338		{ { 0, 0x2a5a5e5 } },
2339	},
2340	{
2341		"check: SKF_AD_MAX",
2342		.u.insns = {
2343			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2344				 SKF_AD_OFF + SKF_AD_MAX),
2345			BPF_STMT(BPF_RET | BPF_A, 0),
2346		},
2347		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2348		{ },
2349		{ },
2350		.fill_helper = NULL,
2351		.expected_errcode = -EINVAL,
2352	},
2353	{	/* Passes checker but fails during runtime. */
2354		"LD [SKF_AD_OFF-1]",
2355		.u.insns = {
2356			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2357				 SKF_AD_OFF - 1),
2358			BPF_STMT(BPF_RET | BPF_K, 1),
2359		},
2360		CLASSIC,
2361		{ },
2362		{ { 1, 0 } },
2363	},
2364	{
2365		"load 64-bit immediate",
2366		.u.insns_int = {
2367			BPF_LD_IMM64(R1, 0x567800001234LL),
2368			BPF_MOV64_REG(R2, R1),
2369			BPF_MOV64_REG(R3, R2),
2370			BPF_ALU64_IMM(BPF_RSH, R2, 32),
2371			BPF_ALU64_IMM(BPF_LSH, R3, 32),
2372			BPF_ALU64_IMM(BPF_RSH, R3, 32),
2373			BPF_ALU64_IMM(BPF_MOV, R0, 0),
2374			BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
2375			BPF_EXIT_INSN(),
2376			BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
2377			BPF_EXIT_INSN(),
2378			BPF_LD_IMM64(R0, 0x1ffffffffLL),
2379			BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
2380			BPF_EXIT_INSN(),
2381		},
2382		INTERNAL,
2383		{ },
2384		{ { 0, 1 } }
2385	},
2386	{
2387		"nmap reduced",
2388		.u.insns_int = {
2389			BPF_MOV64_REG(R6, R1),
2390			BPF_LD_ABS(BPF_H, 12),
2391			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 28),
2392			BPF_LD_ABS(BPF_H, 12),
2393			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 26),
2394			BPF_MOV32_IMM(R0, 18),
2395			BPF_STX_MEM(BPF_W, R10, R0, -64),
2396			BPF_LDX_MEM(BPF_W, R7, R10, -64),
2397			BPF_LD_IND(BPF_W, R7, 14),
2398			BPF_STX_MEM(BPF_W, R10, R0, -60),
2399			BPF_MOV32_IMM(R0, 280971478),
2400			BPF_STX_MEM(BPF_W, R10, R0, -56),
2401			BPF_LDX_MEM(BPF_W, R7, R10, -56),
2402			BPF_LDX_MEM(BPF_W, R0, R10, -60),
2403			BPF_ALU32_REG(BPF_SUB, R0, R7),
2404			BPF_JMP_IMM(BPF_JNE, R0, 0, 15),
2405			BPF_LD_ABS(BPF_H, 12),
2406			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 13),
2407			BPF_MOV32_IMM(R0, 22),
2408			BPF_STX_MEM(BPF_W, R10, R0, -56),
2409			BPF_LDX_MEM(BPF_W, R7, R10, -56),
2410			BPF_LD_IND(BPF_H, R7, 14),
2411			BPF_STX_MEM(BPF_W, R10, R0, -52),
2412			BPF_MOV32_IMM(R0, 17366),
2413			BPF_STX_MEM(BPF_W, R10, R0, -48),
2414			BPF_LDX_MEM(BPF_W, R7, R10, -48),
2415			BPF_LDX_MEM(BPF_W, R0, R10, -52),
2416			BPF_ALU32_REG(BPF_SUB, R0, R7),
2417			BPF_JMP_IMM(BPF_JNE, R0, 0, 2),
2418			BPF_MOV32_IMM(R0, 256),
2419			BPF_EXIT_INSN(),
2420			BPF_MOV32_IMM(R0, 0),
2421			BPF_EXIT_INSN(),
2422		},
2423		INTERNAL,
2424		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 0,
2425		  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2426		  0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6},
2427		{ { 38, 256 } },
2428		.stack_depth = 64,
2429	},
2430	/* BPF_ALU | BPF_MOV | BPF_X */
2431	{
2432		"ALU_MOV_X: dst = 2",
2433		.u.insns_int = {
2434			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2435			BPF_ALU32_REG(BPF_MOV, R0, R1),
2436			BPF_EXIT_INSN(),
2437		},
2438		INTERNAL,
2439		{ },
2440		{ { 0, 2 } },
2441	},
2442	{
2443		"ALU_MOV_X: dst = 4294967295",
2444		.u.insns_int = {
2445			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2446			BPF_ALU32_REG(BPF_MOV, R0, R1),
2447			BPF_EXIT_INSN(),
2448		},
2449		INTERNAL,
2450		{ },
2451		{ { 0, 4294967295U } },
2452	},
2453	{
2454		"ALU64_MOV_X: dst = 2",
2455		.u.insns_int = {
2456			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2457			BPF_ALU64_REG(BPF_MOV, R0, R1),
2458			BPF_EXIT_INSN(),
2459		},
2460		INTERNAL,
2461		{ },
2462		{ { 0, 2 } },
2463	},
2464	{
2465		"ALU64_MOV_X: dst = 4294967295",
2466		.u.insns_int = {
2467			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2468			BPF_ALU64_REG(BPF_MOV, R0, R1),
2469			BPF_EXIT_INSN(),
2470		},
2471		INTERNAL,
2472		{ },
2473		{ { 0, 4294967295U } },
2474	},
2475	/* BPF_ALU | BPF_MOV | BPF_K */
2476	{
2477		"ALU_MOV_K: dst = 2",
2478		.u.insns_int = {
2479			BPF_ALU32_IMM(BPF_MOV, R0, 2),
2480			BPF_EXIT_INSN(),
2481		},
2482		INTERNAL,
2483		{ },
2484		{ { 0, 2 } },
2485	},
2486	{
2487		"ALU_MOV_K: dst = 4294967295",
2488		.u.insns_int = {
2489			BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
2490			BPF_EXIT_INSN(),
2491		},
2492		INTERNAL,
2493		{ },
2494		{ { 0, 4294967295U } },
2495	},
2496	{
2497		"ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
2498		.u.insns_int = {
2499			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2500			BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
2501			BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
2502			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2503			BPF_MOV32_IMM(R0, 2),
2504			BPF_EXIT_INSN(),
2505			BPF_MOV32_IMM(R0, 1),
2506			BPF_EXIT_INSN(),
2507		},
2508		INTERNAL,
2509		{ },
2510		{ { 0, 0x1 } },
2511	},
2512	{
2513		"ALU64_MOV_K: dst = 2",
2514		.u.insns_int = {
2515			BPF_ALU64_IMM(BPF_MOV, R0, 2),
2516			BPF_EXIT_INSN(),
2517		},
2518		INTERNAL,
2519		{ },
2520		{ { 0, 2 } },
2521	},
2522	{
2523		"ALU64_MOV_K: dst = 2147483647",
2524		.u.insns_int = {
2525			BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
2526			BPF_EXIT_INSN(),
2527		},
2528		INTERNAL,
2529		{ },
2530		{ { 0, 2147483647 } },
2531	},
2532	{
2533		"ALU64_OR_K: dst = 0x0",
2534		.u.insns_int = {
2535			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2536			BPF_LD_IMM64(R3, 0x0),
2537			BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
2538			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2539			BPF_MOV32_IMM(R0, 2),
2540			BPF_EXIT_INSN(),
2541			BPF_MOV32_IMM(R0, 1),
2542			BPF_EXIT_INSN(),
2543		},
2544		INTERNAL,
2545		{ },
2546		{ { 0, 0x1 } },
2547	},
2548	{
2549		"ALU64_MOV_K: dst = -1",
2550		.u.insns_int = {
2551			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2552			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2553			BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
2554			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2555			BPF_MOV32_IMM(R0, 2),
2556			BPF_EXIT_INSN(),
2557			BPF_MOV32_IMM(R0, 1),
2558			BPF_EXIT_INSN(),
2559		},
2560		INTERNAL,
2561		{ },
2562		{ { 0, 0x1 } },
2563	},
2564	/* BPF_ALU | BPF_ADD | BPF_X */
2565	{
2566		"ALU_ADD_X: 1 + 2 = 3",
2567		.u.insns_int = {
2568			BPF_LD_IMM64(R0, 1),
2569			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2570			BPF_ALU32_REG(BPF_ADD, R0, R1),
2571			BPF_EXIT_INSN(),
2572		},
2573		INTERNAL,
2574		{ },
2575		{ { 0, 3 } },
2576	},
2577	{
2578		"ALU_ADD_X: 1 + 4294967294 = 4294967295",
2579		.u.insns_int = {
2580			BPF_LD_IMM64(R0, 1),
2581			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2582			BPF_ALU32_REG(BPF_ADD, R0, R1),
2583			BPF_EXIT_INSN(),
2584		},
2585		INTERNAL,
2586		{ },
2587		{ { 0, 4294967295U } },
2588	},
2589	{
2590		"ALU_ADD_X: 2 + 4294967294 = 0",
2591		.u.insns_int = {
2592			BPF_LD_IMM64(R0, 2),
2593			BPF_LD_IMM64(R1, 4294967294U),
2594			BPF_ALU32_REG(BPF_ADD, R0, R1),
2595			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2596			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2597			BPF_EXIT_INSN(),
2598			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2599			BPF_EXIT_INSN(),
2600		},
2601		INTERNAL,
2602		{ },
2603		{ { 0, 1 } },
2604	},
2605	{
2606		"ALU64_ADD_X: 1 + 2 = 3",
2607		.u.insns_int = {
2608			BPF_LD_IMM64(R0, 1),
2609			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2610			BPF_ALU64_REG(BPF_ADD, R0, R1),
2611			BPF_EXIT_INSN(),
2612		},
2613		INTERNAL,
2614		{ },
2615		{ { 0, 3 } },
2616	},
2617	{
2618		"ALU64_ADD_X: 1 + 4294967294 = 4294967295",
2619		.u.insns_int = {
2620			BPF_LD_IMM64(R0, 1),
2621			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2622			BPF_ALU64_REG(BPF_ADD, R0, R1),
2623			BPF_EXIT_INSN(),
2624		},
2625		INTERNAL,
2626		{ },
2627		{ { 0, 4294967295U } },
2628	},
2629	{
2630		"ALU64_ADD_X: 2 + 4294967294 = 4294967296",
2631		.u.insns_int = {
2632			BPF_LD_IMM64(R0, 2),
2633			BPF_LD_IMM64(R1, 4294967294U),
2634			BPF_LD_IMM64(R2, 4294967296ULL),
2635			BPF_ALU64_REG(BPF_ADD, R0, R1),
2636			BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
2637			BPF_MOV32_IMM(R0, 0),
2638			BPF_EXIT_INSN(),
2639			BPF_MOV32_IMM(R0, 1),
2640			BPF_EXIT_INSN(),
2641		},
2642		INTERNAL,
2643		{ },
2644		{ { 0, 1 } },
2645	},
2646	/* BPF_ALU | BPF_ADD | BPF_K */
2647	{
2648		"ALU_ADD_K: 1 + 2 = 3",
2649		.u.insns_int = {
2650			BPF_LD_IMM64(R0, 1),
2651			BPF_ALU32_IMM(BPF_ADD, R0, 2),
2652			BPF_EXIT_INSN(),
2653		},
2654		INTERNAL,
2655		{ },
2656		{ { 0, 3 } },
2657	},
2658	{
2659		"ALU_ADD_K: 3 + 0 = 3",
2660		.u.insns_int = {
2661			BPF_LD_IMM64(R0, 3),
2662			BPF_ALU32_IMM(BPF_ADD, R0, 0),
2663			BPF_EXIT_INSN(),
2664		},
2665		INTERNAL,
2666		{ },
2667		{ { 0, 3 } },
2668	},
2669	{
2670		"ALU_ADD_K: 1 + 4294967294 = 4294967295",
2671		.u.insns_int = {
2672			BPF_LD_IMM64(R0, 1),
2673			BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
2674			BPF_EXIT_INSN(),
2675		},
2676		INTERNAL,
2677		{ },
2678		{ { 0, 4294967295U } },
2679	},
2680	{
2681		"ALU_ADD_K: 4294967294 + 2 = 0",
2682		.u.insns_int = {
2683			BPF_LD_IMM64(R0, 4294967294U),
2684			BPF_ALU32_IMM(BPF_ADD, R0, 2),
2685			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2686			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2687			BPF_EXIT_INSN(),
2688			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2689			BPF_EXIT_INSN(),
2690		},
2691		INTERNAL,
2692		{ },
2693		{ { 0, 1 } },
2694	},
2695	{
2696		"ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
2697		.u.insns_int = {
2698			BPF_LD_IMM64(R2, 0x0),
2699			BPF_LD_IMM64(R3, 0x00000000ffffffff),
2700			BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
2701			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2702			BPF_MOV32_IMM(R0, 2),
2703			BPF_EXIT_INSN(),
2704			BPF_MOV32_IMM(R0, 1),
2705			BPF_EXIT_INSN(),
2706		},
2707		INTERNAL,
2708		{ },
2709		{ { 0, 0x1 } },
2710	},
2711	{
2712		"ALU_ADD_K: 0 + 0xffff = 0xffff",
2713		.u.insns_int = {
2714			BPF_LD_IMM64(R2, 0x0),
2715			BPF_LD_IMM64(R3, 0xffff),
2716			BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
2717			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2718			BPF_MOV32_IMM(R0, 2),
2719			BPF_EXIT_INSN(),
2720			BPF_MOV32_IMM(R0, 1),
2721			BPF_EXIT_INSN(),
2722		},
2723		INTERNAL,
2724		{ },
2725		{ { 0, 0x1 } },
2726	},
2727	{
2728		"ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
2729		.u.insns_int = {
2730			BPF_LD_IMM64(R2, 0x0),
2731			BPF_LD_IMM64(R3, 0x7fffffff),
2732			BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
2733			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2734			BPF_MOV32_IMM(R0, 2),
2735			BPF_EXIT_INSN(),
2736			BPF_MOV32_IMM(R0, 1),
2737			BPF_EXIT_INSN(),
2738		},
2739		INTERNAL,
2740		{ },
2741		{ { 0, 0x1 } },
2742	},
2743	{
2744		"ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
2745		.u.insns_int = {
2746			BPF_LD_IMM64(R2, 0x0),
2747			BPF_LD_IMM64(R3, 0x80000000),
2748			BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
2749			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2750			BPF_MOV32_IMM(R0, 2),
2751			BPF_EXIT_INSN(),
2752			BPF_MOV32_IMM(R0, 1),
2753			BPF_EXIT_INSN(),
2754		},
2755		INTERNAL,
2756		{ },
2757		{ { 0, 0x1 } },
2758	},
2759	{
2760		"ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
2761		.u.insns_int = {
2762			BPF_LD_IMM64(R2, 0x0),
2763			BPF_LD_IMM64(R3, 0x80008000),
2764			BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
2765			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2766			BPF_MOV32_IMM(R0, 2),
2767			BPF_EXIT_INSN(),
2768			BPF_MOV32_IMM(R0, 1),
2769			BPF_EXIT_INSN(),
2770		},
2771		INTERNAL,
2772		{ },
2773		{ { 0, 0x1 } },
2774	},
2775	{
2776		"ALU64_ADD_K: 1 + 2 = 3",
2777		.u.insns_int = {
2778			BPF_LD_IMM64(R0, 1),
2779			BPF_ALU64_IMM(BPF_ADD, R0, 2),
2780			BPF_EXIT_INSN(),
2781		},
2782		INTERNAL,
2783		{ },
2784		{ { 0, 3 } },
2785	},
2786	{
2787		"ALU64_ADD_K: 3 + 0 = 3",
2788		.u.insns_int = {
2789			BPF_LD_IMM64(R0, 3),
2790			BPF_ALU64_IMM(BPF_ADD, R0, 0),
2791			BPF_EXIT_INSN(),
2792		},
2793		INTERNAL,
2794		{ },
2795		{ { 0, 3 } },
2796	},
2797	{
2798		"ALU64_ADD_K: 1 + 2147483646 = 2147483647",
2799		.u.insns_int = {
2800			BPF_LD_IMM64(R0, 1),
2801			BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
2802			BPF_EXIT_INSN(),
2803		},
2804		INTERNAL,
2805		{ },
2806		{ { 0, 2147483647 } },
2807	},
2808	{
2809		"ALU64_ADD_K: 4294967294 + 2 = 4294967296",
2810		.u.insns_int = {
2811			BPF_LD_IMM64(R0, 4294967294U),
2812			BPF_LD_IMM64(R1, 4294967296ULL),
2813			BPF_ALU64_IMM(BPF_ADD, R0, 2),
2814			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
2815			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2816			BPF_EXIT_INSN(),
2817			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2818			BPF_EXIT_INSN(),
2819		},
2820		INTERNAL,
2821		{ },
2822		{ { 0, 1 } },
2823	},
2824	{
2825		"ALU64_ADD_K: 2147483646 + -2147483647 = -1",
2826		.u.insns_int = {
2827			BPF_LD_IMM64(R0, 2147483646),
2828			BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
2829			BPF_EXIT_INSN(),
2830		},
2831		INTERNAL,
2832		{ },
2833		{ { 0, -1 } },
2834	},
2835	{
2836		"ALU64_ADD_K: 1 + 0 = 1",
2837		.u.insns_int = {
2838			BPF_LD_IMM64(R2, 0x1),
2839			BPF_LD_IMM64(R3, 0x1),
2840			BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
2841			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2842			BPF_MOV32_IMM(R0, 2),
2843			BPF_EXIT_INSN(),
2844			BPF_MOV32_IMM(R0, 1),
2845			BPF_EXIT_INSN(),
2846		},
2847		INTERNAL,
2848		{ },
2849		{ { 0, 0x1 } },
2850	},
2851	{
2852		"ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
2853		.u.insns_int = {
2854			BPF_LD_IMM64(R2, 0x0),
2855			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2856			BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
2857			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2858			BPF_MOV32_IMM(R0, 2),
2859			BPF_EXIT_INSN(),
2860			BPF_MOV32_IMM(R0, 1),
2861			BPF_EXIT_INSN(),
2862		},
2863		INTERNAL,
2864		{ },
2865		{ { 0, 0x1 } },
2866	},
2867	{
2868		"ALU64_ADD_K: 0 + 0xffff = 0xffff",
2869		.u.insns_int = {
2870			BPF_LD_IMM64(R2, 0x0),
2871			BPF_LD_IMM64(R3, 0xffff),
2872			BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
2873			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2874			BPF_MOV32_IMM(R0, 2),
2875			BPF_EXIT_INSN(),
2876			BPF_MOV32_IMM(R0, 1),
2877			BPF_EXIT_INSN(),
2878		},
2879		INTERNAL,
2880		{ },
2881		{ { 0, 0x1 } },
2882	},
2883	{
2884		"ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
2885		.u.insns_int = {
2886			BPF_LD_IMM64(R2, 0x0),
2887			BPF_LD_IMM64(R3, 0x7fffffff),
2888			BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
2889			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2890			BPF_MOV32_IMM(R0, 2),
2891			BPF_EXIT_INSN(),
2892			BPF_MOV32_IMM(R0, 1),
2893			BPF_EXIT_INSN(),
2894		},
2895		INTERNAL,
2896		{ },
2897		{ { 0, 0x1 } },
2898	},
2899	{
2900		"ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
2901		.u.insns_int = {
2902			BPF_LD_IMM64(R2, 0x0),
2903			BPF_LD_IMM64(R3, 0xffffffff80000000LL),
2904			BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
2905			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2906			BPF_MOV32_IMM(R0, 2),
2907			BPF_EXIT_INSN(),
2908			BPF_MOV32_IMM(R0, 1),
2909			BPF_EXIT_INSN(),
2910		},
2911		INTERNAL,
2912		{ },
2913		{ { 0, 0x1 } },
2914	},
2915	{
2916		"ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
2917		.u.insns_int = {
2918			BPF_LD_IMM64(R2, 0x0),
2919			BPF_LD_IMM64(R3, 0xffffffff80008000LL),
2920			BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
2921			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2922			BPF_MOV32_IMM(R0, 2),
2923			BPF_EXIT_INSN(),
2924			BPF_MOV32_IMM(R0, 1),
2925			BPF_EXIT_INSN(),
2926		},
2927		INTERNAL,
2928		{ },
2929		{ { 0, 0x1 } },
2930	},
2931	/* BPF_ALU | BPF_SUB | BPF_X */
2932	{
2933		"ALU_SUB_X: 3 - 1 = 2",
2934		.u.insns_int = {
2935			BPF_LD_IMM64(R0, 3),
2936			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2937			BPF_ALU32_REG(BPF_SUB, R0, R1),
2938			BPF_EXIT_INSN(),
2939		},
2940		INTERNAL,
2941		{ },
2942		{ { 0, 2 } },
2943	},
2944	{
2945		"ALU_SUB_X: 4294967295 - 4294967294 = 1",
2946		.u.insns_int = {
2947			BPF_LD_IMM64(R0, 4294967295U),
2948			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2949			BPF_ALU32_REG(BPF_SUB, R0, R1),
2950			BPF_EXIT_INSN(),
2951		},
2952		INTERNAL,
2953		{ },
2954		{ { 0, 1 } },
2955	},
2956	{
2957		"ALU64_SUB_X: 3 - 1 = 2",
2958		.u.insns_int = {
2959			BPF_LD_IMM64(R0, 3),
2960			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2961			BPF_ALU64_REG(BPF_SUB, R0, R1),
2962			BPF_EXIT_INSN(),
2963		},
2964		INTERNAL,
2965		{ },
2966		{ { 0, 2 } },
2967	},
2968	{
2969		"ALU64_SUB_X: 4294967295 - 4294967294 = 1",
2970		.u.insns_int = {
2971			BPF_LD_IMM64(R0, 4294967295U),
2972			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2973			BPF_ALU64_REG(BPF_SUB, R0, R1),
2974			BPF_EXIT_INSN(),
2975		},
2976		INTERNAL,
2977		{ },
2978		{ { 0, 1 } },
2979	},
2980	/* BPF_ALU | BPF_SUB | BPF_K */
2981	{
2982		"ALU_SUB_K: 3 - 1 = 2",
2983		.u.insns_int = {
2984			BPF_LD_IMM64(R0, 3),
2985			BPF_ALU32_IMM(BPF_SUB, R0, 1),
2986			BPF_EXIT_INSN(),
2987		},
2988		INTERNAL,
2989		{ },
2990		{ { 0, 2 } },
2991	},
2992	{
2993		"ALU_SUB_K: 3 - 0 = 3",
2994		.u.insns_int = {
2995			BPF_LD_IMM64(R0, 3),
2996			BPF_ALU32_IMM(BPF_SUB, R0, 0),
2997			BPF_EXIT_INSN(),
2998		},
2999		INTERNAL,
3000		{ },
3001		{ { 0, 3 } },
3002	},
3003	{
3004		"ALU_SUB_K: 4294967295 - 4294967294 = 1",
3005		.u.insns_int = {
3006			BPF_LD_IMM64(R0, 4294967295U),
3007			BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
3008			BPF_EXIT_INSN(),
3009		},
3010		INTERNAL,
3011		{ },
3012		{ { 0, 1 } },
3013	},
3014	{
3015		"ALU64_SUB_K: 3 - 1 = 2",
3016		.u.insns_int = {
3017			BPF_LD_IMM64(R0, 3),
3018			BPF_ALU64_IMM(BPF_SUB, R0, 1),
3019			BPF_EXIT_INSN(),
3020		},
3021		INTERNAL,
3022		{ },
3023		{ { 0, 2 } },
3024	},
3025	{
3026		"ALU64_SUB_K: 3 - 0 = 3",
3027		.u.insns_int = {
3028			BPF_LD_IMM64(R0, 3),
3029			BPF_ALU64_IMM(BPF_SUB, R0, 0),
3030			BPF_EXIT_INSN(),
3031		},
3032		INTERNAL,
3033		{ },
3034		{ { 0, 3 } },
3035	},
3036	{
3037		"ALU64_SUB_K: 4294967294 - 4294967295 = -1",
3038		.u.insns_int = {
3039			BPF_LD_IMM64(R0, 4294967294U),
3040			BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
3041			BPF_EXIT_INSN(),
3042		},
3043		INTERNAL,
3044		{ },
3045		{ { 0, -1 } },
3046	},
3047	{
3048		"ALU64_ADD_K: 2147483646 - 2147483647 = -1",
3049		.u.insns_int = {
3050			BPF_LD_IMM64(R0, 2147483646),
3051			BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
3052			BPF_EXIT_INSN(),
3053		},
3054		INTERNAL,
3055		{ },
3056		{ { 0, -1 } },
3057	},
3058	/* BPF_ALU | BPF_MUL | BPF_X */
3059	{
3060		"ALU_MUL_X: 2 * 3 = 6",
3061		.u.insns_int = {
3062			BPF_LD_IMM64(R0, 2),
3063			BPF_ALU32_IMM(BPF_MOV, R1, 3),
3064			BPF_ALU32_REG(BPF_MUL, R0, R1),
3065			BPF_EXIT_INSN(),
3066		},
3067		INTERNAL,
3068		{ },
3069		{ { 0, 6 } },
3070	},
3071	{
3072		"ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
3073		.u.insns_int = {
3074			BPF_LD_IMM64(R0, 2),
3075			BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
3076			BPF_ALU32_REG(BPF_MUL, R0, R1),
3077			BPF_EXIT_INSN(),
3078		},
3079		INTERNAL,
3080		{ },
3081		{ { 0, 0xFFFFFFF0 } },
3082	},
3083	{
3084		"ALU_MUL_X: -1 * -1 = 1",
3085		.u.insns_int = {
3086			BPF_LD_IMM64(R0, -1),
3087			BPF_ALU32_IMM(BPF_MOV, R1, -1),
3088			BPF_ALU32_REG(BPF_MUL, R0, R1),
3089			BPF_EXIT_INSN(),
3090		},
3091		INTERNAL,
3092		{ },
3093		{ { 0, 1 } },
3094	},
3095	{
3096		"ALU64_MUL_X: 2 * 3 = 6",
3097		.u.insns_int = {
3098			BPF_LD_IMM64(R0, 2),
3099			BPF_ALU32_IMM(BPF_MOV, R1, 3),
3100			BPF_ALU64_REG(BPF_MUL, R0, R1),
3101			BPF_EXIT_INSN(),
3102		},
3103		INTERNAL,
3104		{ },
3105		{ { 0, 6 } },
3106	},
3107	{
3108		"ALU64_MUL_X: 1 * 2147483647 = 2147483647",
3109		.u.insns_int = {
3110			BPF_LD_IMM64(R0, 1),
3111			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
3112			BPF_ALU64_REG(BPF_MUL, R0, R1),
3113			BPF_EXIT_INSN(),
3114		},
3115		INTERNAL,
3116		{ },
3117		{ { 0, 2147483647 } },
3118	},
3119	/* BPF_ALU | BPF_MUL | BPF_K */
3120	{
3121		"ALU_MUL_K: 2 * 3 = 6",
3122		.u.insns_int = {
3123			BPF_LD_IMM64(R0, 2),
3124			BPF_ALU32_IMM(BPF_MUL, R0, 3),
3125			BPF_EXIT_INSN(),
3126		},
3127		INTERNAL,
3128		{ },
3129		{ { 0, 6 } },
3130	},
3131	{
3132		"ALU_MUL_K: 3 * 1 = 3",
3133		.u.insns_int = {
3134			BPF_LD_IMM64(R0, 3),
3135			BPF_ALU32_IMM(BPF_MUL, R0, 1),
3136			BPF_EXIT_INSN(),
3137		},
3138		INTERNAL,
3139		{ },
3140		{ { 0, 3 } },
3141	},
3142	{
3143		"ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
3144		.u.insns_int = {
3145			BPF_LD_IMM64(R0, 2),
3146			BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
3147			BPF_EXIT_INSN(),
3148		},
3149		INTERNAL,
3150		{ },
3151		{ { 0, 0xFFFFFFF0 } },
3152	},
3153	{
3154		"ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
3155		.u.insns_int = {
3156			BPF_LD_IMM64(R2, 0x1),
3157			BPF_LD_IMM64(R3, 0x00000000ffffffff),
3158			BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
3159			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3160			BPF_MOV32_IMM(R0, 2),
3161			BPF_EXIT_INSN(),
3162			BPF_MOV32_IMM(R0, 1),
3163			BPF_EXIT_INSN(),
3164		},
3165		INTERNAL,
3166		{ },
3167		{ { 0, 0x1 } },
3168	},
3169	{
3170		"ALU64_MUL_K: 2 * 3 = 6",
3171		.u.insns_int = {
3172			BPF_LD_IMM64(R0, 2),
3173			BPF_ALU64_IMM(BPF_MUL, R0, 3),
3174			BPF_EXIT_INSN(),
3175		},
3176		INTERNAL,
3177		{ },
3178		{ { 0, 6 } },
3179	},
3180	{
3181		"ALU64_MUL_K: 3 * 1 = 3",
3182		.u.insns_int = {
3183			BPF_LD_IMM64(R0, 3),
3184			BPF_ALU64_IMM(BPF_MUL, R0, 1),
3185			BPF_EXIT_INSN(),
3186		},
3187		INTERNAL,
3188		{ },
3189		{ { 0, 3 } },
3190	},
3191	{
3192		"ALU64_MUL_K: 1 * 2147483647 = 2147483647",
3193		.u.insns_int = {
3194			BPF_LD_IMM64(R0, 1),
3195			BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
3196			BPF_EXIT_INSN(),
3197		},
3198		INTERNAL,
3199		{ },
3200		{ { 0, 2147483647 } },
3201	},
3202	{
3203		"ALU64_MUL_K: 1 * -2147483647 = -2147483647",
3204		.u.insns_int = {
3205			BPF_LD_IMM64(R0, 1),
3206			BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
3207			BPF_EXIT_INSN(),
3208		},
3209		INTERNAL,
3210		{ },
3211		{ { 0, -2147483647 } },
3212	},
3213	{
3214		"ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
3215		.u.insns_int = {
3216			BPF_LD_IMM64(R2, 0x1),
3217			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3218			BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
3219			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3220			BPF_MOV32_IMM(R0, 2),
3221			BPF_EXIT_INSN(),
3222			BPF_MOV32_IMM(R0, 1),
3223			BPF_EXIT_INSN(),
3224		},
3225		INTERNAL,
3226		{ },
3227		{ { 0, 0x1 } },
3228	},
3229	/* BPF_ALU | BPF_DIV | BPF_X */
3230	{
3231		"ALU_DIV_X: 6 / 2 = 3",
3232		.u.insns_int = {
3233			BPF_LD_IMM64(R0, 6),
3234			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3235			BPF_ALU32_REG(BPF_DIV, R0, R1),
3236			BPF_EXIT_INSN(),
3237		},
3238		INTERNAL,
3239		{ },
3240		{ { 0, 3 } },
3241	},
3242	{
3243		"ALU_DIV_X: 4294967295 / 4294967295 = 1",
3244		.u.insns_int = {
3245			BPF_LD_IMM64(R0, 4294967295U),
3246			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
3247			BPF_ALU32_REG(BPF_DIV, R0, R1),
3248			BPF_EXIT_INSN(),
3249		},
3250		INTERNAL,
3251		{ },
3252		{ { 0, 1 } },
3253	},
3254	{
3255		"ALU64_DIV_X: 6 / 2 = 3",
3256		.u.insns_int = {
3257			BPF_LD_IMM64(R0, 6),
3258			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3259			BPF_ALU64_REG(BPF_DIV, R0, R1),
3260			BPF_EXIT_INSN(),
3261		},
3262		INTERNAL,
3263		{ },
3264		{ { 0, 3 } },
3265	},
3266	{
3267		"ALU64_DIV_X: 2147483647 / 2147483647 = 1",
3268		.u.insns_int = {
3269			BPF_LD_IMM64(R0, 2147483647),
3270			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
3271			BPF_ALU64_REG(BPF_DIV, R0, R1),
3272			BPF_EXIT_INSN(),
3273		},
3274		INTERNAL,
3275		{ },
3276		{ { 0, 1 } },
3277	},
3278	{
3279		"ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3280		.u.insns_int = {
3281			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3282			BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
3283			BPF_LD_IMM64(R3, 0x0000000000000001LL),
3284			BPF_ALU64_REG(BPF_DIV, R2, R4),
3285			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3286			BPF_MOV32_IMM(R0, 2),
3287			BPF_EXIT_INSN(),
3288			BPF_MOV32_IMM(R0, 1),
3289			BPF_EXIT_INSN(),
3290		},
3291		INTERNAL,
3292		{ },
3293		{ { 0, 0x1 } },
3294	},
3295	/* BPF_ALU | BPF_DIV | BPF_K */
3296	{
3297		"ALU_DIV_K: 6 / 2 = 3",
3298		.u.insns_int = {
3299			BPF_LD_IMM64(R0, 6),
3300			BPF_ALU32_IMM(BPF_DIV, R0, 2),
3301			BPF_EXIT_INSN(),
3302		},
3303		INTERNAL,
3304		{ },
3305		{ { 0, 3 } },
3306	},
3307	{
3308		"ALU_DIV_K: 3 / 1 = 3",
3309		.u.insns_int = {
3310			BPF_LD_IMM64(R0, 3),
3311			BPF_ALU32_IMM(BPF_DIV, R0, 1),
3312			BPF_EXIT_INSN(),
3313		},
3314		INTERNAL,
3315		{ },
3316		{ { 0, 3 } },
3317	},
3318	{
3319		"ALU_DIV_K: 4294967295 / 4294967295 = 1",
3320		.u.insns_int = {
3321			BPF_LD_IMM64(R0, 4294967295U),
3322			BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
3323			BPF_EXIT_INSN(),
3324		},
3325		INTERNAL,
3326		{ },
3327		{ { 0, 1 } },
3328	},
3329	{
3330		"ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
3331		.u.insns_int = {
3332			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3333			BPF_LD_IMM64(R3, 0x1UL),
3334			BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
3335			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3336			BPF_MOV32_IMM(R0, 2),
3337			BPF_EXIT_INSN(),
3338			BPF_MOV32_IMM(R0, 1),
3339			BPF_EXIT_INSN(),
3340		},
3341		INTERNAL,
3342		{ },
3343		{ { 0, 0x1 } },
3344	},
3345	{
3346		"ALU64_DIV_K: 6 / 2 = 3",
3347		.u.insns_int = {
3348			BPF_LD_IMM64(R0, 6),
3349			BPF_ALU64_IMM(BPF_DIV, R0, 2),
3350			BPF_EXIT_INSN(),
3351		},
3352		INTERNAL,
3353		{ },
3354		{ { 0, 3 } },
3355	},
3356	{
3357		"ALU64_DIV_K: 3 / 1 = 3",
3358		.u.insns_int = {
3359			BPF_LD_IMM64(R0, 3),
3360			BPF_ALU64_IMM(BPF_DIV, R0, 1),
3361			BPF_EXIT_INSN(),
3362		},
3363		INTERNAL,
3364		{ },
3365		{ { 0, 3 } },
3366	},
3367	{
3368		"ALU64_DIV_K: 2147483647 / 2147483647 = 1",
3369		.u.insns_int = {
3370			BPF_LD_IMM64(R0, 2147483647),
3371			BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
3372			BPF_EXIT_INSN(),
3373		},
3374		INTERNAL,
3375		{ },
3376		{ { 0, 1 } },
3377	},
3378	{
3379		"ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3380		.u.insns_int = {
3381			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3382			BPF_LD_IMM64(R3, 0x0000000000000001LL),
3383			BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
3384			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3385			BPF_MOV32_IMM(R0, 2),
3386			BPF_EXIT_INSN(),
3387			BPF_MOV32_IMM(R0, 1),
3388			BPF_EXIT_INSN(),
3389		},
3390		INTERNAL,
3391		{ },
3392		{ { 0, 0x1 } },
3393	},
3394	/* BPF_ALU | BPF_MOD | BPF_X */
3395	{
3396		"ALU_MOD_X: 3 % 2 = 1",
3397		.u.insns_int = {
3398			BPF_LD_IMM64(R0, 3),
3399			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3400			BPF_ALU32_REG(BPF_MOD, R0, R1),
3401			BPF_EXIT_INSN(),
3402		},
3403		INTERNAL,
3404		{ },
3405		{ { 0, 1 } },
3406	},
3407	{
3408		"ALU_MOD_X: 4294967295 % 4294967293 = 2",
3409		.u.insns_int = {
3410			BPF_LD_IMM64(R0, 4294967295U),
3411			BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
3412			BPF_ALU32_REG(BPF_MOD, R0, R1),
3413			BPF_EXIT_INSN(),
3414		},
3415		INTERNAL,
3416		{ },
3417		{ { 0, 2 } },
3418	},
3419	{
3420		"ALU64_MOD_X: 3 % 2 = 1",
3421		.u.insns_int = {
3422			BPF_LD_IMM64(R0, 3),
3423			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3424			BPF_ALU64_REG(BPF_MOD, R0, R1),
3425			BPF_EXIT_INSN(),
3426		},
3427		INTERNAL,
3428		{ },
3429		{ { 0, 1 } },
3430	},
3431	{
3432		"ALU64_MOD_X: 2147483647 % 2147483645 = 2",
3433		.u.insns_int = {
3434			BPF_LD_IMM64(R0, 2147483647),
3435			BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
3436			BPF_ALU64_REG(BPF_MOD, R0, R1),
3437			BPF_EXIT_INSN(),
3438		},
3439		INTERNAL,
3440		{ },
3441		{ { 0, 2 } },
3442	},
3443	/* BPF_ALU | BPF_MOD | BPF_K */
3444	{
3445		"ALU_MOD_K: 3 % 2 = 1",
3446		.u.insns_int = {
3447			BPF_LD_IMM64(R0, 3),
3448			BPF_ALU32_IMM(BPF_MOD, R0, 2),
3449			BPF_EXIT_INSN(),
3450		},
3451		INTERNAL,
3452		{ },
3453		{ { 0, 1 } },
3454	},
3455	{
3456		"ALU_MOD_K: 3 % 1 = 0",
3457		.u.insns_int = {
3458			BPF_LD_IMM64(R0, 3),
3459			BPF_ALU32_IMM(BPF_MOD, R0, 1),
3460			BPF_EXIT_INSN(),
3461		},
3462		INTERNAL,
3463		{ },
3464		{ { 0, 0 } },
3465	},
3466	{
3467		"ALU_MOD_K: 4294967295 % 4294967293 = 2",
3468		.u.insns_int = {
3469			BPF_LD_IMM64(R0, 4294967295U),
3470			BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
3471			BPF_EXIT_INSN(),
3472		},
3473		INTERNAL,
3474		{ },
3475		{ { 0, 2 } },
3476	},
3477	{
3478		"ALU64_MOD_K: 3 % 2 = 1",
3479		.u.insns_int = {
3480			BPF_LD_IMM64(R0, 3),
3481			BPF_ALU64_IMM(BPF_MOD, R0, 2),
3482			BPF_EXIT_INSN(),
3483		},
3484		INTERNAL,
3485		{ },
3486		{ { 0, 1 } },
3487	},
3488	{
3489		"ALU64_MOD_K: 3 % 1 = 0",
3490		.u.insns_int = {
3491			BPF_LD_IMM64(R0, 3),
3492			BPF_ALU64_IMM(BPF_MOD, R0, 1),
3493			BPF_EXIT_INSN(),
3494		},
3495		INTERNAL,
3496		{ },
3497		{ { 0, 0 } },
3498	},
3499	{
3500		"ALU64_MOD_K: 2147483647 % 2147483645 = 2",
3501		.u.insns_int = {
3502			BPF_LD_IMM64(R0, 2147483647),
3503			BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
3504			BPF_EXIT_INSN(),
3505		},
3506		INTERNAL,
3507		{ },
3508		{ { 0, 2 } },
3509	},
3510	/* BPF_ALU | BPF_AND | BPF_X */
3511	{
3512		"ALU_AND_X: 3 & 2 = 2",
3513		.u.insns_int = {
3514			BPF_LD_IMM64(R0, 3),
3515			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3516			BPF_ALU32_REG(BPF_AND, R0, R1),
3517			BPF_EXIT_INSN(),
3518		},
3519		INTERNAL,
3520		{ },
3521		{ { 0, 2 } },
3522	},
3523	{
3524		"ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3525		.u.insns_int = {
3526			BPF_LD_IMM64(R0, 0xffffffff),
3527			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3528			BPF_ALU32_REG(BPF_AND, R0, R1),
3529			BPF_EXIT_INSN(),
3530		},
3531		INTERNAL,
3532		{ },
3533		{ { 0, 0xffffffff } },
3534	},
3535	{
3536		"ALU64_AND_X: 3 & 2 = 2",
3537		.u.insns_int = {
3538			BPF_LD_IMM64(R0, 3),
3539			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3540			BPF_ALU64_REG(BPF_AND, R0, R1),
3541			BPF_EXIT_INSN(),
3542		},
3543		INTERNAL,
3544		{ },
3545		{ { 0, 2 } },
3546	},
3547	{
3548		"ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3549		.u.insns_int = {
3550			BPF_LD_IMM64(R0, 0xffffffff),
3551			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3552			BPF_ALU64_REG(BPF_AND, R0, R1),
3553			BPF_EXIT_INSN(),
3554		},
3555		INTERNAL,
3556		{ },
3557		{ { 0, 0xffffffff } },
3558	},
3559	/* BPF_ALU | BPF_AND | BPF_K */
3560	{
3561		"ALU_AND_K: 3 & 2 = 2",
3562		.u.insns_int = {
3563			BPF_LD_IMM64(R0, 3),
3564			BPF_ALU32_IMM(BPF_AND, R0, 2),
3565			BPF_EXIT_INSN(),
3566		},
3567		INTERNAL,
3568		{ },
3569		{ { 0, 2 } },
3570	},
3571	{
3572		"ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3573		.u.insns_int = {
3574			BPF_LD_IMM64(R0, 0xffffffff),
3575			BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
3576			BPF_EXIT_INSN(),
3577		},
3578		INTERNAL,
3579		{ },
3580		{ { 0, 0xffffffff } },
3581	},
3582	{
3583		"ALU64_AND_K: 3 & 2 = 2",
3584		.u.insns_int = {
3585			BPF_LD_IMM64(R0, 3),
3586			BPF_ALU64_IMM(BPF_AND, R0, 2),
3587			BPF_EXIT_INSN(),
3588		},
3589		INTERNAL,
3590		{ },
3591		{ { 0, 2 } },
3592	},
3593	{
3594		"ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3595		.u.insns_int = {
3596			BPF_LD_IMM64(R0, 0xffffffff),
3597			BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
3598			BPF_EXIT_INSN(),
3599		},
3600		INTERNAL,
3601		{ },
3602		{ { 0, 0xffffffff } },
3603	},
3604	{
3605		"ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000ffff00000000",
3606		.u.insns_int = {
3607			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3608			BPF_LD_IMM64(R3, 0x0000000000000000LL),
3609			BPF_ALU64_IMM(BPF_AND, R2, 0x0),
3610			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3611			BPF_MOV32_IMM(R0, 2),
3612			BPF_EXIT_INSN(),
3613			BPF_MOV32_IMM(R0, 1),
3614			BPF_EXIT_INSN(),
3615		},
3616		INTERNAL,
3617		{ },
3618		{ { 0, 0x1 } },
3619	},
3620	{
3621		"ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffffffff",
3622		.u.insns_int = {
3623			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3624			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3625			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3626			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3627			BPF_MOV32_IMM(R0, 2),
3628			BPF_EXIT_INSN(),
3629			BPF_MOV32_IMM(R0, 1),
3630			BPF_EXIT_INSN(),
3631		},
3632		INTERNAL,
3633		{ },
3634		{ { 0, 0x1 } },
3635	},
3636	{
3637		"ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
3638		.u.insns_int = {
3639			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3640			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3641			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3642			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3643			BPF_MOV32_IMM(R0, 2),
3644			BPF_EXIT_INSN(),
3645			BPF_MOV32_IMM(R0, 1),
3646			BPF_EXIT_INSN(),
3647		},
3648		INTERNAL,
3649		{ },
3650		{ { 0, 0x1 } },
3651	},
3652	/* BPF_ALU | BPF_OR | BPF_X */
3653	{
3654		"ALU_OR_X: 1 | 2 = 3",
3655		.u.insns_int = {
3656			BPF_LD_IMM64(R0, 1),
3657			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3658			BPF_ALU32_REG(BPF_OR, R0, R1),
3659			BPF_EXIT_INSN(),
3660		},
3661		INTERNAL,
3662		{ },
3663		{ { 0, 3 } },
3664	},
3665	{
3666		"ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
3667		.u.insns_int = {
3668			BPF_LD_IMM64(R0, 0),
3669			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3670			BPF_ALU32_REG(BPF_OR, R0, R1),
3671			BPF_EXIT_INSN(),
3672		},
3673		INTERNAL,
3674		{ },
3675		{ { 0, 0xffffffff } },
3676	},
3677	{
3678		"ALU64_OR_X: 1 | 2 = 3",
3679		.u.insns_int = {
3680			BPF_LD_IMM64(R0, 1),
3681			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3682			BPF_ALU64_REG(BPF_OR, R0, R1),
3683			BPF_EXIT_INSN(),
3684		},
3685		INTERNAL,
3686		{ },
3687		{ { 0, 3 } },
3688	},
3689	{
3690		"ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
3691		.u.insns_int = {
3692			BPF_LD_IMM64(R0, 0),
3693			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3694			BPF_ALU64_REG(BPF_OR, R0, R1),
3695			BPF_EXIT_INSN(),
3696		},
3697		INTERNAL,
3698		{ },
3699		{ { 0, 0xffffffff } },
3700	},
3701	/* BPF_ALU | BPF_OR | BPF_K */
3702	{
3703		"ALU_OR_K: 1 | 2 = 3",
3704		.u.insns_int = {
3705			BPF_LD_IMM64(R0, 1),
3706			BPF_ALU32_IMM(BPF_OR, R0, 2),
3707			BPF_EXIT_INSN(),
3708		},
3709		INTERNAL,
3710		{ },
3711		{ { 0, 3 } },
3712	},
3713	{
3714		"ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
3715		.u.insns_int = {
3716			BPF_LD_IMM64(R0, 0),
3717			BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
3718			BPF_EXIT_INSN(),
3719		},
3720		INTERNAL,
3721		{ },
3722		{ { 0, 0xffffffff } },
3723	},
3724	{
3725		"ALU64_OR_K: 1 | 2 = 3",
3726		.u.insns_int = {
3727			BPF_LD_IMM64(R0, 1),
3728			BPF_ALU64_IMM(BPF_OR, R0, 2),
3729			BPF_EXIT_INSN(),
3730		},
3731		INTERNAL,
3732		{ },
3733		{ { 0, 3 } },
3734	},
3735	{
3736		"ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
3737		.u.insns_int = {
3738			BPF_LD_IMM64(R0, 0),
3739			BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
3740			BPF_EXIT_INSN(),
3741		},
3742		INTERNAL,
3743		{ },
3744		{ { 0, 0xffffffff } },
3745	},
3746	{
3747		"ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffff00000000",
3748		.u.insns_int = {
3749			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3750			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3751			BPF_ALU64_IMM(BPF_OR, R2, 0x0),
3752			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3753			BPF_MOV32_IMM(R0, 2),
3754			BPF_EXIT_INSN(),
3755			BPF_MOV32_IMM(R0, 1),
3756			BPF_EXIT_INSN(),
3757		},
3758		INTERNAL,
3759		{ },
3760		{ { 0, 0x1 } },
3761	},
3762	{
3763		"ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
3764		.u.insns_int = {
3765			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3766			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3767			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3768			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3769			BPF_MOV32_IMM(R0, 2),
3770			BPF_EXIT_INSN(),
3771			BPF_MOV32_IMM(R0, 1),
3772			BPF_EXIT_INSN(),
3773		},
3774		INTERNAL,
3775		{ },
3776		{ { 0, 0x1 } },
3777	},
3778	{
3779		"ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
3780		.u.insns_int = {
3781			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3782			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3783			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3784			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3785			BPF_MOV32_IMM(R0, 2),
3786			BPF_EXIT_INSN(),
3787			BPF_MOV32_IMM(R0, 1),
3788			BPF_EXIT_INSN(),
3789		},
3790		INTERNAL,
3791		{ },
3792		{ { 0, 0x1 } },
3793	},
3794	/* BPF_ALU | BPF_XOR | BPF_X */
3795	{
3796		"ALU_XOR_X: 5 ^ 6 = 3",
3797		.u.insns_int = {
3798			BPF_LD_IMM64(R0, 5),
3799			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3800			BPF_ALU32_REG(BPF_XOR, R0, R1),
3801			BPF_EXIT_INSN(),
3802		},
3803		INTERNAL,
3804		{ },
3805		{ { 0, 3 } },
3806	},
3807	{
3808		"ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
3809		.u.insns_int = {
3810			BPF_LD_IMM64(R0, 1),
3811			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3812			BPF_ALU32_REG(BPF_XOR, R0, R1),
3813			BPF_EXIT_INSN(),
3814		},
3815		INTERNAL,
3816		{ },
3817		{ { 0, 0xfffffffe } },
3818	},
3819	{
3820		"ALU64_XOR_X: 5 ^ 6 = 3",
3821		.u.insns_int = {
3822			BPF_LD_IMM64(R0, 5),
3823			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3824			BPF_ALU64_REG(BPF_XOR, R0, R1),
3825			BPF_EXIT_INSN(),
3826		},
3827		INTERNAL,
3828		{ },
3829		{ { 0, 3 } },
3830	},
3831	{
3832		"ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
3833		.u.insns_int = {
3834			BPF_LD_IMM64(R0, 1),
3835			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3836			BPF_ALU64_REG(BPF_XOR, R0, R1),
3837			BPF_EXIT_INSN(),
3838		},
3839		INTERNAL,
3840		{ },
3841		{ { 0, 0xfffffffe } },
3842	},
3843	/* BPF_ALU | BPF_XOR | BPF_K */
3844	{
3845		"ALU_XOR_K: 5 ^ 6 = 3",
3846		.u.insns_int = {
3847			BPF_LD_IMM64(R0, 5),
3848			BPF_ALU32_IMM(BPF_XOR, R0, 6),
3849			BPF_EXIT_INSN(),
3850		},
3851		INTERNAL,
3852		{ },
3853		{ { 0, 3 } },
3854	},
3855	{
3856		"ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
3857		.u.insns_int = {
3858			BPF_LD_IMM64(R0, 1),
3859			BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
3860			BPF_EXIT_INSN(),
3861		},
3862		INTERNAL,
3863		{ },
3864		{ { 0, 0xfffffffe } },
3865	},
3866	{
3867		"ALU64_XOR_K: 5 ^ 6 = 3",
3868		.u.insns_int = {
3869			BPF_LD_IMM64(R0, 5),
3870			BPF_ALU64_IMM(BPF_XOR, R0, 6),
3871			BPF_EXIT_INSN(),
3872		},
3873		INTERNAL,
3874		{ },
3875		{ { 0, 3 } },
3876	},
3877	{
3878		"ALU64_XOR_K: 1 & 0xffffffff = 0xfffffffe",
3879		.u.insns_int = {
3880			BPF_LD_IMM64(R0, 1),
3881			BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
3882			BPF_EXIT_INSN(),
3883		},
3884		INTERNAL,
3885		{ },
3886		{ { 0, 0xfffffffe } },
3887	},
3888	{
3889		"ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
3890		.u.insns_int = {
3891			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3892			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3893			BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
3894			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3895			BPF_MOV32_IMM(R0, 2),
3896			BPF_EXIT_INSN(),
3897			BPF_MOV32_IMM(R0, 1),
3898			BPF_EXIT_INSN(),
3899		},
3900		INTERNAL,
3901		{ },
3902		{ { 0, 0x1 } },
3903	},
3904	{
3905		"ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
3906		.u.insns_int = {
3907			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3908			BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
3909			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3910			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3911			BPF_MOV32_IMM(R0, 2),
3912			BPF_EXIT_INSN(),
3913			BPF_MOV32_IMM(R0, 1),
3914			BPF_EXIT_INSN(),
3915		},
3916		INTERNAL,
3917		{ },
3918		{ { 0, 0x1 } },
3919	},
3920	{
3921		"ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
3922		.u.insns_int = {
3923			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3924			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3925			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3926			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3927			BPF_MOV32_IMM(R0, 2),
3928			BPF_EXIT_INSN(),
3929			BPF_MOV32_IMM(R0, 1),
3930			BPF_EXIT_INSN(),
3931		},
3932		INTERNAL,
3933		{ },
3934		{ { 0, 0x1 } },
3935	},
3936	/* BPF_ALU | BPF_LSH | BPF_X */
3937	{
3938		"ALU_LSH_X: 1 << 1 = 2",
3939		.u.insns_int = {
3940			BPF_LD_IMM64(R0, 1),
3941			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3942			BPF_ALU32_REG(BPF_LSH, R0, R1),
3943			BPF_EXIT_INSN(),
3944		},
3945		INTERNAL,
3946		{ },
3947		{ { 0, 2 } },
3948	},
3949	{
3950		"ALU_LSH_X: 1 << 31 = 0x80000000",
3951		.u.insns_int = {
3952			BPF_LD_IMM64(R0, 1),
3953			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3954			BPF_ALU32_REG(BPF_LSH, R0, R1),
3955			BPF_EXIT_INSN(),
3956		},
3957		INTERNAL,
3958		{ },
3959		{ { 0, 0x80000000 } },
3960	},
3961	{
3962		"ALU64_LSH_X: 1 << 1 = 2",
3963		.u.insns_int = {
3964			BPF_LD_IMM64(R0, 1),
3965			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3966			BPF_ALU64_REG(BPF_LSH, R0, R1),
3967			BPF_EXIT_INSN(),
3968		},
3969		INTERNAL,
3970		{ },
3971		{ { 0, 2 } },
3972	},
3973	{
3974		"ALU64_LSH_X: 1 << 31 = 0x80000000",
3975		.u.insns_int = {
3976			BPF_LD_IMM64(R0, 1),
3977			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3978			BPF_ALU64_REG(BPF_LSH, R0, R1),
3979			BPF_EXIT_INSN(),
3980		},
3981		INTERNAL,
3982		{ },
3983		{ { 0, 0x80000000 } },
3984	},
3985	/* BPF_ALU | BPF_LSH | BPF_K */
3986	{
3987		"ALU_LSH_K: 1 << 1 = 2",
3988		.u.insns_int = {
3989			BPF_LD_IMM64(R0, 1),
3990			BPF_ALU32_IMM(BPF_LSH, R0, 1),
3991			BPF_EXIT_INSN(),
3992		},
3993		INTERNAL,
3994		{ },
3995		{ { 0, 2 } },
3996	},
3997	{
3998		"ALU_LSH_K: 1 << 31 = 0x80000000",
3999		.u.insns_int = {
4000			BPF_LD_IMM64(R0, 1),
4001			BPF_ALU32_IMM(BPF_LSH, R0, 31),
4002			BPF_EXIT_INSN(),
4003		},
4004		INTERNAL,
4005		{ },
4006		{ { 0, 0x80000000 } },
4007	},
4008	{
4009		"ALU64_LSH_K: 1 << 1 = 2",
4010		.u.insns_int = {
4011			BPF_LD_IMM64(R0, 1),
4012			BPF_ALU64_IMM(BPF_LSH, R0, 1),
4013			BPF_EXIT_INSN(),
4014		},
4015		INTERNAL,
4016		{ },
4017		{ { 0, 2 } },
4018	},
4019	{
4020		"ALU64_LSH_K: 1 << 31 = 0x80000000",
4021		.u.insns_int = {
4022			BPF_LD_IMM64(R0, 1),
4023			BPF_ALU64_IMM(BPF_LSH, R0, 31),
4024			BPF_EXIT_INSN(),
4025		},
4026		INTERNAL,
4027		{ },
4028		{ { 0, 0x80000000 } },
4029	},
4030	/* BPF_ALU | BPF_RSH | BPF_X */
4031	{
4032		"ALU_RSH_X: 2 >> 1 = 1",
4033		.u.insns_int = {
4034			BPF_LD_IMM64(R0, 2),
4035			BPF_ALU32_IMM(BPF_MOV, R1, 1),
4036			BPF_ALU32_REG(BPF_RSH, R0, R1),
4037			BPF_EXIT_INSN(),
4038		},
4039		INTERNAL,
4040		{ },
4041		{ { 0, 1 } },
4042	},
4043	{
4044		"ALU_RSH_X: 0x80000000 >> 31 = 1",
4045		.u.insns_int = {
4046			BPF_LD_IMM64(R0, 0x80000000),
4047			BPF_ALU32_IMM(BPF_MOV, R1, 31),
4048			BPF_ALU32_REG(BPF_RSH, R0, R1),
4049			BPF_EXIT_INSN(),
4050		},
4051		INTERNAL,
4052		{ },
4053		{ { 0, 1 } },
4054	},
4055	{
4056		"ALU64_RSH_X: 2 >> 1 = 1",
4057		.u.insns_int = {
4058			BPF_LD_IMM64(R0, 2),
4059			BPF_ALU32_IMM(BPF_MOV, R1, 1),
4060			BPF_ALU64_REG(BPF_RSH, R0, R1),
4061			BPF_EXIT_INSN(),
4062		},
4063		INTERNAL,
4064		{ },
4065		{ { 0, 1 } },
4066	},
4067	{
4068		"ALU64_RSH_X: 0x80000000 >> 31 = 1",
4069		.u.insns_int = {
4070			BPF_LD_IMM64(R0, 0x80000000),
4071			BPF_ALU32_IMM(BPF_MOV, R1, 31),
4072			BPF_ALU64_REG(BPF_RSH, R0, R1),
4073			BPF_EXIT_INSN(),
4074		},
4075		INTERNAL,
4076		{ },
4077		{ { 0, 1 } },
4078	},
4079	/* BPF_ALU | BPF_RSH | BPF_K */
4080	{
4081		"ALU_RSH_K: 2 >> 1 = 1",
4082		.u.insns_int = {
4083			BPF_LD_IMM64(R0, 2),
4084			BPF_ALU32_IMM(BPF_RSH, R0, 1),
4085			BPF_EXIT_INSN(),
4086		},
4087		INTERNAL,
4088		{ },
4089		{ { 0, 1 } },
4090	},
4091	{
4092		"ALU_RSH_K: 0x80000000 >> 31 = 1",
4093		.u.insns_int = {
4094			BPF_LD_IMM64(R0, 0x80000000),
4095			BPF_ALU32_IMM(BPF_RSH, R0, 31),
4096			BPF_EXIT_INSN(),
4097		},
4098		INTERNAL,
4099		{ },
4100		{ { 0, 1 } },
4101	},
4102	{
4103		"ALU64_RSH_K: 2 >> 1 = 1",
4104		.u.insns_int = {
4105			BPF_LD_IMM64(R0, 2),
4106			BPF_ALU64_IMM(BPF_RSH, R0, 1),
4107			BPF_EXIT_INSN(),
4108		},
4109		INTERNAL,
4110		{ },
4111		{ { 0, 1 } },
4112	},
4113	{
4114		"ALU64_RSH_K: 0x80000000 >> 31 = 1",
4115		.u.insns_int = {
4116			BPF_LD_IMM64(R0, 0x80000000),
4117			BPF_ALU64_IMM(BPF_RSH, R0, 31),
4118			BPF_EXIT_INSN(),
4119		},
4120		INTERNAL,
4121		{ },
4122		{ { 0, 1 } },
4123	},
4124	/* BPF_ALU | BPF_ARSH | BPF_X */
4125	{
4126		"ALU_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
4127		.u.insns_int = {
4128			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
4129			BPF_ALU32_IMM(BPF_MOV, R1, 40),
4130			BPF_ALU64_REG(BPF_ARSH, R0, R1),
4131			BPF_EXIT_INSN(),
4132		},
4133		INTERNAL,
4134		{ },
4135		{ { 0, 0xffff00ff } },
4136	},
4137	/* BPF_ALU | BPF_ARSH | BPF_K */
4138	{
4139		"ALU_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
4140		.u.insns_int = {
4141			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
4142			BPF_ALU64_IMM(BPF_ARSH, R0, 40),
4143			BPF_EXIT_INSN(),
4144		},
4145		INTERNAL,
4146		{ },
4147		{ { 0, 0xffff00ff } },
4148	},
4149	/* BPF_ALU | BPF_NEG */
4150	{
4151		"ALU_NEG: -(3) = -3",
4152		.u.insns_int = {
4153			BPF_ALU32_IMM(BPF_MOV, R0, 3),
4154			BPF_ALU32_IMM(BPF_NEG, R0, 0),
4155			BPF_EXIT_INSN(),
4156		},
4157		INTERNAL,
4158		{ },
4159		{ { 0, -3 } },
4160	},
4161	{
4162		"ALU_NEG: -(-3) = 3",
4163		.u.insns_int = {
4164			BPF_ALU32_IMM(BPF_MOV, R0, -3),
4165			BPF_ALU32_IMM(BPF_NEG, R0, 0),
4166			BPF_EXIT_INSN(),
4167		},
4168		INTERNAL,
4169		{ },
4170		{ { 0, 3 } },
4171	},
4172	{
4173		"ALU64_NEG: -(3) = -3",
4174		.u.insns_int = {
4175			BPF_LD_IMM64(R0, 3),
4176			BPF_ALU64_IMM(BPF_NEG, R0, 0),
4177			BPF_EXIT_INSN(),
4178		},
4179		INTERNAL,
4180		{ },
4181		{ { 0, -3 } },
4182	},
4183	{
4184		"ALU64_NEG: -(-3) = 3",
4185		.u.insns_int = {
4186			BPF_LD_IMM64(R0, -3),
4187			BPF_ALU64_IMM(BPF_NEG, R0, 0),
4188			BPF_EXIT_INSN(),
4189		},
4190		INTERNAL,
4191		{ },
4192		{ { 0, 3 } },
4193	},
4194	/* BPF_ALU | BPF_END | BPF_FROM_BE */
4195	{
4196		"ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
4197		.u.insns_int = {
4198			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4199			BPF_ENDIAN(BPF_FROM_BE, R0, 16),
4200			BPF_EXIT_INSN(),
4201		},
4202		INTERNAL,
4203		{ },
4204		{ { 0,  cpu_to_be16(0xcdef) } },
4205	},
4206	{
4207		"ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
4208		.u.insns_int = {
4209			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4210			BPF_ENDIAN(BPF_FROM_BE, R0, 32),
4211			BPF_ALU64_REG(BPF_MOV, R1, R0),
4212			BPF_ALU64_IMM(BPF_RSH, R1, 32),
4213			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
4214			BPF_EXIT_INSN(),
4215		},
4216		INTERNAL,
4217		{ },
4218		{ { 0, cpu_to_be32(0x89abcdef) } },
4219	},
4220	{
4221		"ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
4222		.u.insns_int = {
4223			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4224			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
4225			BPF_EXIT_INSN(),
4226		},
4227		INTERNAL,
4228		{ },
4229		{ { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
4230	},
4231	/* BPF_ALU | BPF_END | BPF_FROM_LE */
4232	{
4233		"ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
4234		.u.insns_int = {
4235			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4236			BPF_ENDIAN(BPF_FROM_LE, R0, 16),
4237			BPF_EXIT_INSN(),
4238		},
4239		INTERNAL,
4240		{ },
4241		{ { 0, cpu_to_le16(0xcdef) } },
4242	},
4243	{
4244		"ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
4245		.u.insns_int = {
4246			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4247			BPF_ENDIAN(BPF_FROM_LE, R0, 32),
4248			BPF_ALU64_REG(BPF_MOV, R1, R0),
4249			BPF_ALU64_IMM(BPF_RSH, R1, 32),
4250			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
4251			BPF_EXIT_INSN(),
4252		},
4253		INTERNAL,
4254		{ },
4255		{ { 0, cpu_to_le32(0x89abcdef) } },
4256	},
4257	{
4258		"ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
4259		.u.insns_int = {
4260			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4261			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
4262			BPF_EXIT_INSN(),
4263		},
4264		INTERNAL,
4265		{ },
4266		{ { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
4267	},
4268	/* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
4269	{
4270		"ST_MEM_B: Store/Load byte: max negative",
4271		.u.insns_int = {
4272			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4273			BPF_ST_MEM(BPF_B, R10, -40, 0xff),
4274			BPF_LDX_MEM(BPF_B, R0, R10, -40),
4275			BPF_EXIT_INSN(),
4276		},
4277		INTERNAL,
4278		{ },
4279		{ { 0, 0xff } },
4280		.stack_depth = 40,
4281	},
4282	{
4283		"ST_MEM_B: Store/Load byte: max positive",
4284		.u.insns_int = {
4285			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4286			BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
4287			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4288			BPF_EXIT_INSN(),
4289		},
4290		INTERNAL,
4291		{ },
4292		{ { 0, 0x7f } },
4293		.stack_depth = 40,
4294	},
4295	{
4296		"STX_MEM_B: Store/Load byte: max negative",
4297		.u.insns_int = {
4298			BPF_LD_IMM64(R0, 0),
4299			BPF_LD_IMM64(R1, 0xffLL),
4300			BPF_STX_MEM(BPF_B, R10, R1, -40),
4301			BPF_LDX_MEM(BPF_B, R0, R10, -40),
4302			BPF_EXIT_INSN(),
4303		},
4304		INTERNAL,
4305		{ },
4306		{ { 0, 0xff } },
4307		.stack_depth = 40,
4308	},
4309	{
4310		"ST_MEM_H: Store/Load half word: max negative",
4311		.u.insns_int = {
4312			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4313			BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
4314			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4315			BPF_EXIT_INSN(),
4316		},
4317		INTERNAL,
4318		{ },
4319		{ { 0, 0xffff } },
4320		.stack_depth = 40,
4321	},
4322	{
4323		"ST_MEM_H: Store/Load half word: max positive",
4324		.u.insns_int = {
4325			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4326			BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
4327			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4328			BPF_EXIT_INSN(),
4329		},
4330		INTERNAL,
4331		{ },
4332		{ { 0, 0x7fff } },
4333		.stack_depth = 40,
4334	},
4335	{
4336		"STX_MEM_H: Store/Load half word: max negative",
4337		.u.insns_int = {
4338			BPF_LD_IMM64(R0, 0),
4339			BPF_LD_IMM64(R1, 0xffffLL),
4340			BPF_STX_MEM(BPF_H, R10, R1, -40),
4341			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4342			BPF_EXIT_INSN(),
4343		},
4344		INTERNAL,
4345		{ },
4346		{ { 0, 0xffff } },
4347		.stack_depth = 40,
4348	},
4349	{
4350		"ST_MEM_W: Store/Load word: max negative",
4351		.u.insns_int = {
4352			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4353			BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
4354			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4355			BPF_EXIT_INSN(),
4356		},
4357		INTERNAL,
4358		{ },
4359		{ { 0, 0xffffffff } },
4360		.stack_depth = 40,
4361	},
4362	{
4363		"ST_MEM_W: Store/Load word: max positive",
4364		.u.insns_int = {
4365			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4366			BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
4367			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4368			BPF_EXIT_INSN(),
4369		},
4370		INTERNAL,
4371		{ },
4372		{ { 0, 0x7fffffff } },
4373		.stack_depth = 40,
4374	},
4375	{
4376		"STX_MEM_W: Store/Load word: max negative",
4377		.u.insns_int = {
4378			BPF_LD_IMM64(R0, 0),
4379			BPF_LD_IMM64(R1, 0xffffffffLL),
4380			BPF_STX_MEM(BPF_W, R10, R1, -40),
4381			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4382			BPF_EXIT_INSN(),
4383		},
4384		INTERNAL,
4385		{ },
4386		{ { 0, 0xffffffff } },
4387		.stack_depth = 40,
4388	},
4389	{
4390		"ST_MEM_DW: Store/Load double word: max negative",
4391		.u.insns_int = {
4392			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4393			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4394			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4395			BPF_EXIT_INSN(),
4396		},
4397		INTERNAL,
4398		{ },
4399		{ { 0, 0xffffffff } },
4400		.stack_depth = 40,
4401	},
4402	{
4403		"ST_MEM_DW: Store/Load double word: max negative 2",
4404		.u.insns_int = {
4405			BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
4406			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4407			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4408			BPF_LDX_MEM(BPF_DW, R2, R10, -40),
4409			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4410			BPF_MOV32_IMM(R0, 2),
4411			BPF_EXIT_INSN(),
4412			BPF_MOV32_IMM(R0, 1),
4413			BPF_EXIT_INSN(),
4414		},
4415		INTERNAL,
4416		{ },
4417		{ { 0, 0x1 } },
4418		.stack_depth = 40,
4419	},
4420	{
4421		"ST_MEM_DW: Store/Load double word: max positive",
4422		.u.insns_int = {
4423			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4424			BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
4425			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4426			BPF_EXIT_INSN(),
4427		},
4428		INTERNAL,
4429		{ },
4430		{ { 0, 0x7fffffff } },
4431		.stack_depth = 40,
4432	},
4433	{
4434		"STX_MEM_DW: Store/Load double word: max negative",
4435		.u.insns_int = {
4436			BPF_LD_IMM64(R0, 0),
4437			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4438			BPF_STX_MEM(BPF_W, R10, R1, -40),
4439			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4440			BPF_EXIT_INSN(),
4441		},
4442		INTERNAL,
4443		{ },
4444		{ { 0, 0xffffffff } },
4445		.stack_depth = 40,
4446	},
4447	/* BPF_STX | BPF_XADD | BPF_W/DW */
4448	{
4449		"STX_XADD_W: Test: 0x12 + 0x10 = 0x22",
4450		.u.insns_int = {
4451			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4452			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4453			BPF_STX_XADD(BPF_W, R10, R0, -40),
4454			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4455			BPF_EXIT_INSN(),
4456		},
4457		INTERNAL,
4458		{ },
4459		{ { 0, 0x22 } },
4460		.stack_depth = 40,
4461	},
4462	{
4463		"STX_XADD_W: Test side-effects, r10: 0x12 + 0x10 = 0x22",
4464		.u.insns_int = {
4465			BPF_ALU64_REG(BPF_MOV, R1, R10),
4466			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4467			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4468			BPF_STX_XADD(BPF_W, R10, R0, -40),
4469			BPF_ALU64_REG(BPF_MOV, R0, R10),
4470			BPF_ALU64_REG(BPF_SUB, R0, R1),
4471			BPF_EXIT_INSN(),
4472		},
4473		INTERNAL,
4474		{ },
4475		{ { 0, 0 } },
4476		.stack_depth = 40,
4477	},
4478	{
4479		"STX_XADD_W: Test side-effects, r0: 0x12 + 0x10 = 0x22",
4480		.u.insns_int = {
4481			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4482			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4483			BPF_STX_XADD(BPF_W, R10, R0, -40),
4484			BPF_EXIT_INSN(),
4485		},
4486		INTERNAL,
4487		{ },
4488		{ { 0, 0x12 } },
4489		.stack_depth = 40,
4490	},
4491	{
4492		"STX_XADD_W: X + 1 + 1 + 1 + ...",
4493		{ },
4494		INTERNAL,
4495		{ },
4496		{ { 0, 4134 } },
4497		.fill_helper = bpf_fill_stxw,
4498	},
4499	{
4500		"STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
4501		.u.insns_int = {
4502			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4503			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4504			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4505			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4506			BPF_EXIT_INSN(),
4507		},
4508		INTERNAL,
4509		{ },
4510		{ { 0, 0x22 } },
4511		.stack_depth = 40,
4512	},
4513	{
4514		"STX_XADD_DW: Test side-effects, r10: 0x12 + 0x10 = 0x22",
4515		.u.insns_int = {
4516			BPF_ALU64_REG(BPF_MOV, R1, R10),
4517			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4518			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4519			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4520			BPF_ALU64_REG(BPF_MOV, R0, R10),
4521			BPF_ALU64_REG(BPF_SUB, R0, R1),
4522			BPF_EXIT_INSN(),
4523		},
4524		INTERNAL,
4525		{ },
4526		{ { 0, 0 } },
4527		.stack_depth = 40,
4528	},
4529	{
4530		"STX_XADD_DW: Test side-effects, r0: 0x12 + 0x10 = 0x22",
4531		.u.insns_int = {
4532			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4533			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4534			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4535			BPF_EXIT_INSN(),
4536		},
4537		INTERNAL,
4538		{ },
4539		{ { 0, 0x12 } },
4540		.stack_depth = 40,
4541	},
4542	{
4543		"STX_XADD_DW: X + 1 + 1 + 1 + ...",
4544		{ },
4545		INTERNAL,
4546		{ },
4547		{ { 0, 4134 } },
4548		.fill_helper = bpf_fill_stxdw,
4549	},
4550	/* BPF_JMP | BPF_EXIT */
4551	{
4552		"JMP_EXIT",
4553		.u.insns_int = {
4554			BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
4555			BPF_EXIT_INSN(),
4556			BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
4557		},
4558		INTERNAL,
4559		{ },
4560		{ { 0, 0x4711 } },
4561	},
4562	/* BPF_JMP | BPF_JA */
4563	{
4564		"JMP_JA: Unconditional jump: if (true) return 1",
4565		.u.insns_int = {
4566			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4567			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
4568			BPF_EXIT_INSN(),
4569			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4570			BPF_EXIT_INSN(),
4571		},
4572		INTERNAL,
4573		{ },
4574		{ { 0, 1 } },
4575	},
4576	/* BPF_JMP | BPF_JSLT | BPF_K */
4577	{
4578		"JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
4579		.u.insns_int = {
4580			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4581			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
4582			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
4583			BPF_EXIT_INSN(),
4584			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4585			BPF_EXIT_INSN(),
4586		},
4587		INTERNAL,
4588		{ },
4589		{ { 0, 1 } },
4590	},
4591	{
4592		"JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
4593		.u.insns_int = {
4594			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4595			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4596			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
4597			BPF_EXIT_INSN(),
4598			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4599			BPF_EXIT_INSN(),
4600		},
4601		INTERNAL,
4602		{ },
4603		{ { 0, 1 } },
4604	},
4605	/* BPF_JMP | BPF_JSGT | BPF_K */
4606	{
4607		"JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
4608		.u.insns_int = {
4609			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4610			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4611			BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
4612			BPF_EXIT_INSN(),
4613			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4614			BPF_EXIT_INSN(),
4615		},
4616		INTERNAL,
4617		{ },
4618		{ { 0, 1 } },
4619	},
4620	{
4621		"JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
4622		.u.insns_int = {
4623			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4624			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4625			BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
4626			BPF_EXIT_INSN(),
4627			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4628			BPF_EXIT_INSN(),
4629		},
4630		INTERNAL,
4631		{ },
4632		{ { 0, 1 } },
4633	},
4634	/* BPF_JMP | BPF_JSLE | BPF_K */
4635	{
4636		"JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
4637		.u.insns_int = {
4638			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4639			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
4640			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
4641			BPF_EXIT_INSN(),
4642			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4643			BPF_EXIT_INSN(),
4644		},
4645		INTERNAL,
4646		{ },
4647		{ { 0, 1 } },
4648	},
4649	{
4650		"JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
4651		.u.insns_int = {
4652			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4653			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4654			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
4655			BPF_EXIT_INSN(),
4656			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4657			BPF_EXIT_INSN(),
4658		},
4659		INTERNAL,
4660		{ },
4661		{ { 0, 1 } },
4662	},
4663	{
4664		"JMP_JSLE_K: Signed jump: value walk 1",
4665		.u.insns_int = {
4666			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4667			BPF_LD_IMM64(R1, 3),
4668			BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
4669			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4670			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
4671			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4672			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
4673			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4674			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
4675			BPF_EXIT_INSN(),		/* bad exit */
4676			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4677			BPF_EXIT_INSN(),
4678		},
4679		INTERNAL,
4680		{ },
4681		{ { 0, 1 } },
4682	},
4683	{
4684		"JMP_JSLE_K: Signed jump: value walk 2",
4685		.u.insns_int = {
4686			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4687			BPF_LD_IMM64(R1, 3),
4688			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
4689			BPF_ALU64_IMM(BPF_SUB, R1, 2),
4690			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
4691			BPF_ALU64_IMM(BPF_SUB, R1, 2),
4692			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
4693			BPF_EXIT_INSN(),		/* bad exit */
4694			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4695			BPF_EXIT_INSN(),
4696		},
4697		INTERNAL,
4698		{ },
4699		{ { 0, 1 } },
4700	},
4701	/* BPF_JMP | BPF_JSGE | BPF_K */
4702	{
4703		"JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
4704		.u.insns_int = {
4705			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4706			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4707			BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
4708			BPF_EXIT_INSN(),
4709			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4710			BPF_EXIT_INSN(),
4711		},
4712		INTERNAL,
4713		{ },
4714		{ { 0, 1 } },
4715	},
4716	{
4717		"JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
4718		.u.insns_int = {
4719			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4720			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4721			BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
4722			BPF_EXIT_INSN(),
4723			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4724			BPF_EXIT_INSN(),
4725		},
4726		INTERNAL,
4727		{ },
4728		{ { 0, 1 } },
4729	},
4730	{
4731		"JMP_JSGE_K: Signed jump: value walk 1",
4732		.u.insns_int = {
4733			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4734			BPF_LD_IMM64(R1, -3),
4735			BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
4736			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4737			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
4738			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4739			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
4740			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4741			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
4742			BPF_EXIT_INSN(),		/* bad exit */
4743			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4744			BPF_EXIT_INSN(),
4745		},
4746		INTERNAL,
4747		{ },
4748		{ { 0, 1 } },
4749	},
4750	{
4751		"JMP_JSGE_K: Signed jump: value walk 2",
4752		.u.insns_int = {
4753			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4754			BPF_LD_IMM64(R1, -3),
4755			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
4756			BPF_ALU64_IMM(BPF_ADD, R1, 2),
4757			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
4758			BPF_ALU64_IMM(BPF_ADD, R1, 2),
4759			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
4760			BPF_EXIT_INSN(),		/* bad exit */
4761			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4762			BPF_EXIT_INSN(),
4763		},
4764		INTERNAL,
4765		{ },
4766		{ { 0, 1 } },
4767	},
4768	/* BPF_JMP | BPF_JGT | BPF_K */
4769	{
4770		"JMP_JGT_K: if (3 > 2) return 1",
4771		.u.insns_int = {
4772			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4773			BPF_LD_IMM64(R1, 3),
4774			BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
4775			BPF_EXIT_INSN(),
4776			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4777			BPF_EXIT_INSN(),
4778		},
4779		INTERNAL,
4780		{ },
4781		{ { 0, 1 } },
4782	},
4783	{
4784		"JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
4785		.u.insns_int = {
4786			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4787			BPF_LD_IMM64(R1, -1),
4788			BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
4789			BPF_EXIT_INSN(),
4790			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4791			BPF_EXIT_INSN(),
4792		},
4793		INTERNAL,
4794		{ },
4795		{ { 0, 1 } },
4796	},
4797	/* BPF_JMP | BPF_JLT | BPF_K */
4798	{
4799		"JMP_JLT_K: if (2 < 3) return 1",
4800		.u.insns_int = {
4801			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4802			BPF_LD_IMM64(R1, 2),
4803			BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
4804			BPF_EXIT_INSN(),
4805			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4806			BPF_EXIT_INSN(),
4807		},
4808		INTERNAL,
4809		{ },
4810		{ { 0, 1 } },
4811	},
4812	{
4813		"JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
4814		.u.insns_int = {
4815			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4816			BPF_LD_IMM64(R1, 1),
4817			BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
4818			BPF_EXIT_INSN(),
4819			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4820			BPF_EXIT_INSN(),
4821		},
4822		INTERNAL,
4823		{ },
4824		{ { 0, 1 } },
4825	},
4826	/* BPF_JMP | BPF_JGE | BPF_K */
4827	{
4828		"JMP_JGE_K: if (3 >= 2) return 1",
4829		.u.insns_int = {
4830			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4831			BPF_LD_IMM64(R1, 3),
4832			BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
4833			BPF_EXIT_INSN(),
4834			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4835			BPF_EXIT_INSN(),
4836		},
4837		INTERNAL,
4838		{ },
4839		{ { 0, 1 } },
4840	},
4841	/* BPF_JMP | BPF_JLE | BPF_K */
4842	{
4843		"JMP_JLE_K: if (2 <= 3) return 1",
4844		.u.insns_int = {
4845			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4846			BPF_LD_IMM64(R1, 2),
4847			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
4848			BPF_EXIT_INSN(),
4849			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4850			BPF_EXIT_INSN(),
4851		},
4852		INTERNAL,
4853		{ },
4854		{ { 0, 1 } },
4855	},
4856	/* BPF_JMP | BPF_JGT | BPF_K jump backwards */
4857	{
4858		"JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
4859		.u.insns_int = {
4860			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4861			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4862			BPF_EXIT_INSN(),
4863			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4864			BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
4865			BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
4866			BPF_EXIT_INSN(),
4867		},
4868		INTERNAL,
4869		{ },
4870		{ { 0, 1 } },
4871	},
4872	{
4873		"JMP_JGE_K: if (3 >= 3) return 1",
4874		.u.insns_int = {
4875			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4876			BPF_LD_IMM64(R1, 3),
4877			BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
4878			BPF_EXIT_INSN(),
4879			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4880			BPF_EXIT_INSN(),
4881		},
4882		INTERNAL,
4883		{ },
4884		{ { 0, 1 } },
4885	},
4886	/* BPF_JMP | BPF_JLT | BPF_K jump backwards */
4887	{
4888		"JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
4889		.u.insns_int = {
4890			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4891			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4892			BPF_EXIT_INSN(),
4893			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4894			BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
4895			BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
4896			BPF_EXIT_INSN(),
4897		},
4898		INTERNAL,
4899		{ },
4900		{ { 0, 1 } },
4901	},
4902	{
4903		"JMP_JLE_K: if (3 <= 3) return 1",
4904		.u.insns_int = {
4905			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4906			BPF_LD_IMM64(R1, 3),
4907			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
4908			BPF_EXIT_INSN(),
4909			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4910			BPF_EXIT_INSN(),
4911		},
4912		INTERNAL,
4913		{ },
4914		{ { 0, 1 } },
4915	},
4916	/* BPF_JMP | BPF_JNE | BPF_K */
4917	{
4918		"JMP_JNE_K: if (3 != 2) return 1",
4919		.u.insns_int = {
4920			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4921			BPF_LD_IMM64(R1, 3),
4922			BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
4923			BPF_EXIT_INSN(),
4924			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4925			BPF_EXIT_INSN(),
4926		},
4927		INTERNAL,
4928		{ },
4929		{ { 0, 1 } },
4930	},
4931	/* BPF_JMP | BPF_JEQ | BPF_K */
4932	{
4933		"JMP_JEQ_K: if (3 == 3) return 1",
4934		.u.insns_int = {
4935			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4936			BPF_LD_IMM64(R1, 3),
4937			BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
4938			BPF_EXIT_INSN(),
4939			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4940			BPF_EXIT_INSN(),
4941		},
4942		INTERNAL,
4943		{ },
4944		{ { 0, 1 } },
4945	},
4946	/* BPF_JMP | BPF_JSET | BPF_K */
4947	{
4948		"JMP_JSET_K: if (0x3 & 0x2) return 1",
4949		.u.insns_int = {
4950			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4951			BPF_LD_IMM64(R1, 3),
4952			BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
4953			BPF_EXIT_INSN(),
4954			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4955			BPF_EXIT_INSN(),
4956		},
4957		INTERNAL,
4958		{ },
4959		{ { 0, 1 } },
4960	},
4961	{
4962		"JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
4963		.u.insns_int = {
4964			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4965			BPF_LD_IMM64(R1, 3),
4966			BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
4967			BPF_EXIT_INSN(),
4968			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4969			BPF_EXIT_INSN(),
4970		},
4971		INTERNAL,
4972		{ },
4973		{ { 0, 1 } },
4974	},
4975	/* BPF_JMP | BPF_JSGT | BPF_X */
4976	{
4977		"JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
4978		.u.insns_int = {
4979			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4980			BPF_LD_IMM64(R1, -1),
4981			BPF_LD_IMM64(R2, -2),
4982			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4983			BPF_EXIT_INSN(),
4984			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4985			BPF_EXIT_INSN(),
4986		},
4987		INTERNAL,
4988		{ },
4989		{ { 0, 1 } },
4990	},
4991	{
4992		"JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
4993		.u.insns_int = {
4994			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4995			BPF_LD_IMM64(R1, -1),
4996			BPF_LD_IMM64(R2, -1),
4997			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4998			BPF_EXIT_INSN(),
4999			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5000			BPF_EXIT_INSN(),
5001		},
5002		INTERNAL,
5003		{ },
5004		{ { 0, 1 } },
5005	},
5006	/* BPF_JMP | BPF_JSLT | BPF_X */
5007	{
5008		"JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
5009		.u.insns_int = {
5010			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5011			BPF_LD_IMM64(R1, -1),
5012			BPF_LD_IMM64(R2, -2),
5013			BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
5014			BPF_EXIT_INSN(),
5015			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5016			BPF_EXIT_INSN(),
5017		},
5018		INTERNAL,
5019		{ },
5020		{ { 0, 1 } },
5021	},
5022	{
5023		"JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
5024		.u.insns_int = {
5025			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5026			BPF_LD_IMM64(R1, -1),
5027			BPF_LD_IMM64(R2, -1),
5028			BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
5029			BPF_EXIT_INSN(),
5030			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5031			BPF_EXIT_INSN(),
5032		},
5033		INTERNAL,
5034		{ },
5035		{ { 0, 1 } },
5036	},
5037	/* BPF_JMP | BPF_JSGE | BPF_X */
5038	{
5039		"JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
5040		.u.insns_int = {
5041			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5042			BPF_LD_IMM64(R1, -1),
5043			BPF_LD_IMM64(R2, -2),
5044			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
5045			BPF_EXIT_INSN(),
5046			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5047			BPF_EXIT_INSN(),
5048		},
5049		INTERNAL,
5050		{ },
5051		{ { 0, 1 } },
5052	},
5053	{
5054		"JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
5055		.u.insns_int = {
5056			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5057			BPF_LD_IMM64(R1, -1),
5058			BPF_LD_IMM64(R2, -1),
5059			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
5060			BPF_EXIT_INSN(),
5061			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5062			BPF_EXIT_INSN(),
5063		},
5064		INTERNAL,
5065		{ },
5066		{ { 0, 1 } },
5067	},
5068	/* BPF_JMP | BPF_JSLE | BPF_X */
5069	{
5070		"JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
5071		.u.insns_int = {
5072			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5073			BPF_LD_IMM64(R1, -1),
5074			BPF_LD_IMM64(R2, -2),
5075			BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
5076			BPF_EXIT_INSN(),
5077			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5078			BPF_EXIT_INSN(),
5079		},
5080		INTERNAL,
5081		{ },
5082		{ { 0, 1 } },
5083	},
5084	{
5085		"JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
5086		.u.insns_int = {
5087			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5088			BPF_LD_IMM64(R1, -1),
5089			BPF_LD_IMM64(R2, -1),
5090			BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
5091			BPF_EXIT_INSN(),
5092			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5093			BPF_EXIT_INSN(),
5094		},
5095		INTERNAL,
5096		{ },
5097		{ { 0, 1 } },
5098	},
5099	/* BPF_JMP | BPF_JGT | BPF_X */
5100	{
5101		"JMP_JGT_X: if (3 > 2) return 1",
5102		.u.insns_int = {
5103			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5104			BPF_LD_IMM64(R1, 3),
5105			BPF_LD_IMM64(R2, 2),
5106			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
5107			BPF_EXIT_INSN(),
5108			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5109			BPF_EXIT_INSN(),
5110		},
5111		INTERNAL,
5112		{ },
5113		{ { 0, 1 } },
5114	},
5115	{
5116		"JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
5117		.u.insns_int = {
5118			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5119			BPF_LD_IMM64(R1, -1),
5120			BPF_LD_IMM64(R2, 1),
5121			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
5122			BPF_EXIT_INSN(),
5123			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5124			BPF_EXIT_INSN(),
5125		},
5126		INTERNAL,
5127		{ },
5128		{ { 0, 1 } },
5129	},
5130	/* BPF_JMP | BPF_JLT | BPF_X */
5131	{
5132		"JMP_JLT_X: if (2 < 3) return 1",
5133		.u.insns_int = {
5134			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5135			BPF_LD_IMM64(R1, 3),
5136			BPF_LD_IMM64(R2, 2),
5137			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
5138			BPF_EXIT_INSN(),
5139			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5140			BPF_EXIT_INSN(),
5141		},
5142		INTERNAL,
5143		{ },
5144		{ { 0, 1 } },
5145	},
5146	{
5147		"JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
5148		.u.insns_int = {
5149			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5150			BPF_LD_IMM64(R1, -1),
5151			BPF_LD_IMM64(R2, 1),
5152			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
5153			BPF_EXIT_INSN(),
5154			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5155			BPF_EXIT_INSN(),
5156		},
5157		INTERNAL,
5158		{ },
5159		{ { 0, 1 } },
5160	},
5161	/* BPF_JMP | BPF_JGE | BPF_X */
5162	{
5163		"JMP_JGE_X: if (3 >= 2) return 1",
5164		.u.insns_int = {
5165			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5166			BPF_LD_IMM64(R1, 3),
5167			BPF_LD_IMM64(R2, 2),
5168			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
5169			BPF_EXIT_INSN(),
5170			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5171			BPF_EXIT_INSN(),
5172		},
5173		INTERNAL,
5174		{ },
5175		{ { 0, 1 } },
5176	},
5177	{
5178		"JMP_JGE_X: if (3 >= 3) return 1",
5179		.u.insns_int = {
5180			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5181			BPF_LD_IMM64(R1, 3),
5182			BPF_LD_IMM64(R2, 3),
5183			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
5184			BPF_EXIT_INSN(),
5185			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5186			BPF_EXIT_INSN(),
5187		},
5188		INTERNAL,
5189		{ },
5190		{ { 0, 1 } },
5191	},
5192	/* BPF_JMP | BPF_JLE | BPF_X */
5193	{
5194		"JMP_JLE_X: if (2 <= 3) return 1",
5195		.u.insns_int = {
5196			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5197			BPF_LD_IMM64(R1, 3),
5198			BPF_LD_IMM64(R2, 2),
5199			BPF_JMP_REG(BPF_JLE, R2, R1, 1),
5200			BPF_EXIT_INSN(),
5201			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5202			BPF_EXIT_INSN(),
5203		},
5204		INTERNAL,
5205		{ },
5206		{ { 0, 1 } },
5207	},
5208	{
5209		"JMP_JLE_X: if (3 <= 3) return 1",
5210		.u.insns_int = {
5211			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5212			BPF_LD_IMM64(R1, 3),
5213			BPF_LD_IMM64(R2, 3),
5214			BPF_JMP_REG(BPF_JLE, R1, R2, 1),
5215			BPF_EXIT_INSN(),
5216			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5217			BPF_EXIT_INSN(),
5218		},
5219		INTERNAL,
5220		{ },
5221		{ { 0, 1 } },
5222	},
5223	{
5224		/* Mainly testing JIT + imm64 here. */
5225		"JMP_JGE_X: ldimm64 test 1",
5226		.u.insns_int = {
5227			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5228			BPF_LD_IMM64(R1, 3),
5229			BPF_LD_IMM64(R2, 2),
5230			BPF_JMP_REG(BPF_JGE, R1, R2, 2),
5231			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5232			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5233			BPF_EXIT_INSN(),
5234		},
5235		INTERNAL,
5236		{ },
5237		{ { 0, 0xeeeeeeeeU } },
5238	},
5239	{
5240		"JMP_JGE_X: ldimm64 test 2",
5241		.u.insns_int = {
5242			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5243			BPF_LD_IMM64(R1, 3),
5244			BPF_LD_IMM64(R2, 2),
5245			BPF_JMP_REG(BPF_JGE, R1, R2, 0),
5246			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5247			BPF_EXIT_INSN(),
5248		},
5249		INTERNAL,
5250		{ },
5251		{ { 0, 0xffffffffU } },
5252	},
5253	{
5254		"JMP_JGE_X: ldimm64 test 3",
5255		.u.insns_int = {
5256			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5257			BPF_LD_IMM64(R1, 3),
5258			BPF_LD_IMM64(R2, 2),
5259			BPF_JMP_REG(BPF_JGE, R1, R2, 4),
5260			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5261			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5262			BPF_EXIT_INSN(),
5263		},
5264		INTERNAL,
5265		{ },
5266		{ { 0, 1 } },
5267	},
5268	{
5269		"JMP_JLE_X: ldimm64 test 1",
5270		.u.insns_int = {
5271			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5272			BPF_LD_IMM64(R1, 3),
5273			BPF_LD_IMM64(R2, 2),
5274			BPF_JMP_REG(BPF_JLE, R2, R1, 2),
5275			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5276			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5277			BPF_EXIT_INSN(),
5278		},
5279		INTERNAL,
5280		{ },
5281		{ { 0, 0xeeeeeeeeU } },
5282	},
5283	{
5284		"JMP_JLE_X: ldimm64 test 2",
5285		.u.insns_int = {
5286			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5287			BPF_LD_IMM64(R1, 3),
5288			BPF_LD_IMM64(R2, 2),
5289			BPF_JMP_REG(BPF_JLE, R2, R1, 0),
5290			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5291			BPF_EXIT_INSN(),
5292		},
5293		INTERNAL,
5294		{ },
5295		{ { 0, 0xffffffffU } },
5296	},
5297	{
5298		"JMP_JLE_X: ldimm64 test 3",
5299		.u.insns_int = {
5300			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5301			BPF_LD_IMM64(R1, 3),
5302			BPF_LD_IMM64(R2, 2),
5303			BPF_JMP_REG(BPF_JLE, R2, R1, 4),
5304			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5305			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5306			BPF_EXIT_INSN(),
5307		},
5308		INTERNAL,
5309		{ },
5310		{ { 0, 1 } },
5311	},
5312	/* BPF_JMP | BPF_JNE | BPF_X */
5313	{
5314		"JMP_JNE_X: if (3 != 2) return 1",
5315		.u.insns_int = {
5316			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5317			BPF_LD_IMM64(R1, 3),
5318			BPF_LD_IMM64(R2, 2),
5319			BPF_JMP_REG(BPF_JNE, R1, R2, 1),
5320			BPF_EXIT_INSN(),
5321			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5322			BPF_EXIT_INSN(),
5323		},
5324		INTERNAL,
5325		{ },
5326		{ { 0, 1 } },
5327	},
5328	/* BPF_JMP | BPF_JEQ | BPF_X */
5329	{
5330		"JMP_JEQ_X: if (3 == 3) return 1",
5331		.u.insns_int = {
5332			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5333			BPF_LD_IMM64(R1, 3),
5334			BPF_LD_IMM64(R2, 3),
5335			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
5336			BPF_EXIT_INSN(),
5337			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5338			BPF_EXIT_INSN(),
5339		},
5340		INTERNAL,
5341		{ },
5342		{ { 0, 1 } },
5343	},
5344	/* BPF_JMP | BPF_JSET | BPF_X */
5345	{
5346		"JMP_JSET_X: if (0x3 & 0x2) return 1",
5347		.u.insns_int = {
5348			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5349			BPF_LD_IMM64(R1, 3),
5350			BPF_LD_IMM64(R2, 2),
5351			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
5352			BPF_EXIT_INSN(),
5353			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5354			BPF_EXIT_INSN(),
5355		},
5356		INTERNAL,
5357		{ },
5358		{ { 0, 1 } },
5359	},
5360	{
5361		"JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
5362		.u.insns_int = {
5363			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5364			BPF_LD_IMM64(R1, 3),
5365			BPF_LD_IMM64(R2, 0xffffffff),
5366			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
5367			BPF_EXIT_INSN(),
5368			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5369			BPF_EXIT_INSN(),
5370		},
5371		INTERNAL,
5372		{ },
5373		{ { 0, 1 } },
5374	},
5375	{
5376		"JMP_JA: Jump, gap, jump, ...",
5377		{ },
5378		CLASSIC | FLAG_NO_DATA,
5379		{ },
5380		{ { 0, 0xababcbac } },
5381		.fill_helper = bpf_fill_ja,
5382	},
5383	{	/* Mainly checking JIT here. */
5384		"BPF_MAXINSNS: Maximum possible literals",
5385		{ },
5386		CLASSIC | FLAG_NO_DATA,
5387		{ },
5388		{ { 0, 0xffffffff } },
5389		.fill_helper = bpf_fill_maxinsns1,
5390	},
5391	{	/* Mainly checking JIT here. */
5392		"BPF_MAXINSNS: Single literal",
5393		{ },
5394		CLASSIC | FLAG_NO_DATA,
5395		{ },
5396		{ { 0, 0xfefefefe } },
5397		.fill_helper = bpf_fill_maxinsns2,
5398	},
5399	{	/* Mainly checking JIT here. */
5400		"BPF_MAXINSNS: Run/add until end",
5401		{ },
5402		CLASSIC | FLAG_NO_DATA,
5403		{ },
5404		{ { 0, 0x947bf368 } },
5405		.fill_helper = bpf_fill_maxinsns3,
5406	},
5407	{
5408		"BPF_MAXINSNS: Too many instructions",
5409		{ },
5410		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
5411		{ },
5412		{ },
5413		.fill_helper = bpf_fill_maxinsns4,
5414		.expected_errcode = -EINVAL,
5415	},
5416	{	/* Mainly checking JIT here. */
5417		"BPF_MAXINSNS: Very long jump",
5418		{ },
5419		CLASSIC | FLAG_NO_DATA,
5420		{ },
5421		{ { 0, 0xabababab } },
5422		.fill_helper = bpf_fill_maxinsns5,
5423	},
5424	{	/* Mainly checking JIT here. */
5425		"BPF_MAXINSNS: Ctx heavy transformations",
5426		{ },
5427		CLASSIC,
5428		{ },
5429		{
5430			{  1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
5431			{ 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
5432		},
5433		.fill_helper = bpf_fill_maxinsns6,
5434	},
5435	{	/* Mainly checking JIT here. */
5436		"BPF_MAXINSNS: Call heavy transformations",
5437		{ },
5438		CLASSIC | FLAG_NO_DATA,
5439		{ },
5440		{ { 1, 0 }, { 10, 0 } },
5441		.fill_helper = bpf_fill_maxinsns7,
5442	},
5443	{	/* Mainly checking JIT here. */
5444		"BPF_MAXINSNS: Jump heavy test",
5445		{ },
5446		CLASSIC | FLAG_NO_DATA,
5447		{ },
5448		{ { 0, 0xffffffff } },
5449		.fill_helper = bpf_fill_maxinsns8,
5450	},
5451	{	/* Mainly checking JIT here. */
5452		"BPF_MAXINSNS: Very long jump backwards",
5453		{ },
5454		INTERNAL | FLAG_NO_DATA,
5455		{ },
5456		{ { 0, 0xcbababab } },
5457		.fill_helper = bpf_fill_maxinsns9,
5458	},
5459	{	/* Mainly checking JIT here. */
5460		"BPF_MAXINSNS: Edge hopping nuthouse",
5461		{ },
5462		INTERNAL | FLAG_NO_DATA,
5463		{ },
5464		{ { 0, 0xabababac } },
5465		.fill_helper = bpf_fill_maxinsns10,
5466	},
5467	{
5468		"BPF_MAXINSNS: Jump, gap, jump, ...",
5469		{ },
5470#if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_X86)
5471		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
5472#else
5473		CLASSIC | FLAG_NO_DATA,
5474#endif
5475		{ },
5476		{ { 0, 0xababcbac } },
5477		.fill_helper = bpf_fill_maxinsns11,
5478		.expected_errcode = -ENOTSUPP,
5479	},
5480	{
5481		"BPF_MAXINSNS: ld_abs+get_processor_id",
5482		{ },
5483		CLASSIC,
5484		{ },
5485		{ { 1, 0xbee } },
5486		.fill_helper = bpf_fill_ld_abs_get_processor_id,
5487	},
5488	{
5489		"BPF_MAXINSNS: ld_abs+vlan_push/pop",
5490		{ },
5491		INTERNAL,
5492		{ 0x34 },
5493		{ { ETH_HLEN, 0xbef } },
5494		.fill_helper = bpf_fill_ld_abs_vlan_push_pop,
5495	},
5496	{
5497		"BPF_MAXINSNS: jump around ld_abs",
5498		{ },
5499		INTERNAL,
5500		{ 10, 11 },
5501		{ { 2, 10 } },
5502		.fill_helper = bpf_fill_jump_around_ld_abs,
5503	},
5504	/*
5505	 * LD_IND / LD_ABS on fragmented SKBs
5506	 */
5507	{
5508		"LD_IND byte frag",
5509		.u.insns = {
5510			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5511			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
5512			BPF_STMT(BPF_RET | BPF_A, 0x0),
5513		},
5514		CLASSIC | FLAG_SKB_FRAG,
5515		{ },
5516		{ {0x40, 0x42} },
5517		.frag_data = {
5518			0x42, 0x00, 0x00, 0x00,
5519			0x43, 0x44, 0x00, 0x00,
5520			0x21, 0x07, 0x19, 0x83,
5521		},
5522	},
5523	{
5524		"LD_IND halfword frag",
5525		.u.insns = {
5526			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5527			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
5528			BPF_STMT(BPF_RET | BPF_A, 0x0),
5529		},
5530		CLASSIC | FLAG_SKB_FRAG,
5531		{ },
5532		{ {0x40, 0x4344} },
5533		.frag_data = {
5534			0x42, 0x00, 0x00, 0x00,
5535			0x43, 0x44, 0x00, 0x00,
5536			0x21, 0x07, 0x19, 0x83,
5537		},
5538	},
5539	{
5540		"LD_IND word frag",
5541		.u.insns = {
5542			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5543			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
5544			BPF_STMT(BPF_RET | BPF_A, 0x0),
5545		},
5546		CLASSIC | FLAG_SKB_FRAG,
5547		{ },
5548		{ {0x40, 0x21071983} },
5549		.frag_data = {
5550			0x42, 0x00, 0x00, 0x00,
5551			0x43, 0x44, 0x00, 0x00,
5552			0x21, 0x07, 0x19, 0x83,
5553		},
5554	},
5555	{
5556		"LD_IND halfword mixed head/frag",
5557		.u.insns = {
5558			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5559			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5560			BPF_STMT(BPF_RET | BPF_A, 0x0),
5561		},
5562		CLASSIC | FLAG_SKB_FRAG,
5563		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5564		{ {0x40, 0x0519} },
5565		.frag_data = { 0x19, 0x82 },
5566	},
5567	{
5568		"LD_IND word mixed head/frag",
5569		.u.insns = {
5570			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5571			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5572			BPF_STMT(BPF_RET | BPF_A, 0x0),
5573		},
5574		CLASSIC | FLAG_SKB_FRAG,
5575		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5576		{ {0x40, 0x25051982} },
5577		.frag_data = { 0x19, 0x82 },
5578	},
5579	{
5580		"LD_ABS byte frag",
5581		.u.insns = {
5582			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
5583			BPF_STMT(BPF_RET | BPF_A, 0x0),
5584		},
5585		CLASSIC | FLAG_SKB_FRAG,
5586		{ },
5587		{ {0x40, 0x42} },
5588		.frag_data = {
5589			0x42, 0x00, 0x00, 0x00,
5590			0x43, 0x44, 0x00, 0x00,
5591			0x21, 0x07, 0x19, 0x83,
5592		},
5593	},
5594	{
5595		"LD_ABS halfword frag",
5596		.u.insns = {
5597			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
5598			BPF_STMT(BPF_RET | BPF_A, 0x0),
5599		},
5600		CLASSIC | FLAG_SKB_FRAG,
5601		{ },
5602		{ {0x40, 0x4344} },
5603		.frag_data = {
5604			0x42, 0x00, 0x00, 0x00,
5605			0x43, 0x44, 0x00, 0x00,
5606			0x21, 0x07, 0x19, 0x83,
5607		},
5608	},
5609	{
5610		"LD_ABS word frag",
5611		.u.insns = {
5612			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
5613			BPF_STMT(BPF_RET | BPF_A, 0x0),
5614		},
5615		CLASSIC | FLAG_SKB_FRAG,
5616		{ },
5617		{ {0x40, 0x21071983} },
5618		.frag_data = {
5619			0x42, 0x00, 0x00, 0x00,
5620			0x43, 0x44, 0x00, 0x00,
5621			0x21, 0x07, 0x19, 0x83,
5622		},
5623	},
5624	{
5625		"LD_ABS halfword mixed head/frag",
5626		.u.insns = {
5627			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
5628			BPF_STMT(BPF_RET | BPF_A, 0x0),
5629		},
5630		CLASSIC | FLAG_SKB_FRAG,
5631		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5632		{ {0x40, 0x0519} },
5633		.frag_data = { 0x19, 0x82 },
5634	},
5635	{
5636		"LD_ABS word mixed head/frag",
5637		.u.insns = {
5638			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
5639			BPF_STMT(BPF_RET | BPF_A, 0x0),
5640		},
5641		CLASSIC | FLAG_SKB_FRAG,
5642		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5643		{ {0x40, 0x25051982} },
5644		.frag_data = { 0x19, 0x82 },
5645	},
5646	/*
5647	 * LD_IND / LD_ABS on non fragmented SKBs
5648	 */
5649	{
5650		/*
5651		 * this tests that the JIT/interpreter correctly resets X
5652		 * before using it in an LD_IND instruction.
5653		 */
5654		"LD_IND byte default X",
5655		.u.insns = {
5656			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5657			BPF_STMT(BPF_RET | BPF_A, 0x0),
5658		},
5659		CLASSIC,
5660		{ [0x1] = 0x42 },
5661		{ {0x40, 0x42 } },
5662	},
5663	{
5664		"LD_IND byte positive offset",
5665		.u.insns = {
5666			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5667			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5668			BPF_STMT(BPF_RET | BPF_A, 0x0),
5669		},
5670		CLASSIC,
5671		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5672		{ {0x40, 0x82 } },
5673	},
5674	{
5675		"LD_IND byte negative offset",
5676		.u.insns = {
5677			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5678			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
5679			BPF_STMT(BPF_RET | BPF_A, 0x0),
5680		},
5681		CLASSIC,
5682		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5683		{ {0x40, 0x05 } },
5684	},
5685	{
5686		"LD_IND halfword positive offset",
5687		.u.insns = {
5688			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5689			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
5690			BPF_STMT(BPF_RET | BPF_A, 0x0),
5691		},
5692		CLASSIC,
5693		{
5694			[0x1c] = 0xaa, [0x1d] = 0x55,
5695			[0x1e] = 0xbb, [0x1f] = 0x66,
5696			[0x20] = 0xcc, [0x21] = 0x77,
5697			[0x22] = 0xdd, [0x23] = 0x88,
5698		},
5699		{ {0x40, 0xdd88 } },
5700	},
5701	{
5702		"LD_IND halfword negative offset",
5703		.u.insns = {
5704			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5705			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
5706			BPF_STMT(BPF_RET | BPF_A, 0x0),
5707		},
5708		CLASSIC,
5709		{
5710			[0x1c] = 0xaa, [0x1d] = 0x55,
5711			[0x1e] = 0xbb, [0x1f] = 0x66,
5712			[0x20] = 0xcc, [0x21] = 0x77,
5713			[0x22] = 0xdd, [0x23] = 0x88,
5714		},
5715		{ {0x40, 0xbb66 } },
5716	},
5717	{
5718		"LD_IND halfword unaligned",
5719		.u.insns = {
5720			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5721			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5722			BPF_STMT(BPF_RET | BPF_A, 0x0),
5723		},
5724		CLASSIC,
5725		{
5726			[0x1c] = 0xaa, [0x1d] = 0x55,
5727			[0x1e] = 0xbb, [0x1f] = 0x66,
5728			[0x20] = 0xcc, [0x21] = 0x77,
5729			[0x22] = 0xdd, [0x23] = 0x88,
5730		},
5731		{ {0x40, 0x66cc } },
5732	},
5733	{
5734		"LD_IND word positive offset",
5735		.u.insns = {
5736			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5737			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
5738			BPF_STMT(BPF_RET | BPF_A, 0x0),
5739		},
5740		CLASSIC,
5741		{
5742			[0x1c] = 0xaa, [0x1d] = 0x55,
5743			[0x1e] = 0xbb, [0x1f] = 0x66,
5744			[0x20] = 0xcc, [0x21] = 0x77,
5745			[0x22] = 0xdd, [0x23] = 0x88,
5746			[0x24] = 0xee, [0x25] = 0x99,
5747			[0x26] = 0xff, [0x27] = 0xaa,
5748		},
5749		{ {0x40, 0xee99ffaa } },
5750	},
5751	{
5752		"LD_IND word negative offset",
5753		.u.insns = {
5754			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5755			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
5756			BPF_STMT(BPF_RET | BPF_A, 0x0),
5757		},
5758		CLASSIC,
5759		{
5760			[0x1c] = 0xaa, [0x1d] = 0x55,
5761			[0x1e] = 0xbb, [0x1f] = 0x66,
5762			[0x20] = 0xcc, [0x21] = 0x77,
5763			[0x22] = 0xdd, [0x23] = 0x88,
5764			[0x24] = 0xee, [0x25] = 0x99,
5765			[0x26] = 0xff, [0x27] = 0xaa,
5766		},
5767		{ {0x40, 0xaa55bb66 } },
5768	},
5769	{
5770		"LD_IND word unaligned (addr & 3 == 2)",
5771		.u.insns = {
5772			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5773			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5774			BPF_STMT(BPF_RET | BPF_A, 0x0),
5775		},
5776		CLASSIC,
5777		{
5778			[0x1c] = 0xaa, [0x1d] = 0x55,
5779			[0x1e] = 0xbb, [0x1f] = 0x66,
5780			[0x20] = 0xcc, [0x21] = 0x77,
5781			[0x22] = 0xdd, [0x23] = 0x88,
5782			[0x24] = 0xee, [0x25] = 0x99,
5783			[0x26] = 0xff, [0x27] = 0xaa,
5784		},
5785		{ {0x40, 0xbb66cc77 } },
5786	},
5787	{
5788		"LD_IND word unaligned (addr & 3 == 1)",
5789		.u.insns = {
5790			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5791			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
5792			BPF_STMT(BPF_RET | BPF_A, 0x0),
5793		},
5794		CLASSIC,
5795		{
5796			[0x1c] = 0xaa, [0x1d] = 0x55,
5797			[0x1e] = 0xbb, [0x1f] = 0x66,
5798			[0x20] = 0xcc, [0x21] = 0x77,
5799			[0x22] = 0xdd, [0x23] = 0x88,
5800			[0x24] = 0xee, [0x25] = 0x99,
5801			[0x26] = 0xff, [0x27] = 0xaa,
5802		},
5803		{ {0x40, 0x55bb66cc } },
5804	},
5805	{
5806		"LD_IND word unaligned (addr & 3 == 3)",
5807		.u.insns = {
5808			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5809			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
5810			BPF_STMT(BPF_RET | BPF_A, 0x0),
5811		},
5812		CLASSIC,
5813		{
5814			[0x1c] = 0xaa, [0x1d] = 0x55,
5815			[0x1e] = 0xbb, [0x1f] = 0x66,
5816			[0x20] = 0xcc, [0x21] = 0x77,
5817			[0x22] = 0xdd, [0x23] = 0x88,
5818			[0x24] = 0xee, [0x25] = 0x99,
5819			[0x26] = 0xff, [0x27] = 0xaa,
5820		},
5821		{ {0x40, 0x66cc77dd } },
5822	},
5823	{
5824		"LD_ABS byte",
5825		.u.insns = {
5826			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
5827			BPF_STMT(BPF_RET | BPF_A, 0x0),
5828		},
5829		CLASSIC,
5830		{
5831			[0x1c] = 0xaa, [0x1d] = 0x55,
5832			[0x1e] = 0xbb, [0x1f] = 0x66,
5833			[0x20] = 0xcc, [0x21] = 0x77,
5834			[0x22] = 0xdd, [0x23] = 0x88,
5835			[0x24] = 0xee, [0x25] = 0x99,
5836			[0x26] = 0xff, [0x27] = 0xaa,
5837		},
5838		{ {0x40, 0xcc } },
5839	},
5840	{
5841		"LD_ABS halfword",
5842		.u.insns = {
5843			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
5844			BPF_STMT(BPF_RET | BPF_A, 0x0),
5845		},
5846		CLASSIC,
5847		{
5848			[0x1c] = 0xaa, [0x1d] = 0x55,
5849			[0x1e] = 0xbb, [0x1f] = 0x66,
5850			[0x20] = 0xcc, [0x21] = 0x77,
5851			[0x22] = 0xdd, [0x23] = 0x88,
5852			[0x24] = 0xee, [0x25] = 0x99,
5853			[0x26] = 0xff, [0x27] = 0xaa,
5854		},
5855		{ {0x40, 0xdd88 } },
5856	},
5857	{
5858		"LD_ABS halfword unaligned",
5859		.u.insns = {
5860			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
5861			BPF_STMT(BPF_RET | BPF_A, 0x0),
5862		},
5863		CLASSIC,
5864		{
5865			[0x1c] = 0xaa, [0x1d] = 0x55,
5866			[0x1e] = 0xbb, [0x1f] = 0x66,
5867			[0x20] = 0xcc, [0x21] = 0x77,
5868			[0x22] = 0xdd, [0x23] = 0x88,
5869			[0x24] = 0xee, [0x25] = 0x99,
5870			[0x26] = 0xff, [0x27] = 0xaa,
5871		},
5872		{ {0x40, 0x99ff } },
5873	},
5874	{
5875		"LD_ABS word",
5876		.u.insns = {
5877			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
5878			BPF_STMT(BPF_RET | BPF_A, 0x0),
5879		},
5880		CLASSIC,
5881		{
5882			[0x1c] = 0xaa, [0x1d] = 0x55,
5883			[0x1e] = 0xbb, [0x1f] = 0x66,
5884			[0x20] = 0xcc, [0x21] = 0x77,
5885			[0x22] = 0xdd, [0x23] = 0x88,
5886			[0x24] = 0xee, [0x25] = 0x99,
5887			[0x26] = 0xff, [0x27] = 0xaa,
5888		},
5889		{ {0x40, 0xaa55bb66 } },
5890	},
5891	{
5892		"LD_ABS word unaligned (addr & 3 == 2)",
5893		.u.insns = {
5894			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
5895			BPF_STMT(BPF_RET | BPF_A, 0x0),
5896		},
5897		CLASSIC,
5898		{
5899			[0x1c] = 0xaa, [0x1d] = 0x55,
5900			[0x1e] = 0xbb, [0x1f] = 0x66,
5901			[0x20] = 0xcc, [0x21] = 0x77,
5902			[0x22] = 0xdd, [0x23] = 0x88,
5903			[0x24] = 0xee, [0x25] = 0x99,
5904			[0x26] = 0xff, [0x27] = 0xaa,
5905		},
5906		{ {0x40, 0xdd88ee99 } },
5907	},
5908	{
5909		"LD_ABS word unaligned (addr & 3 == 1)",
5910		.u.insns = {
5911			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
5912			BPF_STMT(BPF_RET | BPF_A, 0x0),
5913		},
5914		CLASSIC,
5915		{
5916			[0x1c] = 0xaa, [0x1d] = 0x55,
5917			[0x1e] = 0xbb, [0x1f] = 0x66,
5918			[0x20] = 0xcc, [0x21] = 0x77,
5919			[0x22] = 0xdd, [0x23] = 0x88,
5920			[0x24] = 0xee, [0x25] = 0x99,
5921			[0x26] = 0xff, [0x27] = 0xaa,
5922		},
5923		{ {0x40, 0x77dd88ee } },
5924	},
5925	{
5926		"LD_ABS word unaligned (addr & 3 == 3)",
5927		.u.insns = {
5928			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
5929			BPF_STMT(BPF_RET | BPF_A, 0x0),
5930		},
5931		CLASSIC,
5932		{
5933			[0x1c] = 0xaa, [0x1d] = 0x55,
5934			[0x1e] = 0xbb, [0x1f] = 0x66,
5935			[0x20] = 0xcc, [0x21] = 0x77,
5936			[0x22] = 0xdd, [0x23] = 0x88,
5937			[0x24] = 0xee, [0x25] = 0x99,
5938			[0x26] = 0xff, [0x27] = 0xaa,
5939		},
5940		{ {0x40, 0x88ee99ff } },
5941	},
5942	/*
5943	 * verify that the interpreter or JIT correctly sets A and X
5944	 * to 0.
5945	 */
5946	{
5947		"ADD default X",
5948		.u.insns = {
5949			/*
5950			 * A = 0x42
5951			 * A = A + X
5952			 * ret A
5953			 */
5954			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
5955			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
5956			BPF_STMT(BPF_RET | BPF_A, 0x0),
5957		},
5958		CLASSIC | FLAG_NO_DATA,
5959		{},
5960		{ {0x1, 0x42 } },
5961	},
5962	{
5963		"ADD default A",
5964		.u.insns = {
5965			/*
5966			 * A = A + 0x42
5967			 * ret A
5968			 */
5969			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
5970			BPF_STMT(BPF_RET | BPF_A, 0x0),
5971		},
5972		CLASSIC | FLAG_NO_DATA,
5973		{},
5974		{ {0x1, 0x42 } },
5975	},
5976	{
5977		"SUB default X",
5978		.u.insns = {
5979			/*
5980			 * A = 0x66
5981			 * A = A - X
5982			 * ret A
5983			 */
5984			BPF_STMT(BPF_LD | BPF_IMM, 0x66),
5985			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
5986			BPF_STMT(BPF_RET | BPF_A, 0x0),
5987		},
5988		CLASSIC | FLAG_NO_DATA,
5989		{},
5990		{ {0x1, 0x66 } },
5991	},
5992	{
5993		"SUB default A",
5994		.u.insns = {
5995			/*
5996			 * A = A - -0x66
5997			 * ret A
5998			 */
5999			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
6000			BPF_STMT(BPF_RET | BPF_A, 0x0),
6001		},
6002		CLASSIC | FLAG_NO_DATA,
6003		{},
6004		{ {0x1, 0x66 } },
6005	},
6006	{
6007		"MUL default X",
6008		.u.insns = {
6009			/*
6010			 * A = 0x42
6011			 * A = A * X
6012			 * ret A
6013			 */
6014			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6015			BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
6016			BPF_STMT(BPF_RET | BPF_A, 0x0),
6017		},
6018		CLASSIC | FLAG_NO_DATA,
6019		{},
6020		{ {0x1, 0x0 } },
6021	},
6022	{
6023		"MUL default A",
6024		.u.insns = {
6025			/*
6026			 * A = A * 0x66
6027			 * ret A
6028			 */
6029			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
6030			BPF_STMT(BPF_RET | BPF_A, 0x0),
6031		},
6032		CLASSIC | FLAG_NO_DATA,
6033		{},
6034		{ {0x1, 0x0 } },
6035	},
6036	{
6037		"DIV default X",
6038		.u.insns = {
6039			/*
6040			 * A = 0x42
6041			 * A = A / X ; this halt the filter execution if X is 0
6042			 * ret 0x42
6043			 */
6044			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6045			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
6046			BPF_STMT(BPF_RET | BPF_K, 0x42),
6047		},
6048		CLASSIC | FLAG_NO_DATA,
6049		{},
6050		{ {0x1, 0x0 } },
6051	},
6052	{
6053		"DIV default A",
6054		.u.insns = {
6055			/*
6056			 * A = A / 1
6057			 * ret A
6058			 */
6059			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
6060			BPF_STMT(BPF_RET | BPF_A, 0x0),
6061		},
6062		CLASSIC | FLAG_NO_DATA,
6063		{},
6064		{ {0x1, 0x0 } },
6065	},
6066	{
6067		"MOD default X",
6068		.u.insns = {
6069			/*
6070			 * A = 0x42
6071			 * A = A mod X ; this halt the filter execution if X is 0
6072			 * ret 0x42
6073			 */
6074			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6075			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
6076			BPF_STMT(BPF_RET | BPF_K, 0x42),
6077		},
6078		CLASSIC | FLAG_NO_DATA,
6079		{},
6080		{ {0x1, 0x0 } },
6081	},
6082	{
6083		"MOD default A",
6084		.u.insns = {
6085			/*
6086			 * A = A mod 1
6087			 * ret A
6088			 */
6089			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
6090			BPF_STMT(BPF_RET | BPF_A, 0x0),
6091		},
6092		CLASSIC | FLAG_NO_DATA,
6093		{},
6094		{ {0x1, 0x0 } },
6095	},
6096	{
6097		"JMP EQ default A",
6098		.u.insns = {
6099			/*
6100			 * cmp A, 0x0, 0, 1
6101			 * ret 0x42
6102			 * ret 0x66
6103			 */
6104			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
6105			BPF_STMT(BPF_RET | BPF_K, 0x42),
6106			BPF_STMT(BPF_RET | BPF_K, 0x66),
6107		},
6108		CLASSIC | FLAG_NO_DATA,
6109		{},
6110		{ {0x1, 0x42 } },
6111	},
6112	{
6113		"JMP EQ default X",
6114		.u.insns = {
6115			/*
6116			 * A = 0x0
6117			 * cmp A, X, 0, 1
6118			 * ret 0x42
6119			 * ret 0x66
6120			 */
6121			BPF_STMT(BPF_LD | BPF_IMM, 0x0),
6122			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
6123			BPF_STMT(BPF_RET | BPF_K, 0x42),
6124			BPF_STMT(BPF_RET | BPF_K, 0x66),
6125		},
6126		CLASSIC | FLAG_NO_DATA,
6127		{},
6128		{ {0x1, 0x42 } },
6129	},
6130	{
6131		"LD_ABS with helper changing skb data",
6132		{ },
6133		INTERNAL,
6134		{ 0x34 },
6135		{ { ETH_HLEN, 42 } },
6136		.fill_helper = bpf_fill_ld_abs_vlan_push_pop2,
6137	},
6138	/* Checking interpreter vs JIT wrt signed extended imms. */
6139	{
6140		"JNE signed compare, test 1",
6141		.u.insns_int = {
6142			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6143			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6144			BPF_MOV64_REG(R2, R1),
6145			BPF_ALU64_REG(BPF_AND, R2, R3),
6146			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6147			BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
6148			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6149			BPF_EXIT_INSN(),
6150		},
6151		INTERNAL,
6152		{ },
6153		{ { 0, 1 } },
6154	},
6155	{
6156		"JNE signed compare, test 2",
6157		.u.insns_int = {
6158			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6159			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6160			BPF_MOV64_REG(R2, R1),
6161			BPF_ALU64_REG(BPF_AND, R2, R3),
6162			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6163			BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
6164			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6165			BPF_EXIT_INSN(),
6166		},
6167		INTERNAL,
6168		{ },
6169		{ { 0, 1 } },
6170	},
6171	{
6172		"JNE signed compare, test 3",
6173		.u.insns_int = {
6174			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6175			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6176			BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
6177			BPF_MOV64_REG(R2, R1),
6178			BPF_ALU64_REG(BPF_AND, R2, R3),
6179			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6180			BPF_JMP_REG(BPF_JNE, R2, R4, 1),
6181			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6182			BPF_EXIT_INSN(),
6183		},
6184		INTERNAL,
6185		{ },
6186		{ { 0, 2 } },
6187	},
6188	{
6189		"JNE signed compare, test 4",
6190		.u.insns_int = {
6191			BPF_LD_IMM64(R1, -17104896),
6192			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6193			BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
6194			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6195			BPF_EXIT_INSN(),
6196		},
6197		INTERNAL,
6198		{ },
6199		{ { 0, 2 } },
6200	},
6201	{
6202		"JNE signed compare, test 5",
6203		.u.insns_int = {
6204			BPF_LD_IMM64(R1, 0xfefb0000),
6205			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6206			BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
6207			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6208			BPF_EXIT_INSN(),
6209		},
6210		INTERNAL,
6211		{ },
6212		{ { 0, 1 } },
6213	},
6214	{
6215		"JNE signed compare, test 6",
6216		.u.insns_int = {
6217			BPF_LD_IMM64(R1, 0x7efb0000),
6218			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6219			BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
6220			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6221			BPF_EXIT_INSN(),
6222		},
6223		INTERNAL,
6224		{ },
6225		{ { 0, 2 } },
6226	},
6227	{
6228		"JNE signed compare, test 7",
6229		.u.insns = {
6230			BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
6231			BPF_STMT(BPF_MISC | BPF_TAX, 0),
6232			BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
6233			BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
6234			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
6235			BPF_STMT(BPF_RET | BPF_K, 1),
6236			BPF_STMT(BPF_RET | BPF_K, 2),
6237		},
6238		CLASSIC | FLAG_NO_DATA,
6239		{},
6240		{ { 0, 2 } },
6241	},
6242};
6243
6244static struct net_device dev;
6245
6246static struct sk_buff *populate_skb(char *buf, int size)
6247{
6248	struct sk_buff *skb;
6249
6250	if (size >= MAX_DATA)
6251		return NULL;
6252
6253	skb = alloc_skb(MAX_DATA, GFP_KERNEL);
6254	if (!skb)
6255		return NULL;
6256
6257	__skb_put_data(skb, buf, size);
6258
6259	/* Initialize a fake skb with test pattern. */
6260	skb_reset_mac_header(skb);
6261	skb->protocol = htons(ETH_P_IP);
6262	skb->pkt_type = SKB_TYPE;
6263	skb->mark = SKB_MARK;
6264	skb->hash = SKB_HASH;
6265	skb->queue_mapping = SKB_QUEUE_MAP;
6266	skb->vlan_tci = SKB_VLAN_TCI;
6267	skb->vlan_proto = htons(ETH_P_IP);
6268	skb->dev = &dev;
6269	skb->dev->ifindex = SKB_DEV_IFINDEX;
6270	skb->dev->type = SKB_DEV_TYPE;
6271	skb_set_network_header(skb, min(size, ETH_HLEN));
6272
6273	return skb;
6274}
6275
6276static void *generate_test_data(struct bpf_test *test, int sub)
6277{
6278	struct sk_buff *skb;
6279	struct page *page;
6280
6281	if (test->aux & FLAG_NO_DATA)
6282		return NULL;
6283
6284	/* Test case expects an skb, so populate one. Various
6285	 * subtests generate skbs of different sizes based on
6286	 * the same data.
6287	 */
6288	skb = populate_skb(test->data, test->test[sub].data_size);
6289	if (!skb)
6290		return NULL;
6291
6292	if (test->aux & FLAG_SKB_FRAG) {
6293		/*
6294		 * when the test requires a fragmented skb, add a
6295		 * single fragment to the skb, filled with
6296		 * test->frag_data.
6297		 */
6298		void *ptr;
6299
6300		page = alloc_page(GFP_KERNEL);
6301
6302		if (!page)
6303			goto err_kfree_skb;
6304
6305		ptr = kmap(page);
6306		if (!ptr)
6307			goto err_free_page;
6308		memcpy(ptr, test->frag_data, MAX_DATA);
6309		kunmap(page);
6310		skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
6311	}
6312
6313	return skb;
6314
6315err_free_page:
6316	__free_page(page);
6317err_kfree_skb:
6318	kfree_skb(skb);
6319	return NULL;
6320}
6321
6322static void release_test_data(const struct bpf_test *test, void *data)
6323{
6324	if (test->aux & FLAG_NO_DATA)
6325		return;
6326
6327	kfree_skb(data);
6328}
6329
6330static int filter_length(int which)
6331{
6332	struct sock_filter *fp;
6333	int len;
6334
6335	if (tests[which].fill_helper)
6336		return tests[which].u.ptr.len;
6337
6338	fp = tests[which].u.insns;
6339	for (len = MAX_INSNS - 1; len > 0; --len)
6340		if (fp[len].code != 0 || fp[len].k != 0)
6341			break;
6342
6343	return len + 1;
6344}
6345
6346static void *filter_pointer(int which)
6347{
6348	if (tests[which].fill_helper)
6349		return tests[which].u.ptr.insns;
6350	else
6351		return tests[which].u.insns;
6352}
6353
6354static struct bpf_prog *generate_filter(int which, int *err)
6355{
6356	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6357	unsigned int flen = filter_length(which);
6358	void *fptr = filter_pointer(which);
6359	struct sock_fprog_kern fprog;
6360	struct bpf_prog *fp;
6361
6362	switch (test_type) {
6363	case CLASSIC:
6364		fprog.filter = fptr;
6365		fprog.len = flen;
6366
6367		*err = bpf_prog_create(&fp, &fprog);
6368		if (tests[which].aux & FLAG_EXPECTED_FAIL) {
6369			if (*err == tests[which].expected_errcode) {
6370				pr_cont("PASS\n");
6371				/* Verifier rejected filter as expected. */
6372				*err = 0;
6373				return NULL;
6374			} else {
6375				pr_cont("UNEXPECTED_PASS\n");
6376				/* Verifier didn't reject the test that's
6377				 * bad enough, just return!
6378				 */
6379				*err = -EINVAL;
6380				return NULL;
6381			}
6382		}
6383		if (*err) {
6384			pr_cont("FAIL to prog_create err=%d len=%d\n",
6385				*err, fprog.len);
6386			return NULL;
6387		}
6388		break;
6389
6390	case INTERNAL:
6391		fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
6392		if (fp == NULL) {
6393			pr_cont("UNEXPECTED_FAIL no memory left\n");
6394			*err = -ENOMEM;
6395			return NULL;
6396		}
6397
6398		fp->len = flen;
6399		/* Type doesn't really matter here as long as it's not unspec. */
6400		fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
6401		memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
6402		fp->aux->stack_depth = tests[which].stack_depth;
6403
6404		/* We cannot error here as we don't need type compatibility
6405		 * checks.
6406		 */
6407		fp = bpf_prog_select_runtime(fp, err);
6408		if (*err) {
6409			pr_cont("FAIL to select_runtime err=%d\n", *err);
6410			return NULL;
6411		}
6412		break;
6413	}
6414
6415	*err = 0;
6416	return fp;
6417}
6418
6419static void release_filter(struct bpf_prog *fp, int which)
6420{
6421	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6422
6423	switch (test_type) {
6424	case CLASSIC:
6425		bpf_prog_destroy(fp);
6426		break;
6427	case INTERNAL:
6428		bpf_prog_free(fp);
6429		break;
6430	}
6431}
6432
6433static int __run_one(const struct bpf_prog *fp, const void *data,
6434		     int runs, u64 *duration)
6435{
6436	u64 start, finish;
6437	int ret = 0, i;
6438
6439	start = ktime_get_ns();
6440
6441	for (i = 0; i < runs; i++)
6442		ret = BPF_PROG_RUN(fp, data);
6443
6444	finish = ktime_get_ns();
6445
6446	*duration = finish - start;
6447	do_div(*duration, runs);
6448
6449	return ret;
6450}
6451
6452static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
6453{
6454	int err_cnt = 0, i, runs = MAX_TESTRUNS;
6455
6456	for (i = 0; i < MAX_SUBTESTS; i++) {
6457		void *data;
6458		u64 duration;
6459		u32 ret;
6460
6461		if (test->test[i].data_size == 0 &&
6462		    test->test[i].result == 0)
6463			break;
6464
6465		data = generate_test_data(test, i);
6466		if (!data && !(test->aux & FLAG_NO_DATA)) {
6467			pr_cont("data generation failed ");
6468			err_cnt++;
6469			break;
6470		}
6471		ret = __run_one(fp, data, runs, &duration);
6472		release_test_data(test, data);
6473
6474		if (ret == test->test[i].result) {
6475			pr_cont("%lld ", duration);
6476		} else {
6477			pr_cont("ret %d != %d ", ret,
6478				test->test[i].result);
6479			err_cnt++;
6480		}
6481	}
6482
6483	return err_cnt;
6484}
6485
6486static char test_name[64];
6487module_param_string(test_name, test_name, sizeof(test_name), 0);
6488
6489static int test_id = -1;
6490module_param(test_id, int, 0);
6491
6492static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
6493module_param_array(test_range, int, NULL, 0);
6494
6495static __init int find_test_index(const char *test_name)
6496{
6497	int i;
6498
6499	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6500		if (!strcmp(tests[i].descr, test_name))
6501			return i;
6502	}
6503	return -1;
6504}
6505
6506static __init int prepare_bpf_tests(void)
6507{
6508	int i;
6509
6510	if (test_id >= 0) {
6511		/*
6512		 * if a test_id was specified, use test_range to
6513		 * cover only that test.
6514		 */
6515		if (test_id >= ARRAY_SIZE(tests)) {
6516			pr_err("test_bpf: invalid test_id specified.\n");
6517			return -EINVAL;
6518		}
6519
6520		test_range[0] = test_id;
6521		test_range[1] = test_id;
6522	} else if (*test_name) {
6523		/*
6524		 * if a test_name was specified, find it and setup
6525		 * test_range to cover only that test.
6526		 */
6527		int idx = find_test_index(test_name);
6528
6529		if (idx < 0) {
6530			pr_err("test_bpf: no test named '%s' found.\n",
6531			       test_name);
6532			return -EINVAL;
6533		}
6534		test_range[0] = idx;
6535		test_range[1] = idx;
6536	} else {
6537		/*
6538		 * check that the supplied test_range is valid.
6539		 */
6540		if (test_range[0] >= ARRAY_SIZE(tests) ||
6541		    test_range[1] >= ARRAY_SIZE(tests) ||
6542		    test_range[0] < 0 || test_range[1] < 0) {
6543			pr_err("test_bpf: test_range is out of bound.\n");
6544			return -EINVAL;
6545		}
6546
6547		if (test_range[1] < test_range[0]) {
6548			pr_err("test_bpf: test_range is ending before it starts.\n");
6549			return -EINVAL;
6550		}
6551	}
6552
6553	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6554		if (tests[i].fill_helper &&
6555		    tests[i].fill_helper(&tests[i]) < 0)
6556			return -ENOMEM;
6557	}
6558
6559	return 0;
6560}
6561
6562static __init void destroy_bpf_tests(void)
6563{
6564	int i;
6565
6566	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6567		if (tests[i].fill_helper)
6568			kfree(tests[i].u.ptr.insns);
6569	}
6570}
6571
6572static bool exclude_test(int test_id)
6573{
6574	return test_id < test_range[0] || test_id > test_range[1];
6575}
6576
6577static __init struct sk_buff *build_test_skb(void)
6578{
6579	u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
6580	struct sk_buff *skb[2];
6581	struct page *page[2];
6582	int i, data_size = 8;
6583
6584	for (i = 0; i < 2; i++) {
6585		page[i] = alloc_page(GFP_KERNEL);
6586		if (!page[i]) {
6587			if (i == 0)
6588				goto err_page0;
6589			else
6590				goto err_page1;
6591		}
6592
6593		/* this will set skb[i]->head_frag */
6594		skb[i] = dev_alloc_skb(headroom + data_size);
6595		if (!skb[i]) {
6596			if (i == 0)
6597				goto err_skb0;
6598			else
6599				goto err_skb1;
6600		}
6601
6602		skb_reserve(skb[i], headroom);
6603		skb_put(skb[i], data_size);
6604		skb[i]->protocol = htons(ETH_P_IP);
6605		skb_reset_network_header(skb[i]);
6606		skb_set_mac_header(skb[i], -ETH_HLEN);
6607
6608		skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
6609		// skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
6610	}
6611
6612	/* setup shinfo */
6613	skb_shinfo(skb[0])->gso_size = 1448;
6614	skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
6615	skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
6616	skb_shinfo(skb[0])->gso_segs = 0;
6617	skb_shinfo(skb[0])->frag_list = skb[1];
6618
6619	/* adjust skb[0]'s len */
6620	skb[0]->len += skb[1]->len;
6621	skb[0]->data_len += skb[1]->data_len;
6622	skb[0]->truesize += skb[1]->truesize;
6623
6624	return skb[0];
6625
6626err_skb1:
6627	__free_page(page[1]);
6628err_page1:
6629	kfree_skb(skb[0]);
6630err_skb0:
6631	__free_page(page[0]);
6632err_page0:
6633	return NULL;
6634}
6635
6636static __init int test_skb_segment(void)
6637{
6638	netdev_features_t features;
6639	struct sk_buff *skb, *segs;
6640	int ret = -1;
6641
6642	features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
6643		   NETIF_F_IPV6_CSUM;
6644	features |= NETIF_F_RXCSUM;
6645	skb = build_test_skb();
6646	if (!skb) {
6647		pr_info("%s: failed to build_test_skb", __func__);
6648		goto done;
6649	}
6650
6651	segs = skb_segment(skb, features);
6652	if (!IS_ERR(segs)) {
6653		kfree_skb_list(segs);
6654		ret = 0;
6655		pr_info("%s: success in skb_segment!", __func__);
6656	} else {
6657		pr_info("%s: failed in skb_segment!", __func__);
6658	}
6659	kfree_skb(skb);
6660done:
6661	return ret;
6662}
6663
6664static __init int test_bpf(void)
6665{
6666	int i, err_cnt = 0, pass_cnt = 0;
6667	int jit_cnt = 0, run_cnt = 0;
6668
6669	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6670		struct bpf_prog *fp;
6671		int err;
6672
6673		cond_resched();
6674		if (exclude_test(i))
6675			continue;
6676
6677		pr_info("#%d %s ", i, tests[i].descr);
6678
6679		fp = generate_filter(i, &err);
6680		if (fp == NULL) {
6681			if (err == 0) {
6682				pass_cnt++;
6683				continue;
6684			}
6685			err_cnt++;
6686			continue;
6687		}
6688
6689		pr_cont("jited:%u ", fp->jited);
6690
6691		run_cnt++;
6692		if (fp->jited)
6693			jit_cnt++;
6694
6695		err = run_one(fp, &tests[i]);
6696		release_filter(fp, i);
6697
6698		if (err) {
6699			pr_cont("FAIL (%d times)\n", err);
6700			err_cnt++;
6701		} else {
6702			pr_cont("PASS\n");
6703			pass_cnt++;
6704		}
6705	}
6706
6707	pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
6708		pass_cnt, err_cnt, jit_cnt, run_cnt);
6709
6710	return err_cnt ? -EINVAL : 0;
6711}
6712
6713static int __init test_bpf_init(void)
6714{
6715	int ret;
6716
6717	ret = prepare_bpf_tests();
6718	if (ret < 0)
6719		return ret;
6720
6721	ret = test_bpf();
6722	destroy_bpf_tests();
6723	if (ret)
6724		return ret;
6725
6726	return test_skb_segment();
6727}
6728
6729static void __exit test_bpf_exit(void)
6730{
6731}
6732
6733module_init(test_bpf_init);
6734module_exit(test_bpf_exit);
6735
6736MODULE_LICENSE("GPL");