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
7SEC("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;						\
24l0_%=:	if r3 < 9 goto l1_%=;				\
25	/* r1 read is illegal at this point */		\
26	r0 -= r1;					\
27l1_%=:	exit;						\
28"	:
29	: __imm(bpf_ktime_get_ns)
30	: __clobber_all);
31}
32
33SEC("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;						\
49l0_%=:	if r3 < 9 goto l1_%=;				\
50	/* r1 read is illegal at this point */		\
51	r0 -= r1;					\
52l1_%=:	exit;						\
53"	:
54	: __imm(bpf_ktime_get_ns)
55	: __clobber_all);
56}
57
58char _license[] SEC("license") = "GPL";
59