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