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 /* unpriv: nospec (inserted to prevent "R9 !read_ok") */ 82 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 83 BPF_EXIT_INSN(), 84 }, 85 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 86 .retval = 1, 87 .result = ACCEPT, 88 }, 89 { 90 "jset: known const compare bad", 91 .insns = { 92 BPF_MOV64_IMM(BPF_REG_0, 0), 93 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 94 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 95 BPF_EXIT_INSN(), 96 }, 97 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 98 .errstr_unpriv = "!read_ok", 99 .result_unpriv = REJECT, 100 .errstr = "!read_ok", 101 .result = REJECT, 102 }, 103 { 104 "jset: unknown const compare taken", 105 .insns = { 106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 107 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 108 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 109 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 110 BPF_EXIT_INSN(), 111 }, 112 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 113 .errstr_unpriv = "!read_ok", 114 .result_unpriv = REJECT, 115 .errstr = "!read_ok", 116 .result = REJECT, 117 }, 118 { 119 "jset: unknown const compare not taken", 120 .insns = { 121 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 122 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 123 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 124 BPF_EXIT_INSN(), 125 }, 126 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 127 .errstr_unpriv = "!read_ok", 128 .result_unpriv = REJECT, 129 .errstr = "!read_ok", 130 .result = REJECT, 131 }, 132 { 133 "jset: half-known const compare", 134 .insns = { 135 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 136 BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2), 137 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1), 138 /* unpriv: nospec (inserted to prevent "R9 !read_ok") */ 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 = ACCEPT, 145 }, 146 { 147 "jset: range", 148 .insns = { 149 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 150 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 151 BPF_MOV64_IMM(BPF_REG_0, 0), 152 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff), 153 BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3), 154 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1), 155 /* unpriv: nospec (inserted to prevent "R9 !read_ok") */ 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 /* unpriv: nospec (inserted to prevent "R9 !read_ok") */ 162 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 163 BPF_EXIT_INSN(), 164 }, 165 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 166 .result = ACCEPT, 167 }, 168