selftests/bpf: Fix erroneous bitmask operation
[platform/kernel/linux-rpi.git] / tools / testing / selftests / bpf / progs / verifier_reg_equal.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 #include <linux/bpf.h>
4 #include <bpf/bpf_helpers.h>
5 #include "bpf_misc.h"
6
7 SEC("socket")
8 __description("check w reg equal if r reg upper32 bits 0")
9 __success
10 __naked void subreg_equality_1(void)
11 {
12         asm volatile ("                                 \
13         call %[bpf_ktime_get_ns];                       \
14         *(u64 *)(r10 - 8) = r0;                         \
15         r2 = *(u32 *)(r10 - 8);                         \
16         /* At this point upper 4-bytes of r2 are 0,     \
17          * thus insn w3 = w2 should propagate reg id,   \
18          * and w2 < 9 comparison would also propagate   \
19          * the range for r3.                            \
20          */                                             \
21         w3 = w2;                                        \
22         if w2 < 9 goto l0_%=;                           \
23         exit;                                           \
24 l0_%=:  if r3 < 9 goto l1_%=;                           \
25         /* r1 read is illegal at this point */          \
26         r0 -= r1;                                       \
27 l1_%=:  exit;                                           \
28 "       :
29         : __imm(bpf_ktime_get_ns)
30         : __clobber_all);
31 }
32
33 SEC("socket")
34 __description("check w reg not equal if r reg upper32 bits not 0")
35 __failure __msg("R1 !read_ok")
36 __naked void subreg_equality_2(void)
37 {
38         asm volatile ("                                 \
39         call %[bpf_ktime_get_ns];                       \
40         r2 = r0;                                        \
41         /* Upper 4-bytes of r2 may not be 0, thus insn  \
42          * w3 = w2 should not propagate reg id, and     \
43          * w2 < 9 comparison should not propagate       \
44          * the range for r3 either.                     \
45          */                                             \
46         w3 = w2;                                        \
47         if w2 < 9 goto l0_%=;                           \
48         exit;                                           \
49 l0_%=:  if r3 < 9 goto l1_%=;                           \
50         /* r1 read is illegal at this point */          \
51         r0 -= r1;                                       \
52 l1_%=:  exit;                                           \
53 "       :
54         : __imm(bpf_ktime_get_ns)
55         : __clobber_all);
56 }
57
58 char _license[] SEC("license") = "GPL";