1*4882a593Smuzhiyun { 2*4882a593Smuzhiyun "jset: functional", 3*4882a593Smuzhiyun .insns = { 4*4882a593Smuzhiyun BPF_DIRECT_PKT_R2, 5*4882a593Smuzhiyun BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0), 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun /* reg, bit 63 or bit 0 set, taken */ 8*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001), 9*4882a593Smuzhiyun BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1), 10*4882a593Smuzhiyun BPF_EXIT_INSN(), 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* reg, bit 62, not taken */ 13*4882a593Smuzhiyun BPF_LD_IMM64(BPF_REG_8, 0x4000000000000000), 14*4882a593Smuzhiyun BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1), 15*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JA, 0, 0, 1), 16*4882a593Smuzhiyun BPF_EXIT_INSN(), 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* imm, any bit set, taken */ 19*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_7, -1, 1), 20*4882a593Smuzhiyun BPF_EXIT_INSN(), 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* imm, bit 31 set, taken */ 23*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1), 24*4882a593Smuzhiyun BPF_EXIT_INSN(), 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* all good - return r0 == 2 */ 27*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 28*4882a593Smuzhiyun BPF_EXIT_INSN(), 29*4882a593Smuzhiyun }, 30*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 31*4882a593Smuzhiyun .result = ACCEPT, 32*4882a593Smuzhiyun .runs = 7, 33*4882a593Smuzhiyun .retvals = { 34*4882a593Smuzhiyun { .retval = 2, 35*4882a593Smuzhiyun .data64 = { (1ULL << 63) | (1U << 31) | (1U << 0), } 36*4882a593Smuzhiyun }, 37*4882a593Smuzhiyun { .retval = 2, 38*4882a593Smuzhiyun .data64 = { (1ULL << 63) | (1U << 31), } 39*4882a593Smuzhiyun }, 40*4882a593Smuzhiyun { .retval = 2, 41*4882a593Smuzhiyun .data64 = { (1ULL << 31) | (1U << 0), } 42*4882a593Smuzhiyun }, 43*4882a593Smuzhiyun { .retval = 2, 44*4882a593Smuzhiyun .data64 = { (__u32)-1, } 45*4882a593Smuzhiyun }, 46*4882a593Smuzhiyun { .retval = 2, 47*4882a593Smuzhiyun .data64 = { ~0x4000000000000000ULL, } 48*4882a593Smuzhiyun }, 49*4882a593Smuzhiyun { .retval = 0, 50*4882a593Smuzhiyun .data64 = { 0, } 51*4882a593Smuzhiyun }, 52*4882a593Smuzhiyun { .retval = 0, 53*4882a593Smuzhiyun .data64 = { ~0ULL, } 54*4882a593Smuzhiyun }, 55*4882a593Smuzhiyun }, 56*4882a593Smuzhiyun .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 57*4882a593Smuzhiyun }, 58*4882a593Smuzhiyun { 59*4882a593Smuzhiyun "jset: sign-extend", 60*4882a593Smuzhiyun .insns = { 61*4882a593Smuzhiyun BPF_DIRECT_PKT_R2, 62*4882a593Smuzhiyun BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0), 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1), 65*4882a593Smuzhiyun BPF_EXIT_INSN(), 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 2), 68*4882a593Smuzhiyun BPF_EXIT_INSN(), 69*4882a593Smuzhiyun }, 70*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SCHED_CLS, 71*4882a593Smuzhiyun .result = ACCEPT, 72*4882a593Smuzhiyun .retval = 2, 73*4882a593Smuzhiyun .data = { 1, 0, 0, 0, 0, 0, 0, 1, }, 74*4882a593Smuzhiyun .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 75*4882a593Smuzhiyun }, 76*4882a593Smuzhiyun { 77*4882a593Smuzhiyun "jset: known const compare", 78*4882a593Smuzhiyun .insns = { 79*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 1), 80*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 81*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 82*4882a593Smuzhiyun BPF_EXIT_INSN(), 83*4882a593Smuzhiyun }, 84*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 85*4882a593Smuzhiyun .errstr_unpriv = "R9 !read_ok", 86*4882a593Smuzhiyun .result_unpriv = REJECT, 87*4882a593Smuzhiyun .retval = 1, 88*4882a593Smuzhiyun .result = ACCEPT, 89*4882a593Smuzhiyun }, 90*4882a593Smuzhiyun { 91*4882a593Smuzhiyun "jset: known const compare bad", 92*4882a593Smuzhiyun .insns = { 93*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 94*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 95*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 96*4882a593Smuzhiyun BPF_EXIT_INSN(), 97*4882a593Smuzhiyun }, 98*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 99*4882a593Smuzhiyun .errstr_unpriv = "!read_ok", 100*4882a593Smuzhiyun .result_unpriv = REJECT, 101*4882a593Smuzhiyun .errstr = "!read_ok", 102*4882a593Smuzhiyun .result = REJECT, 103*4882a593Smuzhiyun }, 104*4882a593Smuzhiyun { 105*4882a593Smuzhiyun "jset: unknown const compare taken", 106*4882a593Smuzhiyun .insns = { 107*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 108*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 109*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JA, 0, 0, 1), 110*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 111*4882a593Smuzhiyun BPF_EXIT_INSN(), 112*4882a593Smuzhiyun }, 113*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 114*4882a593Smuzhiyun .errstr_unpriv = "!read_ok", 115*4882a593Smuzhiyun .result_unpriv = REJECT, 116*4882a593Smuzhiyun .errstr = "!read_ok", 117*4882a593Smuzhiyun .result = REJECT, 118*4882a593Smuzhiyun }, 119*4882a593Smuzhiyun { 120*4882a593Smuzhiyun "jset: unknown const compare not taken", 121*4882a593Smuzhiyun .insns = { 122*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 123*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 124*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 125*4882a593Smuzhiyun BPF_EXIT_INSN(), 126*4882a593Smuzhiyun }, 127*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 128*4882a593Smuzhiyun .errstr_unpriv = "!read_ok", 129*4882a593Smuzhiyun .result_unpriv = REJECT, 130*4882a593Smuzhiyun .errstr = "!read_ok", 131*4882a593Smuzhiyun .result = REJECT, 132*4882a593Smuzhiyun }, 133*4882a593Smuzhiyun { 134*4882a593Smuzhiyun "jset: half-known const compare", 135*4882a593Smuzhiyun .insns = { 136*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 137*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2), 138*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1), 139*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 140*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 141*4882a593Smuzhiyun BPF_EXIT_INSN(), 142*4882a593Smuzhiyun }, 143*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 144*4882a593Smuzhiyun .errstr_unpriv = "R9 !read_ok", 145*4882a593Smuzhiyun .result_unpriv = REJECT, 146*4882a593Smuzhiyun .result = ACCEPT, 147*4882a593Smuzhiyun }, 148*4882a593Smuzhiyun { 149*4882a593Smuzhiyun "jset: range", 150*4882a593Smuzhiyun .insns = { 151*4882a593Smuzhiyun BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 152*4882a593Smuzhiyun BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 153*4882a593Smuzhiyun BPF_MOV64_IMM(BPF_REG_0, 0), 154*4882a593Smuzhiyun BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff), 155*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3), 156*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1), 157*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 158*4882a593Smuzhiyun BPF_EXIT_INSN(), 159*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1), 160*4882a593Smuzhiyun BPF_EXIT_INSN(), 161*4882a593Smuzhiyun BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1), 162*4882a593Smuzhiyun BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 163*4882a593Smuzhiyun BPF_EXIT_INSN(), 164*4882a593Smuzhiyun }, 165*4882a593Smuzhiyun .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 166*4882a593Smuzhiyun .errstr_unpriv = "R9 !read_ok", 167*4882a593Smuzhiyun .result_unpriv = REJECT, 168*4882a593Smuzhiyun .result = ACCEPT, 169*4882a593Smuzhiyun }, 170