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