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

/* [<][>][^][v][top][bottom][index][help] */
   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",
 180         .insns = {
 181         BPF_MOV32_IMM(BPF_REG_0, 0),
 182         {
 183                 .code  = BPF_ALU64 | BPF_END | BPF_TO_LE,
 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 d7",
 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 },

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