root/tools/testing/selftests/bpf/verifier/subreg.c

/* [<][>][^][v][top][bottom][index][help] */
   1 /* This file contains sub-register zero extension checks for insns defining
   2  * sub-registers, meaning:
   3  *   - All insns under BPF_ALU class. Their BPF_ALU32 variants or narrow width
   4  *     forms (BPF_END) could define sub-registers.
   5  *   - Narrow direct loads, BPF_B/H/W | BPF_LDX.
   6  *   - BPF_LD is not exposed to JIT back-ends, so no need for testing.
   7  *
   8  * "get_prandom_u32" is used to initialize low 32-bit of some registers to
   9  * prevent potential optimizations done by verifier or JIT back-ends which could
  10  * optimize register back into constant when range info shows one register is a
  11  * constant.
  12  */
  13 {
  14         "add32 reg zero extend check",
  15         .insns = {
  16         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  17         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  18         BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL),
  19         BPF_ALU32_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
  20         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
  21         BPF_EXIT_INSN(),
  22         },
  23         .result = ACCEPT,
  24         .retval = 0,
  25 },
  26 {
  27         "add32 imm zero extend check",
  28         .insns = {
  29         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  30         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
  31         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
  32         /* An insn could have no effect on the low 32-bit, for example:
  33          *   a = a + 0
  34          *   a = a | 0
  35          *   a = a & -1
  36          * But, they should still zero high 32-bit.
  37          */
  38         BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0),
  39         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
  40         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
  41         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  42         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
  43         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
  44         BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, -2),
  45         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
  46         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
  47         BPF_EXIT_INSN(),
  48         },
  49         .result = ACCEPT,
  50         .retval = 0,
  51 },
  52 {
  53         "sub32 reg zero extend check",
  54         .insns = {
  55         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  56         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  57         BPF_LD_IMM64(BPF_REG_0, 0x1ffffffffULL),
  58         BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
  59         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
  60         BPF_EXIT_INSN(),
  61         },
  62         .result = ACCEPT,
  63         .retval = 0,
  64 },
  65 {
  66         "sub32 imm zero extend check",
  67         .insns = {
  68         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  69         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
  70         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
  71         BPF_ALU32_IMM(BPF_SUB, BPF_REG_0, 0),
  72         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
  73         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
  74         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  75         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
  76         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
  77         BPF_ALU32_IMM(BPF_SUB, BPF_REG_0, 1),
  78         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
  79         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
  80         BPF_EXIT_INSN(),
  81         },
  82         .result = ACCEPT,
  83         .retval = 0,
  84 },
  85 {
  86         "mul32 reg zero extend check",
  87         .insns = {
  88         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  89         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  90         BPF_LD_IMM64(BPF_REG_0, 0x100000001ULL),
  91         BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
  92         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
  93         BPF_EXIT_INSN(),
  94         },
  95         .result = ACCEPT,
  96         .retval = 0,
  97 },
  98 {
  99         "mul32 imm zero extend check",
 100         .insns = {
 101         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 102         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 103         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 104         BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, 1),
 105         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 106         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 107         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 108         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 109         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 110         BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, -1),
 111         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 112         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 113         BPF_EXIT_INSN(),
 114         },
 115         .result = ACCEPT,
 116         .retval = 0,
 117 },
 118 {
 119         "div32 reg zero extend check",
 120         .insns = {
 121         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 122         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 123         BPF_MOV64_IMM(BPF_REG_0, -1),
 124         BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
 125         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 126         BPF_EXIT_INSN(),
 127         },
 128         .result = ACCEPT,
 129         .retval = 0,
 130 },
 131 {
 132         "div32 imm zero extend check",
 133         .insns = {
 134         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 135         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 136         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 137         BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, 1),
 138         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 139         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 140         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 141         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 142         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 143         BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, 2),
 144         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 145         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 146         BPF_EXIT_INSN(),
 147         },
 148         .result = ACCEPT,
 149         .retval = 0,
 150 },
 151 {
 152         "or32 reg zero extend check",
 153         .insns = {
 154         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 155         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 156         BPF_LD_IMM64(BPF_REG_0, 0x100000001ULL),
 157         BPF_ALU32_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 158         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 159         BPF_EXIT_INSN(),
 160         },
 161         .result = ACCEPT,
 162         .retval = 0,
 163 },
 164 {
 165         "or32 imm zero extend check",
 166         .insns = {
 167         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 168         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 169         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 170         BPF_ALU32_IMM(BPF_OR, BPF_REG_0, 0),
 171         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 172         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 173         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 174         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 175         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 176         BPF_ALU32_IMM(BPF_OR, BPF_REG_0, 1),
 177         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 178         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 179         BPF_EXIT_INSN(),
 180         },
 181         .result = ACCEPT,
 182         .retval = 0,
 183 },
 184 {
 185         "and32 reg zero extend check",
 186         .insns = {
 187         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 188         BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL),
 189         BPF_ALU64_REG(BPF_OR, BPF_REG_1, BPF_REG_0),
 190         BPF_LD_IMM64(BPF_REG_0, 0x1ffffffffULL),
 191         BPF_ALU32_REG(BPF_AND, BPF_REG_0, BPF_REG_1),
 192         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 193         BPF_EXIT_INSN(),
 194         },
 195         .result = ACCEPT,
 196         .retval = 0,
 197 },
 198 {
 199         "and32 imm zero extend check",
 200         .insns = {
 201         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 202         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 203         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 204         BPF_ALU32_IMM(BPF_AND, BPF_REG_0, -1),
 205         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 206         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 207         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 208         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 209         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 210         BPF_ALU32_IMM(BPF_AND, BPF_REG_0, -2),
 211         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 212         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 213         BPF_EXIT_INSN(),
 214         },
 215         .result = ACCEPT,
 216         .retval = 0,
 217 },
 218 {
 219         "lsh32 reg zero extend check",
 220         .insns = {
 221         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 222         BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL),
 223         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 224         BPF_MOV64_IMM(BPF_REG_1, 1),
 225         BPF_ALU32_REG(BPF_LSH, BPF_REG_0, BPF_REG_1),
 226         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 227         BPF_EXIT_INSN(),
 228         },
 229         .result = ACCEPT,
 230         .retval = 0,
 231 },
 232 {
 233         "lsh32 imm zero extend check",
 234         .insns = {
 235         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 236         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 237         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 238         BPF_ALU32_IMM(BPF_LSH, BPF_REG_0, 0),
 239         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 240         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 241         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 242         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 243         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 244         BPF_ALU32_IMM(BPF_LSH, BPF_REG_0, 1),
 245         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 246         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 247         BPF_EXIT_INSN(),
 248         },
 249         .result = ACCEPT,
 250         .retval = 0,
 251 },
 252 {
 253         "rsh32 reg zero extend check",
 254         .insns = {
 255         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 256         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 257         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 258         BPF_MOV64_IMM(BPF_REG_1, 1),
 259         BPF_ALU32_REG(BPF_RSH, BPF_REG_0, BPF_REG_1),
 260         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 261         BPF_EXIT_INSN(),
 262         },
 263         .result = ACCEPT,
 264         .retval = 0,
 265 },
 266 {
 267         "rsh32 imm zero extend check",
 268         .insns = {
 269         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 270         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 271         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 272         BPF_ALU32_IMM(BPF_RSH, BPF_REG_0, 0),
 273         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 274         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 275         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 276         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 277         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 278         BPF_ALU32_IMM(BPF_RSH, BPF_REG_0, 1),
 279         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 280         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 281         BPF_EXIT_INSN(),
 282         },
 283         .result = ACCEPT,
 284         .retval = 0,
 285 },
 286 {
 287         "neg32 reg zero extend check",
 288         .insns = {
 289         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 290         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 291         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 292         BPF_ALU32_IMM(BPF_NEG, BPF_REG_0, 0),
 293         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 294         BPF_EXIT_INSN(),
 295         },
 296         .result = ACCEPT,
 297         .retval = 0,
 298 },
 299 {
 300         "mod32 reg zero extend check",
 301         .insns = {
 302         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 303         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 304         BPF_MOV64_IMM(BPF_REG_0, -1),
 305         BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
 306         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 307         BPF_EXIT_INSN(),
 308         },
 309         .result = ACCEPT,
 310         .retval = 0,
 311 },
 312 {
 313         "mod32 imm zero extend check",
 314         .insns = {
 315         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 316         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 317         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 318         BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, 1),
 319         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 320         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 321         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 322         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 323         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 324         BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, 2),
 325         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 326         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 327         BPF_EXIT_INSN(),
 328         },
 329         .result = ACCEPT,
 330         .retval = 0,
 331 },
 332 {
 333         "xor32 reg zero extend check",
 334         .insns = {
 335         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 336         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 337         BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL),
 338         BPF_ALU32_REG(BPF_XOR, BPF_REG_0, BPF_REG_1),
 339         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 340         BPF_EXIT_INSN(),
 341         },
 342         .result = ACCEPT,
 343         .retval = 0,
 344 },
 345 {
 346         "xor32 imm zero extend check",
 347         .insns = {
 348         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 349         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 350         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 351         BPF_ALU32_IMM(BPF_XOR, BPF_REG_0, 1),
 352         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 353         BPF_EXIT_INSN(),
 354         },
 355         .result = ACCEPT,
 356         .retval = 0,
 357 },
 358 {
 359         "mov32 reg zero extend check",
 360         .insns = {
 361         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 362         BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL),
 363         BPF_ALU64_REG(BPF_OR, BPF_REG_1, BPF_REG_0),
 364         BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL),
 365         BPF_MOV32_REG(BPF_REG_0, BPF_REG_1),
 366         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 367         BPF_EXIT_INSN(),
 368         },
 369         .result = ACCEPT,
 370         .retval = 0,
 371 },
 372 {
 373         "mov32 imm zero extend check",
 374         .insns = {
 375         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 376         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 377         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 378         BPF_MOV32_IMM(BPF_REG_0, 0),
 379         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 380         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 381         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 382         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 383         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 384         BPF_MOV32_IMM(BPF_REG_0, 1),
 385         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 386         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 387         BPF_EXIT_INSN(),
 388         },
 389         .result = ACCEPT,
 390         .retval = 0,
 391 },
 392 {
 393         "arsh32 reg zero extend check",
 394         .insns = {
 395         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 396         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 397         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 398         BPF_MOV64_IMM(BPF_REG_1, 1),
 399         BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
 400         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 401         BPF_EXIT_INSN(),
 402         },
 403         .result = ACCEPT,
 404         .retval = 0,
 405 },
 406 {
 407         "arsh32 imm zero extend check",
 408         .insns = {
 409         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 410         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 411         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 412         BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 0),
 413         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 414         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 415         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 416         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 417         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 418         BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 1),
 419         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 420         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 421         BPF_EXIT_INSN(),
 422         },
 423         .result = ACCEPT,
 424         .retval = 0,
 425 },
 426 {
 427         "end16 (to_le) reg zero extend check",
 428         .insns = {
 429         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 430         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 431         BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
 432         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 433         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 434         BPF_ENDIAN(BPF_TO_LE, BPF_REG_0, 16),
 435         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 436         BPF_EXIT_INSN(),
 437         },
 438         .result = ACCEPT,
 439         .retval = 0,
 440 },
 441 {
 442         "end32 (to_le) reg zero extend check",
 443         .insns = {
 444         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 445         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 446         BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
 447         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 448         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 449         BPF_ENDIAN(BPF_TO_LE, BPF_REG_0, 32),
 450         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 451         BPF_EXIT_INSN(),
 452         },
 453         .result = ACCEPT,
 454         .retval = 0,
 455 },
 456 {
 457         "end16 (to_be) reg zero extend check",
 458         .insns = {
 459         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 460         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 461         BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
 462         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 463         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 464         BPF_ENDIAN(BPF_TO_BE, BPF_REG_0, 16),
 465         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 466         BPF_EXIT_INSN(),
 467         },
 468         .result = ACCEPT,
 469         .retval = 0,
 470 },
 471 {
 472         "end32 (to_be) reg zero extend check",
 473         .insns = {
 474         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 475         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 476         BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
 477         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 478         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
 479         BPF_ENDIAN(BPF_TO_BE, BPF_REG_0, 32),
 480         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 481         BPF_EXIT_INSN(),
 482         },
 483         .result = ACCEPT,
 484         .retval = 0,
 485 },
 486 {
 487         "ldx_b zero extend check",
 488         .insns = {
 489         BPF_MOV64_REG(BPF_REG_6, BPF_REG_10),
 490         BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4),
 491         BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c),
 492         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 493         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 494         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 495         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
 496         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 497         BPF_EXIT_INSN(),
 498         },
 499         .result = ACCEPT,
 500         .retval = 0,
 501 },
 502 {
 503         "ldx_h zero extend check",
 504         .insns = {
 505         BPF_MOV64_REG(BPF_REG_6, BPF_REG_10),
 506         BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4),
 507         BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c),
 508         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 509         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 510         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 511         BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_6, 0),
 512         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 513         BPF_EXIT_INSN(),
 514         },
 515         .result = ACCEPT,
 516         .retval = 0,
 517 },
 518 {
 519         "ldx_w zero extend check",
 520         .insns = {
 521         BPF_MOV64_REG(BPF_REG_6, BPF_REG_10),
 522         BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4),
 523         BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c),
 524         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 525         BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
 526         BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
 527         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0),
 528         BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
 529         BPF_EXIT_INSN(),
 530         },
 531         .result = ACCEPT,
 532         .retval = 0,
 533 },

/* [<][>][^][v][top][bottom][index][help] */