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

/* [<][>][^][v][top][bottom][index][help] */
   1 {
   2         "spin_lock: test1 success",
   3         .insns = {
   4         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
   5         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
   6         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
   7         BPF_LD_MAP_FD(BPF_REG_1,
   8                       0),
   9         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  10         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  11         BPF_EXIT_INSN(),
  12         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
  13         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  14         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
  15         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
  16         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  17         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
  18         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0),
  19         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
  20         BPF_MOV64_IMM(BPF_REG_0, 0),
  21         BPF_EXIT_INSN(),
  22         },
  23         .fixup_map_spin_lock = { 3 },
  24         .result = ACCEPT,
  25         .result_unpriv = REJECT,
  26         .errstr_unpriv = "",
  27         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  28 },
  29 {
  30         "spin_lock: test2 direct ld/st",
  31         .insns = {
  32         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  33         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  34         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  35         BPF_LD_MAP_FD(BPF_REG_1,
  36                       0),
  37         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  38         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  39         BPF_EXIT_INSN(),
  40         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
  41         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  42         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
  43         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
  44         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  45         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
  46         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
  47         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
  48         BPF_MOV64_IMM(BPF_REG_0, 0),
  49         BPF_EXIT_INSN(),
  50         },
  51         .fixup_map_spin_lock = { 3 },
  52         .result = REJECT,
  53         .errstr = "cannot be accessed directly",
  54         .result_unpriv = REJECT,
  55         .errstr_unpriv = "",
  56         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  57 },
  58 {
  59         "spin_lock: test3 direct ld/st",
  60         .insns = {
  61         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  62         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  63         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  64         BPF_LD_MAP_FD(BPF_REG_1,
  65                       0),
  66         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  67         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  68         BPF_EXIT_INSN(),
  69         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
  70         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  71         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
  72         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
  73         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  74         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
  75         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 1),
  76         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
  77         BPF_MOV64_IMM(BPF_REG_0, 0),
  78         BPF_EXIT_INSN(),
  79         },
  80         .fixup_map_spin_lock = { 3 },
  81         .result = REJECT,
  82         .errstr = "cannot be accessed directly",
  83         .result_unpriv = REJECT,
  84         .errstr_unpriv = "",
  85         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
  86         .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  87 },
  88 {
  89         "spin_lock: test4 direct ld/st",
  90         .insns = {
  91         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
  92         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  93         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  94         BPF_LD_MAP_FD(BPF_REG_1,
  95                       0),
  96         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  97         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  98         BPF_EXIT_INSN(),
  99         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 100         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 101         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 102         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 103         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 104         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 105         BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_6, 3),
 106         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 107         BPF_MOV64_IMM(BPF_REG_0, 0),
 108         BPF_EXIT_INSN(),
 109         },
 110         .fixup_map_spin_lock = { 3 },
 111         .result = REJECT,
 112         .errstr = "cannot be accessed directly",
 113         .result_unpriv = REJECT,
 114         .errstr_unpriv = "",
 115         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 116         .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 117 },
 118 {
 119         "spin_lock: test5 call within a locked region",
 120         .insns = {
 121         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
 122         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 123         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 124         BPF_LD_MAP_FD(BPF_REG_1,
 125                       0),
 126         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 127         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 128         BPF_EXIT_INSN(),
 129         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 130         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 131         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 132         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 133         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
 134         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 135         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 136         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 137         BPF_MOV64_IMM(BPF_REG_0, 0),
 138         BPF_EXIT_INSN(),
 139         },
 140         .fixup_map_spin_lock = { 3 },
 141         .result = REJECT,
 142         .errstr = "calls are not allowed",
 143         .result_unpriv = REJECT,
 144         .errstr_unpriv = "",
 145         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 146 },
 147 {
 148         "spin_lock: test6 missing unlock",
 149         .insns = {
 150         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
 151         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 152         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 153         BPF_LD_MAP_FD(BPF_REG_1,
 154                       0),
 155         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 156         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 157         BPF_EXIT_INSN(),
 158         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 159         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 160         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 161         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 162         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 163         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 164         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0),
 165         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 166         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 167         BPF_MOV64_IMM(BPF_REG_0, 0),
 168         BPF_EXIT_INSN(),
 169         },
 170         .fixup_map_spin_lock = { 3 },
 171         .result = REJECT,
 172         .errstr = "unlock is missing",
 173         .result_unpriv = REJECT,
 174         .errstr_unpriv = "",
 175         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 176 },
 177 {
 178         "spin_lock: test7 unlock without lock",
 179         .insns = {
 180         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
 181         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 182         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 183         BPF_LD_MAP_FD(BPF_REG_1,
 184                       0),
 185         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 186         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 187         BPF_EXIT_INSN(),
 188         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 189         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 190         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 191         BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
 192         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 193         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 194         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 195         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0),
 196         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 197         BPF_MOV64_IMM(BPF_REG_0, 0),
 198         BPF_EXIT_INSN(),
 199         },
 200         .fixup_map_spin_lock = { 3 },
 201         .result = REJECT,
 202         .errstr = "without taking a lock",
 203         .result_unpriv = REJECT,
 204         .errstr_unpriv = "",
 205         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 206 },
 207 {
 208         "spin_lock: test8 double lock",
 209         .insns = {
 210         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
 211         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 212         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 213         BPF_LD_MAP_FD(BPF_REG_1,
 214                       0),
 215         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 216         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 217         BPF_EXIT_INSN(),
 218         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 219         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 220         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 221         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 222         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 223         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 224         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 225         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 226         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 227         BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0),
 228         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 229         BPF_MOV64_IMM(BPF_REG_0, 0),
 230         BPF_EXIT_INSN(),
 231         },
 232         .fixup_map_spin_lock = { 3 },
 233         .result = REJECT,
 234         .errstr = "calls are not allowed",
 235         .result_unpriv = REJECT,
 236         .errstr_unpriv = "",
 237         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 238 },
 239 {
 240         "spin_lock: test9 different lock",
 241         .insns = {
 242         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
 243         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 244         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 245         BPF_LD_MAP_FD(BPF_REG_1,
 246                       0),
 247         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 248         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 249         BPF_EXIT_INSN(),
 250         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 251         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 252         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 253         BPF_LD_MAP_FD(BPF_REG_1,
 254                       0),
 255         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 256         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 257         BPF_EXIT_INSN(),
 258         BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
 259         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 260         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 261         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 262         BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
 263         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 264         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 265         BPF_MOV64_IMM(BPF_REG_0, 0),
 266         BPF_EXIT_INSN(),
 267         },
 268         .fixup_map_spin_lock = { 3, 11 },
 269         .result = REJECT,
 270         .errstr = "unlock of different lock",
 271         .result_unpriv = REJECT,
 272         .errstr_unpriv = "",
 273         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 274 },
 275 {
 276         "spin_lock: test10 lock in subprog without unlock",
 277         .insns = {
 278         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
 279         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 280         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 281         BPF_LD_MAP_FD(BPF_REG_1,
 282                       0),
 283         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 284         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 285         BPF_EXIT_INSN(),
 286         BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
 287         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 288         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 289         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
 290         BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 291         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 292         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 293         BPF_MOV64_IMM(BPF_REG_0, 1),
 294         BPF_EXIT_INSN(),
 295         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 296         BPF_MOV64_IMM(BPF_REG_0, 0),
 297         BPF_EXIT_INSN(),
 298         },
 299         .fixup_map_spin_lock = { 3 },
 300         .result = REJECT,
 301         .errstr = "unlock is missing",
 302         .result_unpriv = REJECT,
 303         .errstr_unpriv = "",
 304         .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 305 },
 306 {
 307         "spin_lock: test11 ld_abs under lock",
 308         .insns = {
 309         BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
 310         BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0),
 311         BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 312         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
 313         BPF_LD_MAP_FD(BPF_REG_1,
 314                       0),
 315         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
 316         BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
 317         BPF_EXIT_INSN(),
 318         BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
 319         BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 320         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 321         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_lock),
 322         BPF_LD_ABS(BPF_B, 0),
 323         BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
 324         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
 325         BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_spin_unlock),
 326         BPF_MOV64_IMM(BPF_REG_0, 0),
 327         BPF_EXIT_INSN(),
 328         },
 329         .fixup_map_spin_lock = { 4 },
 330         .result = REJECT,
 331         .errstr = "inside bpf_spin_lock",
 332         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
 333 },

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