1 { 2 "add+sub+mul", 3 .insns = { 4 BPF_MOV64_IMM(BPF_REG_1, 1), 5 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 6 BPF_MOV64_IMM(BPF_REG_2, 3), 7 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 8 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 9 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 10 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11 BPF_EXIT_INSN(), 12 }, 13 .result = ACCEPT, 14 .retval = -3, 15 }, 16 { 17 "xor32 zero extend check", 18 .insns = { 19 BPF_MOV32_IMM(BPF_REG_2, -1), 20 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 21 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 22 BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 23 BPF_MOV32_IMM(BPF_REG_0, 2), 24 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 25 BPF_MOV32_IMM(BPF_REG_0, 1), 26 BPF_EXIT_INSN(), 27 }, 28 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 29 .result = ACCEPT, 30 .retval = 1, 31 }, 32 { 33 "arsh32 on imm", 34 .insns = { 35 BPF_MOV64_IMM(BPF_REG_0, 1), 36 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 37 BPF_EXIT_INSN(), 38 }, 39 .result = ACCEPT, 40 .retval = 0, 41 }, 42 { 43 "arsh32 on imm 2", 44 .insns = { 45 BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 46 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 47 BPF_EXIT_INSN(), 48 }, 49 .result = ACCEPT, 50 .retval = -16069393, 51 }, 52 { 53 "arsh32 on reg", 54 .insns = { 55 BPF_MOV64_IMM(BPF_REG_0, 1), 56 BPF_MOV64_IMM(BPF_REG_1, 5), 57 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 58 BPF_EXIT_INSN(), 59 }, 60 .result = ACCEPT, 61 .retval = 0, 62 }, 63 { 64 "arsh32 on reg 2", 65 .insns = { 66 BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 67 BPF_MOV64_IMM(BPF_REG_1, 15), 68 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 69 BPF_EXIT_INSN(), 70 }, 71 .result = ACCEPT, 72 .retval = 43724, 73 }, 74 { 75 "arsh64 on imm", 76 .insns = { 77 BPF_MOV64_IMM(BPF_REG_0, 1), 78 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 79 BPF_EXIT_INSN(), 80 }, 81 .result = ACCEPT, 82 }, 83 { 84 "arsh64 on reg", 85 .insns = { 86 BPF_MOV64_IMM(BPF_REG_0, 1), 87 BPF_MOV64_IMM(BPF_REG_1, 5), 88 BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 89 BPF_EXIT_INSN(), 90 }, 91 .result = ACCEPT, 92 }, 93 { 94 "lsh64 by 0 imm", 95 .insns = { 96 BPF_LD_IMM64(BPF_REG_0, 1), 97 BPF_LD_IMM64(BPF_REG_1, 1), 98 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 0), 99 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 100 BPF_MOV64_IMM(BPF_REG_0, 2), 101 BPF_EXIT_INSN(), 102 }, 103 .result = ACCEPT, 104 .retval = 1, 105 }, 106 { 107 "rsh64 by 0 imm", 108 .insns = { 109 BPF_LD_IMM64(BPF_REG_0, 1), 110 BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 111 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 112 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 0), 113 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 114 BPF_MOV64_IMM(BPF_REG_0, 2), 115 BPF_EXIT_INSN(), 116 }, 117 .result = ACCEPT, 118 .retval = 1, 119 }, 120 { 121 "arsh64 by 0 imm", 122 .insns = { 123 BPF_LD_IMM64(BPF_REG_0, 1), 124 BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 125 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 126 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 0), 127 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 128 BPF_MOV64_IMM(BPF_REG_0, 2), 129 BPF_EXIT_INSN(), 130 }, 131 .result = ACCEPT, 132 .retval = 1, 133 }, 134 { 135 "lsh64 by 0 reg", 136 .insns = { 137 BPF_LD_IMM64(BPF_REG_0, 1), 138 BPF_LD_IMM64(BPF_REG_1, 1), 139 BPF_LD_IMM64(BPF_REG_2, 0), 140 BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 141 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 142 BPF_MOV64_IMM(BPF_REG_0, 2), 143 BPF_EXIT_INSN(), 144 }, 145 .result = ACCEPT, 146 .retval = 1, 147 }, 148 { 149 "rsh64 by 0 reg", 150 .insns = { 151 BPF_LD_IMM64(BPF_REG_0, 1), 152 BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 153 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 154 BPF_LD_IMM64(BPF_REG_3, 0), 155 BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_3), 156 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 157 BPF_MOV64_IMM(BPF_REG_0, 2), 158 BPF_EXIT_INSN(), 159 }, 160 .result = ACCEPT, 161 .retval = 1, 162 }, 163 { 164 "arsh64 by 0 reg", 165 .insns = { 166 BPF_LD_IMM64(BPF_REG_0, 1), 167 BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 168 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 169 BPF_LD_IMM64(BPF_REG_3, 0), 170 BPF_ALU64_REG(BPF_ARSH, BPF_REG_1, BPF_REG_3), 171 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 172 BPF_MOV64_IMM(BPF_REG_0, 2), 173 BPF_EXIT_INSN(), 174 }, 175 .result = ACCEPT, 176 .retval = 1, 177 }, 178 { 179 "invalid 64-bit BPF_END with BPF_TO_BE", 180 .insns = { 181 BPF_MOV32_IMM(BPF_REG_0, 0), 182 { 183 .code = BPF_ALU64 | BPF_END | BPF_TO_BE, 184 .dst_reg = BPF_REG_0, 185 .src_reg = 0, 186 .off = 0, 187 .imm = 32, 188 }, 189 BPF_EXIT_INSN(), 190 }, 191 .errstr = "unknown opcode df", 192 .result = REJECT, 193 }, 194 { 195 "mov64 src == dst", 196 .insns = { 197 BPF_MOV64_IMM(BPF_REG_2, 0), 198 BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 199 // Check bounds are OK 200 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 201 BPF_MOV64_IMM(BPF_REG_0, 0), 202 BPF_EXIT_INSN(), 203 }, 204 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 205 .result = ACCEPT, 206 }, 207 { 208 "mov64 src != dst", 209 .insns = { 210 BPF_MOV64_IMM(BPF_REG_3, 0), 211 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 212 // Check bounds are OK 213 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 214 BPF_MOV64_IMM(BPF_REG_0, 0), 215 BPF_EXIT_INSN(), 216 }, 217 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 218 .result = ACCEPT, 219 }, 220