cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

jmp32.c (20426B)


      1{
      2	"jset32: BPF_K",
      3	.insns = {
      4	BPF_DIRECT_PKT_R2,
      5	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
      6	/* reg, high bits shouldn't be tested */
      7	BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, -2, 1),
      8	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
      9	BPF_EXIT_INSN(),
     10
     11	BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 1, 1),
     12	BPF_EXIT_INSN(),
     13	BPF_MOV64_IMM(BPF_REG_0, 2),
     14	BPF_EXIT_INSN(),
     15	},
     16	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
     17	.result = ACCEPT,
     18	.runs = 3,
     19	.retvals = {
     20		{ .retval = 0,
     21		  .data64 = { 1ULL << 63, }
     22		},
     23		{ .retval = 2,
     24		  .data64 = { 1, }
     25		},
     26		{ .retval = 2,
     27		  .data64 = { 1ULL << 63 | 1, }
     28		},
     29	},
     30	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
     31},
     32{
     33	"jset32: BPF_X",
     34	.insns = {
     35	BPF_DIRECT_PKT_R2,
     36	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
     37	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
     38	BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
     39	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
     40	BPF_EXIT_INSN(),
     41
     42	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
     43	BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
     44	BPF_EXIT_INSN(),
     45	BPF_MOV64_IMM(BPF_REG_0, 2),
     46	BPF_EXIT_INSN(),
     47	},
     48	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
     49	.result = ACCEPT,
     50	.runs = 3,
     51	.retvals = {
     52		{ .retval = 0,
     53		  .data64 = { 1ULL << 63, }
     54		},
     55		{ .retval = 2,
     56		  .data64 = { 1, }
     57		},
     58		{ .retval = 2,
     59		  .data64 = { 1ULL << 63 | 1, }
     60		},
     61	},
     62	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
     63},
     64{
     65	"jset32: ignores upper bits",
     66	.insns = {
     67	BPF_MOV64_IMM(BPF_REG_0, 0),
     68	BPF_LD_IMM64(BPF_REG_7, 0x8000000000000000),
     69	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
     70	BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
     71	BPF_EXIT_INSN(),
     72	BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
     73	BPF_MOV64_IMM(BPF_REG_0, 2),
     74	BPF_EXIT_INSN(),
     75	},
     76	.result = ACCEPT,
     77	.retval = 2,
     78},
     79{
     80	"jset32: min/max deduction",
     81	.insns = {
     82	BPF_RAND_UEXT_R7,
     83	BPF_MOV64_IMM(BPF_REG_0, 0),
     84	BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 0x10, 1),
     85	BPF_EXIT_INSN(),
     86	BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x10, 1),
     87	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
     88	BPF_EXIT_INSN(),
     89	},
     90	.errstr_unpriv = "R9 !read_ok",
     91	.result_unpriv = REJECT,
     92	.result = ACCEPT,
     93},
     94{
     95	"jeq32: BPF_K",
     96	.insns = {
     97	BPF_DIRECT_PKT_R2,
     98	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
     99	BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, -1, 1),
    100	BPF_EXIT_INSN(),
    101	BPF_MOV64_IMM(BPF_REG_0, 2),
    102	BPF_EXIT_INSN(),
    103	},
    104	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    105	.result = ACCEPT,
    106	.runs = 2,
    107	.retvals = {
    108		{ .retval = 0,
    109		  .data64 = { -2, }
    110		},
    111		{ .retval = 2,
    112		  .data64 = { -1, }
    113		},
    114	},
    115	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    116},
    117{
    118	"jeq32: BPF_X",
    119	.insns = {
    120	BPF_DIRECT_PKT_R2,
    121	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    122	BPF_LD_IMM64(BPF_REG_8, 0x7000000000000001),
    123	BPF_JMP32_REG(BPF_JEQ, BPF_REG_7, BPF_REG_8, 1),
    124	BPF_EXIT_INSN(),
    125	BPF_MOV64_IMM(BPF_REG_0, 2),
    126	BPF_EXIT_INSN(),
    127	},
    128	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    129	.result = ACCEPT,
    130	.runs = 3,
    131	.retvals = {
    132		{ .retval = 0,
    133		  .data64 = { 2, }
    134		},
    135		{ .retval = 2,
    136		  .data64 = { 1, }
    137		},
    138		{ .retval = 2,
    139		  .data64 = { 1ULL << 63 | 1, }
    140		},
    141	},
    142	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    143},
    144{
    145	"jeq32: min/max deduction",
    146	.insns = {
    147	BPF_RAND_UEXT_R7,
    148	BPF_MOV64_IMM(BPF_REG_0, 0),
    149	BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, 0x10, 1),
    150	BPF_EXIT_INSN(),
    151	BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, 0xf, 1),
    152	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
    153	BPF_EXIT_INSN(),
    154	},
    155	.errstr_unpriv = "R9 !read_ok",
    156	.result_unpriv = REJECT,
    157	.result = ACCEPT,
    158},
    159{
    160	"jne32: BPF_K",
    161	.insns = {
    162	BPF_DIRECT_PKT_R2,
    163	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    164	BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, -1, 1),
    165	BPF_EXIT_INSN(),
    166	BPF_MOV64_IMM(BPF_REG_0, 2),
    167	BPF_EXIT_INSN(),
    168	},
    169	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    170	.result = ACCEPT,
    171	.runs = 2,
    172	.retvals = {
    173		{ .retval = 2,
    174		  .data64 = { 1, }
    175		},
    176		{ .retval = 0,
    177		  .data64 = { -1, }
    178		},
    179	},
    180	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    181},
    182{
    183	"jne32: BPF_X",
    184	.insns = {
    185	BPF_DIRECT_PKT_R2,
    186	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    187	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
    188	BPF_JMP32_REG(BPF_JNE, BPF_REG_7, BPF_REG_8, 1),
    189	BPF_EXIT_INSN(),
    190	BPF_MOV64_IMM(BPF_REG_0, 2),
    191	BPF_EXIT_INSN(),
    192	},
    193	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    194	.result = ACCEPT,
    195	.runs = 3,
    196	.retvals = {
    197		{ .retval = 0,
    198		  .data64 = { 1, }
    199		},
    200		{ .retval = 2,
    201		  .data64 = { 2, }
    202		},
    203		{ .retval = 2,
    204		  .data64 = { 1ULL << 63 | 2, }
    205		},
    206	},
    207	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    208},
    209{
    210	"jne32: min/max deduction",
    211	.insns = {
    212	BPF_RAND_UEXT_R7,
    213	BPF_MOV64_IMM(BPF_REG_0, 0),
    214	BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
    215	BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
    216	BPF_EXIT_INSN(),
    217	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
    218	BPF_EXIT_INSN(),
    219	},
    220	.errstr_unpriv = "R9 !read_ok",
    221	.result_unpriv = REJECT,
    222	.result = ACCEPT,
    223},
    224{
    225	"jge32: BPF_K",
    226	.insns = {
    227	BPF_DIRECT_PKT_R2,
    228	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    229	BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, UINT_MAX - 1, 1),
    230	BPF_EXIT_INSN(),
    231	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    232	BPF_EXIT_INSN(),
    233	},
    234	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    235	.result = ACCEPT,
    236	.runs = 3,
    237	.retvals = {
    238		{ .retval = 2,
    239		  .data64 = { UINT_MAX, }
    240		},
    241		{ .retval = 2,
    242		  .data64 = { UINT_MAX - 1, }
    243		},
    244		{ .retval = 0,
    245		  .data64 = { 0, }
    246		},
    247	},
    248	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    249},
    250{
    251	"jge32: BPF_X",
    252	.insns = {
    253	BPF_DIRECT_PKT_R2,
    254	BPF_LD_IMM64(BPF_REG_8, UINT_MAX | 1ULL << 32),
    255	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    256	BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
    257	BPF_EXIT_INSN(),
    258	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    259	BPF_EXIT_INSN(),
    260	},
    261	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    262	.result = ACCEPT,
    263	.runs = 3,
    264	.retvals = {
    265		{ .retval = 2,
    266		  .data64 = { UINT_MAX, }
    267		},
    268		{ .retval = 0,
    269		  .data64 = { INT_MAX, }
    270		},
    271		{ .retval = 0,
    272		  .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
    273		},
    274	},
    275	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    276},
    277{
    278	"jge32: min/max deduction",
    279	.insns = {
    280	BPF_RAND_UEXT_R7,
    281	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    282	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
    283	BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
    284	BPF_EXIT_INSN(),
    285	BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x7ffffff0, 1),
    286	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    287	BPF_EXIT_INSN(),
    288	},
    289	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    290	.result_unpriv = REJECT,
    291	.result = ACCEPT,
    292	.retval = 2,
    293},
    294{
    295	"jgt32: BPF_K",
    296	.insns = {
    297	BPF_DIRECT_PKT_R2,
    298	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    299	BPF_JMP32_IMM(BPF_JGT, BPF_REG_7, UINT_MAX - 1, 1),
    300	BPF_EXIT_INSN(),
    301	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    302	BPF_EXIT_INSN(),
    303	},
    304	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    305	.result = ACCEPT,
    306	.runs = 3,
    307	.retvals = {
    308		{ .retval = 2,
    309		  .data64 = { UINT_MAX, }
    310		},
    311		{ .retval = 0,
    312		  .data64 = { UINT_MAX - 1, }
    313		},
    314		{ .retval = 0,
    315		  .data64 = { 0, }
    316		},
    317	},
    318	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    319},
    320{
    321	"jgt32: BPF_X",
    322	.insns = {
    323	BPF_DIRECT_PKT_R2,
    324	BPF_LD_IMM64(BPF_REG_8, (UINT_MAX - 1) | 1ULL << 32),
    325	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    326	BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
    327	BPF_EXIT_INSN(),
    328	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    329	BPF_EXIT_INSN(),
    330	},
    331	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    332	.result = ACCEPT,
    333	.runs = 3,
    334	.retvals = {
    335		{ .retval = 2,
    336		  .data64 = { UINT_MAX, }
    337		},
    338		{ .retval = 0,
    339		  .data64 = { UINT_MAX - 1, }
    340		},
    341		{ .retval = 0,
    342		  .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
    343		},
    344	},
    345	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    346},
    347{
    348	"jgt32: min/max deduction",
    349	.insns = {
    350	BPF_RAND_UEXT_R7,
    351	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    352	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
    353	BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
    354	BPF_EXIT_INSN(),
    355	BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 0x7ffffff0, 1),
    356	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    357	BPF_EXIT_INSN(),
    358	},
    359	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    360	.result_unpriv = REJECT,
    361	.result = ACCEPT,
    362	.retval = 2,
    363},
    364{
    365	"jle32: BPF_K",
    366	.insns = {
    367	BPF_DIRECT_PKT_R2,
    368	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    369	BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, INT_MAX, 1),
    370	BPF_EXIT_INSN(),
    371	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    372	BPF_EXIT_INSN(),
    373	},
    374	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    375	.result = ACCEPT,
    376	.runs = 3,
    377	.retvals = {
    378		{ .retval = 2,
    379		  .data64 = { INT_MAX - 1, }
    380		},
    381		{ .retval = 0,
    382		  .data64 = { UINT_MAX, }
    383		},
    384		{ .retval = 2,
    385		  .data64 = { INT_MAX, }
    386		},
    387	},
    388	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    389},
    390{
    391	"jle32: BPF_X",
    392	.insns = {
    393	BPF_DIRECT_PKT_R2,
    394	BPF_LD_IMM64(BPF_REG_8, (INT_MAX - 1) | 2ULL << 32),
    395	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    396	BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
    397	BPF_EXIT_INSN(),
    398	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    399	BPF_EXIT_INSN(),
    400	},
    401	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    402	.result = ACCEPT,
    403	.runs = 3,
    404	.retvals = {
    405		{ .retval = 0,
    406		  .data64 = { INT_MAX | 1ULL << 32, }
    407		},
    408		{ .retval = 2,
    409		  .data64 = { INT_MAX - 2, }
    410		},
    411		{ .retval = 0,
    412		  .data64 = { UINT_MAX, }
    413		},
    414	},
    415	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    416},
    417{
    418	"jle32: min/max deduction",
    419	.insns = {
    420	BPF_RAND_UEXT_R7,
    421	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    422	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
    423	BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
    424	BPF_EXIT_INSN(),
    425	BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, 0x7ffffff0, 1),
    426	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    427	BPF_EXIT_INSN(),
    428	},
    429	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    430	.result_unpriv = REJECT,
    431	.result = ACCEPT,
    432	.retval = 2,
    433},
    434{
    435	"jlt32: BPF_K",
    436	.insns = {
    437	BPF_DIRECT_PKT_R2,
    438	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    439	BPF_JMP32_IMM(BPF_JLT, BPF_REG_7, INT_MAX, 1),
    440	BPF_EXIT_INSN(),
    441	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    442	BPF_EXIT_INSN(),
    443	},
    444	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    445	.result = ACCEPT,
    446	.runs = 3,
    447	.retvals = {
    448		{ .retval = 0,
    449		  .data64 = { INT_MAX, }
    450		},
    451		{ .retval = 0,
    452		  .data64 = { UINT_MAX, }
    453		},
    454		{ .retval = 2,
    455		  .data64 = { INT_MAX - 1, }
    456		},
    457	},
    458	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    459},
    460{
    461	"jlt32: BPF_X",
    462	.insns = {
    463	BPF_DIRECT_PKT_R2,
    464	BPF_LD_IMM64(BPF_REG_8, INT_MAX | 2ULL << 32),
    465	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    466	BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
    467	BPF_EXIT_INSN(),
    468	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    469	BPF_EXIT_INSN(),
    470	},
    471	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    472	.result = ACCEPT,
    473	.runs = 3,
    474	.retvals = {
    475		{ .retval = 0,
    476		  .data64 = { INT_MAX | 1ULL << 32, }
    477		},
    478		{ .retval = 0,
    479		  .data64 = { UINT_MAX, }
    480		},
    481		{ .retval = 2,
    482		  .data64 = { (INT_MAX - 1) | 3ULL << 32, }
    483		},
    484	},
    485	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    486},
    487{
    488	"jlt32: min/max deduction",
    489	.insns = {
    490	BPF_RAND_UEXT_R7,
    491	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    492	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
    493	BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
    494	BPF_EXIT_INSN(),
    495	BPF_JMP_IMM(BPF_JSLT, BPF_REG_7, 0x7ffffff0, 1),
    496	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    497	BPF_EXIT_INSN(),
    498	},
    499	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    500	.result_unpriv = REJECT,
    501	.result = ACCEPT,
    502	.retval = 2,
    503},
    504{
    505	"jsge32: BPF_K",
    506	.insns = {
    507	BPF_DIRECT_PKT_R2,
    508	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    509	BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, -1, 1),
    510	BPF_EXIT_INSN(),
    511	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    512	BPF_EXIT_INSN(),
    513	},
    514	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    515	.result = ACCEPT,
    516	.runs = 3,
    517	.retvals = {
    518		{ .retval = 2,
    519		  .data64 = { 0, }
    520		},
    521		{ .retval = 2,
    522		  .data64 = { -1, }
    523		},
    524		{ .retval = 0,
    525		  .data64 = { -2, }
    526		},
    527	},
    528	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    529},
    530{
    531	"jsge32: BPF_X",
    532	.insns = {
    533	BPF_DIRECT_PKT_R2,
    534	BPF_LD_IMM64(BPF_REG_8, (__u32)-1 | 2ULL << 32),
    535	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    536	BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
    537	BPF_EXIT_INSN(),
    538	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    539	BPF_EXIT_INSN(),
    540	},
    541	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    542	.result = ACCEPT,
    543	.runs = 3,
    544	.retvals = {
    545		{ .retval = 2,
    546		  .data64 = { -1, }
    547		},
    548		{ .retval = 2,
    549		  .data64 = { 0x7fffffff | 1ULL << 32, }
    550		},
    551		{ .retval = 0,
    552		  .data64 = { -2, }
    553		},
    554	},
    555	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    556},
    557{
    558	"jsge32: min/max deduction",
    559	.insns = {
    560	BPF_RAND_UEXT_R7,
    561	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    562	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
    563	BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
    564	BPF_EXIT_INSN(),
    565	BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0x7ffffff0, 1),
    566	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    567	BPF_EXIT_INSN(),
    568	},
    569	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    570	.result_unpriv = REJECT,
    571	.result = ACCEPT,
    572	.retval = 2,
    573},
    574{
    575	"jsgt32: BPF_K",
    576	.insns = {
    577	BPF_DIRECT_PKT_R2,
    578	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    579	BPF_JMP32_IMM(BPF_JSGT, BPF_REG_7, -1, 1),
    580	BPF_EXIT_INSN(),
    581	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    582	BPF_EXIT_INSN(),
    583	},
    584	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    585	.result = ACCEPT,
    586	.runs = 3,
    587	.retvals = {
    588		{ .retval = 0,
    589		  .data64 = { (__u32)-2, }
    590		},
    591		{ .retval = 0,
    592		  .data64 = { -1, }
    593		},
    594		{ .retval = 2,
    595		  .data64 = { 1, }
    596		},
    597	},
    598	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    599},
    600{
    601	"jsgt32: BPF_X",
    602	.insns = {
    603	BPF_DIRECT_PKT_R2,
    604	BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
    605	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    606	BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
    607	BPF_EXIT_INSN(),
    608	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    609	BPF_EXIT_INSN(),
    610	},
    611	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    612	.result = ACCEPT,
    613	.runs = 3,
    614	.retvals = {
    615		{ .retval = 0,
    616		  .data64 = { 0x7ffffffe, }
    617		},
    618		{ .retval = 0,
    619		  .data64 = { 0x1ffffffffULL, }
    620		},
    621		{ .retval = 2,
    622		  .data64 = { 0x7fffffff, }
    623		},
    624	},
    625	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    626},
    627{
    628	"jsgt32: min/max deduction",
    629	.insns = {
    630	BPF_RAND_SEXT_R7,
    631	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    632	BPF_LD_IMM64(BPF_REG_8, (__u32)(-2) | 1ULL << 32),
    633	BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
    634	BPF_EXIT_INSN(),
    635	BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, -2, 1),
    636	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    637	BPF_EXIT_INSN(),
    638	},
    639	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    640	.result_unpriv = REJECT,
    641	.result = ACCEPT,
    642	.retval = 2,
    643},
    644{
    645	"jsle32: BPF_K",
    646	.insns = {
    647	BPF_DIRECT_PKT_R2,
    648	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    649	BPF_JMP32_IMM(BPF_JSLE, BPF_REG_7, -1, 1),
    650	BPF_EXIT_INSN(),
    651	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    652	BPF_EXIT_INSN(),
    653	},
    654	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    655	.result = ACCEPT,
    656	.runs = 3,
    657	.retvals = {
    658		{ .retval = 2,
    659		  .data64 = { (__u32)-2, }
    660		},
    661		{ .retval = 2,
    662		  .data64 = { -1, }
    663		},
    664		{ .retval = 0,
    665		  .data64 = { 1, }
    666		},
    667	},
    668	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    669},
    670{
    671	"jsle32: BPF_X",
    672	.insns = {
    673	BPF_DIRECT_PKT_R2,
    674	BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
    675	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    676	BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
    677	BPF_EXIT_INSN(),
    678	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    679	BPF_EXIT_INSN(),
    680	},
    681	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    682	.result = ACCEPT,
    683	.runs = 3,
    684	.retvals = {
    685		{ .retval = 2,
    686		  .data64 = { 0x7ffffffe, }
    687		},
    688		{ .retval = 2,
    689		  .data64 = { (__u32)-1, }
    690		},
    691		{ .retval = 0,
    692		  .data64 = { 0x7fffffff | 2ULL << 32, }
    693		},
    694	},
    695	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    696},
    697{
    698	"jsle32: min/max deduction",
    699	.insns = {
    700	BPF_RAND_UEXT_R7,
    701	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    702	BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
    703	BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
    704	BPF_EXIT_INSN(),
    705	BPF_JMP_IMM(BPF_JSLE, BPF_REG_7, 0x7ffffff0, 1),
    706	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    707	BPF_EXIT_INSN(),
    708	},
    709	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    710	.result_unpriv = REJECT,
    711	.result = ACCEPT,
    712	.retval = 2,
    713},
    714{
    715	"jslt32: BPF_K",
    716	.insns = {
    717	BPF_DIRECT_PKT_R2,
    718	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    719	BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
    720	BPF_EXIT_INSN(),
    721	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    722	BPF_EXIT_INSN(),
    723	},
    724	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    725	.result = ACCEPT,
    726	.runs = 3,
    727	.retvals = {
    728		{ .retval = 2,
    729		  .data64 = { (__u32)-2, }
    730		},
    731		{ .retval = 0,
    732		  .data64 = { -1, }
    733		},
    734		{ .retval = 0,
    735		  .data64 = { 1, }
    736		},
    737	},
    738	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    739},
    740{
    741	"jslt32: BPF_X",
    742	.insns = {
    743	BPF_DIRECT_PKT_R2,
    744	BPF_LD_IMM64(BPF_REG_8, 0x7fffffff | 1ULL << 32),
    745	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
    746	BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
    747	BPF_EXIT_INSN(),
    748	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    749	BPF_EXIT_INSN(),
    750	},
    751	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    752	.result = ACCEPT,
    753	.runs = 3,
    754	.retvals = {
    755		{ .retval = 2,
    756		  .data64 = { 0x7ffffffe, }
    757		},
    758		{ .retval = 2,
    759		  .data64 = { 0xffffffff, }
    760		},
    761		{ .retval = 0,
    762		  .data64 = { 0x7fffffff | 2ULL << 32, }
    763		},
    764	},
    765	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    766},
    767{
    768	"jslt32: min/max deduction",
    769	.insns = {
    770	BPF_RAND_SEXT_R7,
    771	BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
    772	BPF_LD_IMM64(BPF_REG_8, (__u32)(-1) | 1ULL << 32),
    773	BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
    774	BPF_EXIT_INSN(),
    775	BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
    776	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
    777	BPF_EXIT_INSN(),
    778	},
    779	.errstr_unpriv = "R0 invalid mem access 'scalar'",
    780	.result_unpriv = REJECT,
    781	.result = ACCEPT,
    782	.retval = 2,
    783},
    784{
    785	"jgt32: range bound deduction, reg op imm",
    786	.insns = {
    787	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
    788	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
    789	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
    790	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
    791	BPF_LD_MAP_FD(BPF_REG_1, 0),
    792	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
    793	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
    794	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
    795	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
    796	BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
    797	BPF_JMP32_IMM(BPF_JGT, BPF_REG_0, 1, 5),
    798	BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
    799	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
    800	BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
    801	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
    802	BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
    803	BPF_MOV32_IMM(BPF_REG_0, 0),
    804	BPF_EXIT_INSN(),
    805	},
    806	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    807	.fixup_map_hash_48b = { 4 },
    808	.result = ACCEPT,
    809	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    810},
    811{
    812	"jgt32: range bound deduction, reg1 op reg2, reg1 unknown",
    813	.insns = {
    814	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
    815	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
    816	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
    817	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
    818	BPF_LD_MAP_FD(BPF_REG_1, 0),
    819	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
    820	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
    821	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
    822	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
    823	BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
    824	BPF_MOV32_IMM(BPF_REG_2, 1),
    825	BPF_JMP32_REG(BPF_JGT, BPF_REG_0, BPF_REG_2, 5),
    826	BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
    827	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
    828	BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
    829	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
    830	BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
    831	BPF_MOV32_IMM(BPF_REG_0, 0),
    832	BPF_EXIT_INSN(),
    833	},
    834	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    835	.fixup_map_hash_48b = { 4 },
    836	.result = ACCEPT,
    837	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    838},
    839{
    840	"jle32: range bound deduction, reg1 op reg2, reg2 unknown",
    841	.insns = {
    842	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
    843	BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
    844	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
    845	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
    846	BPF_LD_MAP_FD(BPF_REG_1, 0),
    847	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
    848	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
    849	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
    850	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
    851	BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
    852	BPF_MOV32_IMM(BPF_REG_2, 1),
    853	BPF_JMP32_REG(BPF_JLE, BPF_REG_2, BPF_REG_0, 5),
    854	BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
    855	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
    856	BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
    857	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
    858	BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
    859	BPF_MOV32_IMM(BPF_REG_0, 0),
    860	BPF_EXIT_INSN(),
    861	},
    862	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    863	.fixup_map_hash_48b = { 4 },
    864	.result = ACCEPT,
    865	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
    866},
    867{
    868	"jeq32/jne32: bounds checking",
    869	.insns = {
    870	BPF_MOV64_IMM(BPF_REG_6, 563),
    871	BPF_MOV64_IMM(BPF_REG_2, 0),
    872	BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
    873	BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
    874	BPF_ALU32_REG(BPF_OR, BPF_REG_2, BPF_REG_6),
    875	BPF_JMP32_IMM(BPF_JNE, BPF_REG_2, 8, 5),
    876	BPF_JMP_IMM(BPF_JSGE, BPF_REG_2, 500, 2),
    877	BPF_MOV64_IMM(BPF_REG_0, 2),
    878	BPF_EXIT_INSN(),
    879	BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
    880	BPF_EXIT_INSN(),
    881	BPF_MOV64_IMM(BPF_REG_0, 1),
    882	BPF_EXIT_INSN(),
    883	},
    884	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
    885	.result = ACCEPT,
    886	.retval = 1,
    887},