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"; 59