brintos

brintos / linux-shallow public Read only

0
0
Text · 1.4 KiB · dc1d8c3 Raw
59 lines · c
1// SPDX-License-Identifier: GPL-2.02 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__success10__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