#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include "bpf_misc.h"
SEC("socket")
__success __log_level(2)
__msg("6: (0f) r3 += r0")
__msg("frame0: regs=r0 stack= before 4: (25) if r1 > 0x7 goto pc+0")
__msg("frame0: parent state regs=r0,r1,r2 stack=:")
__msg("frame0: regs=r0,r1,r2 stack= before 3: (bf) r2 = r0")
__msg("from 4 to 5: ")
__msg("6: (0f) r3 += r0")
__msg("frame0: regs=r0 stack= before 5: (bf) r3 = r10")
__msg("frame0: regs=r0 stack= before 4: (25) if r1 > 0x7 goto pc+0")
__msg("frame0: parent state regs= stack=:")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void linked_regs_bpf_k(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r2 = r0;"
"if r1 > 7 goto +0;"
"r3 = r10;"
"r3 += r0;"
"r1 = r1;"
"r2 = r2;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__flag(BPF_F_TEST_STATE_FREQ)
__msg("frame0: regs=r0 stack= before 5: (2d) if r1 > r3 goto pc+0")
__msg("frame0: parent state regs=r0,r1,r2,r3 stack=:")
__msg("frame0: regs=r0,r1,r2,r3 stack= before 4: (b7) r3 = 7")
__naked void linked_regs_bpf_x_src(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r2 = r0;"
"r3 = 7;"
"if r1 > r3 goto +0;"
"r4 = r10;"
"r4 += r0;"
"r1 = r1;"
"r2 = r2;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__flag(BPF_F_TEST_STATE_FREQ)
__msg("frame0: regs=r3 stack= before 5: (2d) if r1 > r3 goto pc+0")
__msg("frame0: parent state regs=r0,r1,r2,r3 stack=:")
__msg("frame0: regs=r0,r1,r2,r3 stack= before 4: (b7) r3 = 7")
__naked void linked_regs_bpf_x_dst(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r2 = r0;"
"r3 = 7;"
"if r1 > r3 goto +0;"
"r4 = r10;"
"r4 += r3;"
"r0 = r0;"
"r1 = r1;"
"r2 = r2;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("7: (0f) r3 += r0")
__msg("frame0: regs=r0 stack= before 6: (bf) r3 = r10")
__msg("frame0: parent state regs=r0 stack=:")
__msg("frame0: regs=r0 stack= before 5: (25) if r0 > 0x7 goto pc+0")
__msg("frame0: parent state regs=r0,r2 stack=:")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void linked_regs_broken_link(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r2 = r0;"
"r1 = 0;"
"if r0 > 7 goto +0;"
"r3 = r10;"
"r3 += r0;"
"r1 = r1;"
"r2 = r2;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("17: (0f) r2 += r1")
__msg("frame2: last_idx 17 first_idx 14 subseq_idx -1 ")
__msg("frame2: regs=r1 stack= before 16: (bf) r2 = r10")
__msg("frame2: parent state regs=r1 stack=")
__msg("frame1: parent state regs= stack=")
__msg("frame0: parent state regs= stack=")
__msg("frame2: last_idx 13 first_idx 13 subseq_idx 14 ")
__msg("frame2: regs=r1 stack= before 13: (25) if r1 > 0x7 goto pc+0")
__msg("frame2: parent state regs=r1 stack=")
__msg("frame1: parent state regs=r6,r7 stack=")
__msg("frame0: parent state regs=r6 stack=")
__msg("frame2: last_idx 9 first_idx 9 subseq_idx 13")
__msg("frame2: regs=r1 stack= before 9: (85) call pc+3")
__msg("frame1: parent state regs=r1,r6,r7 stack=")
__msg("frame0: parent state regs=r6 stack=")
__msg("frame1: last_idx 8 first_idx 7 subseq_idx 9")
__msg("frame1: regs=r1,r6,r7 stack= before 8: (bf) r7 = r1")
__msg("frame1: regs=r1,r6 stack= before 7: (bf) r6 = r1")
__msg("frame1: parent state regs=r1 stack=")
__msg("frame0: parent state regs=r6 stack=")
__msg("frame1: last_idx 4 first_idx 4 subseq_idx 7")
__msg("frame1: regs=r1 stack= before 4: (85) call pc+2")
__msg("frame0: parent state regs=r1,r6 stack=")
__msg("frame0: last_idx 3 first_idx 1 subseq_idx 4")
__msg("frame0: regs=r1,r6 stack= before 3: (bf) r6 = r0")
__msg("frame0: regs=r0,r1 stack= before 2: (bf) r1 = r0")
__msg("frame0: regs=r0 stack= before 1: (57) r0 &= 255")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void precision_many_frames(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r6 = r0;"
"call precision_many_frames__foo;"
"r6 = r6;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
static __naked __noinline __used
void precision_many_frames__foo(void)
{
asm volatile (
"r6 = r1;"
"r7 = r1;"
"call precision_many_frames__bar;"
"r6 = r6;"
"r7 = r7;"
"exit"
::: __clobber_all);
}
static __naked __noinline __used
void precision_many_frames__bar(void)
{
asm volatile (
"if r1 > 7 goto +0;"
"r6 = 0;"
"r7 = 0;"
"r2 = r10;"
"r2 += r1;"
"r0 = 0;"
"exit;"
::: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("12: (0f) r2 += r1")
__msg("frame1: regs=r1 stack= before 11: (bf) r2 = r10")
__msg("frame1: regs=r1 stack= before 10: (25) if r1 > 0x7 goto pc+0")
__msg("frame1: regs=r1 stack=-8,-16 before 9: (7b) *(u64 *)(r10 -16) = r1")
__msg("frame1: regs=r1 stack=-8 before 8: (7b) *(u64 *)(r10 -8) = r1")
__msg("frame1: regs=r1 stack= before 4: (85) call pc+3")
__msg("frame0: regs=r1 stack=-8 before 3: (7b) *(u64 *)(r10 -8) = r1")
__msg("frame0: regs=r1 stack= before 2: (bf) r1 = r0")
__msg("frame0: regs=r0 stack= before 1: (57) r0 &= 255")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void precision_stack(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"*(u64*)(r10 - 8) = r1;"
"call precision_stack__foo;"
"r0 = *(u64*)(r10 - 8);"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
static __naked __noinline __used
void precision_stack__foo(void)
{
asm volatile (
"*(u64*)(r10 - 8) = r1;"
"*(u64*)(r10 - 16) = r1;"
"if r1 > 7 goto +0;"
"r2 = r10;"
"r2 += r1;"
"r0 = *(u64*)(r10 - 8);"
"r0 = *(u64*)(r10 - 16);"
"exit"
::: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("12: (0f) r3 += r7")
__msg("frame0: regs=r7 stack= before 11: (bf) r3 = r10")
__msg("frame0: regs=r7 stack= before 9: (25) if r7 > 0x7 goto pc+0")
__msg("frame0: regs=r6,r7 stack= before 3: (bf) r7 = r0")
__msg("frame0: regs=r0,r6 stack= before 2: (bf) r6 = r0")
__msg("13: (0f) r3 += r9")
__msg("frame0: regs=r9 stack= before 12: (0f) r3 += r7")
__msg("frame0: regs=r9 stack= before 10: (25) if r9 > 0x7 goto pc+0")
__msg("frame0: regs=r8,r9 stack= before 7: (bf) r9 = r0")
__msg("frame0: regs=r0,r8 stack= before 6: (bf) r8 = r0")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void precision_two_ids(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r6 = r0;"
"r7 = r0;"
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r8 = r0;"
"r9 = r0;"
"r0 = 0;"
"if r7 > 7 goto +0;"
"if r9 > 7 goto +0;"
"r3 = r10;"
"r3 += r7;"
"r3 += r9;"
"r6 = r6;"
"r8 = r8;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__flag(BPF_F_TEST_STATE_FREQ)
__msg("7: (25) if r0 > 0x7 goto pc+0 ; R0=scalar(id=1")
__msg("12: (bf) r5 = r5 ; R5=scalar(id=2")
__msg("frame0: regs=r0 stack= before 7: (25) if r0 > 0x7 goto pc+0")
__msg("frame0: parent state regs=r0,r1,r2,r3,r4 stack=:")
__naked void linked_regs_too_many_regs(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r2 = r0;"
"r3 = r0;"
"r4 = r0;"
"r5 = r0;"
"if r0 > 7 goto +0;"
"r1 = r1;"
"r2 = r2;"
"r3 = r3;"
"r4 = r4;"
"r5 = r5;"
"r7 = r10;"
"r7 += r0;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__failure __log_level(2)
__flag(BPF_F_TEST_STATE_FREQ)
__msg("regs=r7 stack= before 5: (3d) if r8 >= r0")
__msg("parent state regs=r0,r7,r8")
__msg("regs=r0,r7,r8 stack= before 4: (25) if r0 > 0x1")
__msg("div by zero")
__naked void linked_regs_broken_link_2(void)
{
asm volatile (
"call %[bpf_get_prandom_u32];"
"r7 = r0;"
"r8 = r0;"
"call %[bpf_get_prandom_u32];"
"if r0 > 1 goto +0;"
"if r8 >= r0 goto 1f;"
"r8 += r8;"
"if r7 == 0 goto 1f;"
"r0 /= 0;"
"1:"
"r0 = 42;"
"exit;"
:
: __imm(bpf_get_prandom_u32)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("3: (25) if r1 > 0x100 goto pc+0")
__msg("frame0: regs=r1 stack= before 2: (bf) r1 = r0")
__naked void cjmp_no_linked_regs_trigger(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"if r1 > 256 goto +0;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__failure __msg("register with unbounded min value")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void check_ids_in_regsafe(void)
{
asm volatile (
"r1 = 0;"
"*(u64*)(r10 - 8) = r1;"
"r9 = r10;"
"r9 += -8;"
"call %[bpf_ktime_get_ns];"
"r7 = r0;"
"call %[bpf_ktime_get_ns];"
"r6 = r0;"
"if r6 > r7 goto l1_%=;"
"r7 = r6;"
"l1_%=:"
"if r7 > 4 goto l2_%=;"
"r9 += r6;"
"r0 = *(u8*)(r9 + 0);"
"l2_%=:"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__failure __msg("register with unbounded min value")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void check_ids_in_regsafe_2(void)
{
asm volatile (
"r1 = 0;"
"*(u64*)(r10 - 8) = r1;"
"r9 = r10;"
"r9 += -16;"
"call %[bpf_ktime_get_ns];"
"r8 = r0;"
"call %[bpf_ktime_get_ns];"
"r7 = r0;"
"call %[bpf_ktime_get_ns];"
"r6 = r0;"
"r0 = 0;"
"if r6 > r7 goto l1_%=;"
"r6 = r7;"
"l0_%=:"
"if r7 > 4 goto l2_%=;"
"r9 += r6;"
"r9 += r7;"
"r9 += r8;"
"r0 = *(u8*)(r9 + 0);"
"l2_%=:"
"r0 = 0;"
"exit;"
"l1_%=:"
"r6 = r8;"
"goto l0_%=;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("14: (1d) if r3 == r4 goto pc+0")
__msg("frame 0: propagating r3,r4")
__msg("14: safe")
__msg("processed 18 insns")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void no_scalar_id_for_const(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"if r0 > 7 goto l0_%=;"
"r1 = 0;"
"r1 ^= r1;"
"r1 = r1;"
"r3 = r1;"
"r4 = r1;"
"goto l1_%=;"
"l0_%=:"
"r1 = 0;"
"r1 ^= r1;"
"r2 = 0;"
"r2 ^= r2;"
"r3 = r1;"
"r4 = r2;"
"l1_%=:"
"if r3 == r4 goto +0;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("14: (1e) if w3 == w4 goto pc+0")
__msg("frame 0: propagating r3,r4")
__msg("14: safe")
__msg("processed 18 insns")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void no_scalar_id_for_const32(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"if r0 > 7 goto l0_%=;"
"w1 = 0;"
"w1 ^= w1;"
"w1 = w1;"
"w3 = w1;"
"w4 = w1;"
"goto l1_%=;"
"l0_%=:"
"w1 = 0;"
"w1 ^= w1;"
"w2 = 0;"
"w2 ^= w2;"
"w3 = w1;"
"w4 = w2;"
"l1_%=:"
"if w3 == w4 goto +0;"
"r0 = 0;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("6: (25) if r6 > 0x7 goto pc+1")
__msg("7: (57) r1 &= 255")
__msg("8: (bf) r2 = r10")
__msg("from 6 to 8: safe")
__msg("processed 12 insns")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void ignore_unique_scalar_ids_cur(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r6 = r0;"
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r0 = 0;"
"if r6 > 7 goto l0_%=;"
"r1 &= 0xff;"
"l0_%=:"
"r2 = r10;"
"r2 += r1;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("6: (25) if r6 > 0x7 goto pc+1")
__msg("7: (05) goto pc+1")
__msg("9: (bf) r2 = r10")
__msg("9: safe")
__msg("processed 13 insns")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void ignore_unique_scalar_ids_old(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r6 = r0;"
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r1 = r0;"
"r0 = 0;"
"if r6 > 7 goto l1_%=;"
"goto l0_%=;"
"l1_%=:"
"r1 &= 0xff;"
"l0_%=:"
"r2 = r10;"
"r2 += r1;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("12: safe")
__msg("processed 17 insns")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void two_nil_old_ids_one_cur_id(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r6 = r0;"
"r6 *= 1;"
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r7 = r0;"
"r7 *= 1;"
"r0 = 0;"
"if r6 > r7 goto l0_%=;"
"goto l1_%=;"
"l0_%=:"
"r6 = r7;"
"l1_%=:"
"r2 = r10;"
"r2 += r6;"
"r2 += r7;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__success __log_level(2)
__msg("16: (95) exit")
__msg("16: (95) exit")
__msg("processed 22 insns")
__flag(BPF_F_TEST_STATE_FREQ)
__naked void two_old_ids_one_cur_id(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r6 = r0;"
"r8 = r0;"
"call %[bpf_ktime_get_ns];"
"r0 &= 0xff;"
"r7 = r0;"
"r9 = r0;"
"r0 = 0;"
"if r6 > r7 goto l0_%=;"
"goto l1_%=;"
"l0_%=:"
"r6 = r7;"
"l1_%=:"
"r2 = r10;"
"r2 += r6;"
"r2 += r7;"
"r9 += r8;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
SEC("socket")
__flag(BPF_F_TEST_RND_HI32)
__success
__retval(0)
__log_level(2)
__msg("4: (77) r1 >>= 32 ; R1=0")
__msg("5: (bf) r0 = r1 ; R0=0 R1=0")
__msg("6: (95) exit")
__msg("from 3 to 4")
__msg("4: (77) r1 >>= 32 ; R1=0")
__msg("5: (bf) r0 = r1 ; R0=0 R1=0")
__msg("6: (95) exit")
__xlated("call unknown")
__xlated("r0 &= 2147483647")
__xlated("w1 = w0")
#if !defined(__TARGET_ARCH_x86) && !defined(__TARGET_ARCH_arm64)
__xlated("w1 = w1")
#endif
__xlated("if w0 < 0xa goto pc+0")
__xlated("r1 >>= 32")
__xlated("r0 = r1")
__xlated("exit")
__naked void linked_regs_and_subreg_def(void)
{
asm volatile (
"call %[bpf_ktime_get_ns];"
"r0 &= 0x7fffffff;"
"w1 = w0;"
"if w0 < 10 goto +0;"
"r1 >>= 32;"
"r0 = r1;"
"exit;"
:
: __imm(bpf_ktime_get_ns)
: __clobber_all);
}
char _license[] SEC("license") = "GPL";