162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Converted from tools/testing/selftests/bpf/verifier/regalloc.c */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/bpf.h>
562306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
662306a36Sopenharmony_ci#include "bpf_misc.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define MAX_ENTRIES 11
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct test_val {
1162306a36Sopenharmony_ci	unsigned int index;
1262306a36Sopenharmony_ci	int foo[MAX_ENTRIES];
1362306a36Sopenharmony_ci};
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct {
1662306a36Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_HASH);
1762306a36Sopenharmony_ci	__uint(max_entries, 1);
1862306a36Sopenharmony_ci	__type(key, long long);
1962306a36Sopenharmony_ci	__type(value, struct test_val);
2062306a36Sopenharmony_ci} map_hash_48b SEC(".maps");
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciSEC("tracepoint")
2362306a36Sopenharmony_ci__description("regalloc basic")
2462306a36Sopenharmony_ci__success __flag(BPF_F_ANY_ALIGNMENT)
2562306a36Sopenharmony_ci__naked void regalloc_basic(void)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	asm volatile ("					\
2862306a36Sopenharmony_ci	r6 = r1;					\
2962306a36Sopenharmony_ci	r1 = 0;						\
3062306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
3162306a36Sopenharmony_ci	r2 = r10;					\
3262306a36Sopenharmony_ci	r2 += -8;					\
3362306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
3462306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
3562306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
3662306a36Sopenharmony_ci	r7 = r0;					\
3762306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
3862306a36Sopenharmony_ci	r2 = r0;					\
3962306a36Sopenharmony_ci	if r0 s> 20 goto l0_%=;				\
4062306a36Sopenharmony_ci	if r2 s< 0 goto l0_%=;				\
4162306a36Sopenharmony_ci	r7 += r0;					\
4262306a36Sopenharmony_ci	r7 += r2;					\
4362306a36Sopenharmony_ci	r0 = *(u64*)(r7 + 0);				\
4462306a36Sopenharmony_cil0_%=:	exit;						\
4562306a36Sopenharmony_ci"	:
4662306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
4762306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
4862306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
4962306a36Sopenharmony_ci	: __clobber_all);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciSEC("tracepoint")
5362306a36Sopenharmony_ci__description("regalloc negative")
5462306a36Sopenharmony_ci__failure __msg("invalid access to map value, value_size=48 off=48 size=1")
5562306a36Sopenharmony_ci__naked void regalloc_negative(void)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	asm volatile ("					\
5862306a36Sopenharmony_ci	r6 = r1;					\
5962306a36Sopenharmony_ci	r1 = 0;						\
6062306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
6162306a36Sopenharmony_ci	r2 = r10;					\
6262306a36Sopenharmony_ci	r2 += -8;					\
6362306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
6462306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
6562306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
6662306a36Sopenharmony_ci	r7 = r0;					\
6762306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
6862306a36Sopenharmony_ci	r2 = r0;					\
6962306a36Sopenharmony_ci	if r0 s> 24 goto l0_%=;				\
7062306a36Sopenharmony_ci	if r2 s< 0 goto l0_%=;				\
7162306a36Sopenharmony_ci	r7 += r0;					\
7262306a36Sopenharmony_ci	r7 += r2;					\
7362306a36Sopenharmony_ci	r0 = *(u8*)(r7 + 0);				\
7462306a36Sopenharmony_cil0_%=:	exit;						\
7562306a36Sopenharmony_ci"	:
7662306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
7762306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
7862306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
7962306a36Sopenharmony_ci	: __clobber_all);
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciSEC("tracepoint")
8362306a36Sopenharmony_ci__description("regalloc src_reg mark")
8462306a36Sopenharmony_ci__success __flag(BPF_F_ANY_ALIGNMENT)
8562306a36Sopenharmony_ci__naked void regalloc_src_reg_mark(void)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	asm volatile ("					\
8862306a36Sopenharmony_ci	r6 = r1;					\
8962306a36Sopenharmony_ci	r1 = 0;						\
9062306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
9162306a36Sopenharmony_ci	r2 = r10;					\
9262306a36Sopenharmony_ci	r2 += -8;					\
9362306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
9462306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
9562306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
9662306a36Sopenharmony_ci	r7 = r0;					\
9762306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
9862306a36Sopenharmony_ci	r2 = r0;					\
9962306a36Sopenharmony_ci	if r0 s> 20 goto l0_%=;				\
10062306a36Sopenharmony_ci	r3 = 0;						\
10162306a36Sopenharmony_ci	if r3 s>= r2 goto l0_%=;			\
10262306a36Sopenharmony_ci	r7 += r0;					\
10362306a36Sopenharmony_ci	r7 += r2;					\
10462306a36Sopenharmony_ci	r0 = *(u64*)(r7 + 0);				\
10562306a36Sopenharmony_cil0_%=:	exit;						\
10662306a36Sopenharmony_ci"	:
10762306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
10862306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
10962306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
11062306a36Sopenharmony_ci	: __clobber_all);
11162306a36Sopenharmony_ci}
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ciSEC("tracepoint")
11462306a36Sopenharmony_ci__description("regalloc src_reg negative")
11562306a36Sopenharmony_ci__failure __msg("invalid access to map value, value_size=48 off=44 size=8")
11662306a36Sopenharmony_ci__flag(BPF_F_ANY_ALIGNMENT)
11762306a36Sopenharmony_ci__naked void regalloc_src_reg_negative(void)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	asm volatile ("					\
12062306a36Sopenharmony_ci	r6 = r1;					\
12162306a36Sopenharmony_ci	r1 = 0;						\
12262306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
12362306a36Sopenharmony_ci	r2 = r10;					\
12462306a36Sopenharmony_ci	r2 += -8;					\
12562306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
12662306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
12762306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
12862306a36Sopenharmony_ci	r7 = r0;					\
12962306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
13062306a36Sopenharmony_ci	r2 = r0;					\
13162306a36Sopenharmony_ci	if r0 s> 22 goto l0_%=;				\
13262306a36Sopenharmony_ci	r3 = 0;						\
13362306a36Sopenharmony_ci	if r3 s>= r2 goto l0_%=;			\
13462306a36Sopenharmony_ci	r7 += r0;					\
13562306a36Sopenharmony_ci	r7 += r2;					\
13662306a36Sopenharmony_ci	r0 = *(u64*)(r7 + 0);				\
13762306a36Sopenharmony_cil0_%=:	exit;						\
13862306a36Sopenharmony_ci"	:
13962306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
14062306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
14162306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
14262306a36Sopenharmony_ci	: __clobber_all);
14362306a36Sopenharmony_ci}
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ciSEC("tracepoint")
14662306a36Sopenharmony_ci__description("regalloc and spill")
14762306a36Sopenharmony_ci__success __flag(BPF_F_ANY_ALIGNMENT)
14862306a36Sopenharmony_ci__naked void regalloc_and_spill(void)
14962306a36Sopenharmony_ci{
15062306a36Sopenharmony_ci	asm volatile ("					\
15162306a36Sopenharmony_ci	r6 = r1;					\
15262306a36Sopenharmony_ci	r1 = 0;						\
15362306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
15462306a36Sopenharmony_ci	r2 = r10;					\
15562306a36Sopenharmony_ci	r2 += -8;					\
15662306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
15762306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
15862306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
15962306a36Sopenharmony_ci	r7 = r0;					\
16062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
16162306a36Sopenharmony_ci	r2 = r0;					\
16262306a36Sopenharmony_ci	if r0 s> 20 goto l0_%=;				\
16362306a36Sopenharmony_ci	/* r0 has upper bound that should propagate into r2 */\
16462306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r2;		/* spill r2 */	\
16562306a36Sopenharmony_ci	r0 = 0;						\
16662306a36Sopenharmony_ci	r2 = 0;				/* clear r0 and r2 */\
16762306a36Sopenharmony_ci	r3 = *(u64*)(r10 - 8);		/* fill r3 */	\
16862306a36Sopenharmony_ci	if r0 s>= r3 goto l0_%=;			\
16962306a36Sopenharmony_ci	/* r3 has lower and upper bounds */		\
17062306a36Sopenharmony_ci	r7 += r3;					\
17162306a36Sopenharmony_ci	r0 = *(u64*)(r7 + 0);				\
17262306a36Sopenharmony_cil0_%=:	exit;						\
17362306a36Sopenharmony_ci"	:
17462306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
17562306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
17662306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
17762306a36Sopenharmony_ci	: __clobber_all);
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ciSEC("tracepoint")
18162306a36Sopenharmony_ci__description("regalloc and spill negative")
18262306a36Sopenharmony_ci__failure __msg("invalid access to map value, value_size=48 off=48 size=8")
18362306a36Sopenharmony_ci__flag(BPF_F_ANY_ALIGNMENT)
18462306a36Sopenharmony_ci__naked void regalloc_and_spill_negative(void)
18562306a36Sopenharmony_ci{
18662306a36Sopenharmony_ci	asm volatile ("					\
18762306a36Sopenharmony_ci	r6 = r1;					\
18862306a36Sopenharmony_ci	r1 = 0;						\
18962306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
19062306a36Sopenharmony_ci	r2 = r10;					\
19162306a36Sopenharmony_ci	r2 += -8;					\
19262306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
19362306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
19462306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
19562306a36Sopenharmony_ci	r7 = r0;					\
19662306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
19762306a36Sopenharmony_ci	r2 = r0;					\
19862306a36Sopenharmony_ci	if r0 s> 48 goto l0_%=;				\
19962306a36Sopenharmony_ci	/* r0 has upper bound that should propagate into r2 */\
20062306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r2;		/* spill r2 */	\
20162306a36Sopenharmony_ci	r0 = 0;						\
20262306a36Sopenharmony_ci	r2 = 0;				/* clear r0 and r2 */\
20362306a36Sopenharmony_ci	r3 = *(u64*)(r10 - 8);		/* fill r3 */\
20462306a36Sopenharmony_ci	if r0 s>= r3 goto l0_%=;			\
20562306a36Sopenharmony_ci	/* r3 has lower and upper bounds */		\
20662306a36Sopenharmony_ci	r7 += r3;					\
20762306a36Sopenharmony_ci	r0 = *(u64*)(r7 + 0);				\
20862306a36Sopenharmony_cil0_%=:	exit;						\
20962306a36Sopenharmony_ci"	:
21062306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
21162306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
21262306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
21362306a36Sopenharmony_ci	: __clobber_all);
21462306a36Sopenharmony_ci}
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ciSEC("tracepoint")
21762306a36Sopenharmony_ci__description("regalloc three regs")
21862306a36Sopenharmony_ci__success __flag(BPF_F_ANY_ALIGNMENT)
21962306a36Sopenharmony_ci__naked void regalloc_three_regs(void)
22062306a36Sopenharmony_ci{
22162306a36Sopenharmony_ci	asm volatile ("					\
22262306a36Sopenharmony_ci	r6 = r1;					\
22362306a36Sopenharmony_ci	r1 = 0;						\
22462306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
22562306a36Sopenharmony_ci	r2 = r10;					\
22662306a36Sopenharmony_ci	r2 += -8;					\
22762306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
22862306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
22962306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
23062306a36Sopenharmony_ci	r7 = r0;					\
23162306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
23262306a36Sopenharmony_ci	r2 = r0;					\
23362306a36Sopenharmony_ci	r4 = r2;					\
23462306a36Sopenharmony_ci	if r0 s> 12 goto l0_%=;				\
23562306a36Sopenharmony_ci	if r2 s< 0 goto l0_%=;				\
23662306a36Sopenharmony_ci	r7 += r0;					\
23762306a36Sopenharmony_ci	r7 += r2;					\
23862306a36Sopenharmony_ci	r7 += r4;					\
23962306a36Sopenharmony_ci	r0 = *(u64*)(r7 + 0);				\
24062306a36Sopenharmony_cil0_%=:	exit;						\
24162306a36Sopenharmony_ci"	:
24262306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
24362306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
24462306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
24562306a36Sopenharmony_ci	: __clobber_all);
24662306a36Sopenharmony_ci}
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ciSEC("tracepoint")
24962306a36Sopenharmony_ci__description("regalloc after call")
25062306a36Sopenharmony_ci__success __flag(BPF_F_ANY_ALIGNMENT)
25162306a36Sopenharmony_ci__naked void regalloc_after_call(void)
25262306a36Sopenharmony_ci{
25362306a36Sopenharmony_ci	asm volatile ("					\
25462306a36Sopenharmony_ci	r6 = r1;					\
25562306a36Sopenharmony_ci	r1 = 0;						\
25662306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
25762306a36Sopenharmony_ci	r2 = r10;					\
25862306a36Sopenharmony_ci	r2 += -8;					\
25962306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
26062306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
26162306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
26262306a36Sopenharmony_ci	r7 = r0;					\
26362306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
26462306a36Sopenharmony_ci	r8 = r0;					\
26562306a36Sopenharmony_ci	r9 = r0;					\
26662306a36Sopenharmony_ci	call regalloc_after_call__1;			\
26762306a36Sopenharmony_ci	if r8 s> 20 goto l0_%=;				\
26862306a36Sopenharmony_ci	if r9 s< 0 goto l0_%=;				\
26962306a36Sopenharmony_ci	r7 += r8;					\
27062306a36Sopenharmony_ci	r7 += r9;					\
27162306a36Sopenharmony_ci	r0 = *(u64*)(r7 + 0);				\
27262306a36Sopenharmony_cil0_%=:	exit;						\
27362306a36Sopenharmony_ci"	:
27462306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
27562306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
27662306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
27762306a36Sopenharmony_ci	: __clobber_all);
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic __naked __noinline __attribute__((used))
28162306a36Sopenharmony_civoid regalloc_after_call__1(void)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	asm volatile ("					\
28462306a36Sopenharmony_ci	r0 = 0;						\
28562306a36Sopenharmony_ci	exit;						\
28662306a36Sopenharmony_ci"	::: __clobber_all);
28762306a36Sopenharmony_ci}
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ciSEC("tracepoint")
29062306a36Sopenharmony_ci__description("regalloc in callee")
29162306a36Sopenharmony_ci__success __flag(BPF_F_ANY_ALIGNMENT)
29262306a36Sopenharmony_ci__naked void regalloc_in_callee(void)
29362306a36Sopenharmony_ci{
29462306a36Sopenharmony_ci	asm volatile ("					\
29562306a36Sopenharmony_ci	r6 = r1;					\
29662306a36Sopenharmony_ci	r1 = 0;						\
29762306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
29862306a36Sopenharmony_ci	r2 = r10;					\
29962306a36Sopenharmony_ci	r2 += -8;					\
30062306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
30162306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
30262306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
30362306a36Sopenharmony_ci	r7 = r0;					\
30462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
30562306a36Sopenharmony_ci	r1 = r0;					\
30662306a36Sopenharmony_ci	r2 = r0;					\
30762306a36Sopenharmony_ci	r3 = r7;					\
30862306a36Sopenharmony_ci	call regalloc_in_callee__1;			\
30962306a36Sopenharmony_cil0_%=:	exit;						\
31062306a36Sopenharmony_ci"	:
31162306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
31262306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
31362306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
31462306a36Sopenharmony_ci	: __clobber_all);
31562306a36Sopenharmony_ci}
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_cistatic __naked __noinline __attribute__((used))
31862306a36Sopenharmony_civoid regalloc_in_callee__1(void)
31962306a36Sopenharmony_ci{
32062306a36Sopenharmony_ci	asm volatile ("					\
32162306a36Sopenharmony_ci	if r1 s> 20 goto l0_%=;				\
32262306a36Sopenharmony_ci	if r2 s< 0 goto l0_%=;				\
32362306a36Sopenharmony_ci	r3 += r1;					\
32462306a36Sopenharmony_ci	r3 += r2;					\
32562306a36Sopenharmony_ci	r0 = *(u64*)(r3 + 0);				\
32662306a36Sopenharmony_ci	exit;						\
32762306a36Sopenharmony_cil0_%=:	r0 = 0;						\
32862306a36Sopenharmony_ci	exit;						\
32962306a36Sopenharmony_ci"	::: __clobber_all);
33062306a36Sopenharmony_ci}
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ciSEC("tracepoint")
33362306a36Sopenharmony_ci__description("regalloc, spill, JEQ")
33462306a36Sopenharmony_ci__success
33562306a36Sopenharmony_ci__naked void regalloc_spill_jeq(void)
33662306a36Sopenharmony_ci{
33762306a36Sopenharmony_ci	asm volatile ("					\
33862306a36Sopenharmony_ci	r6 = r1;					\
33962306a36Sopenharmony_ci	r1 = 0;						\
34062306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r1;				\
34162306a36Sopenharmony_ci	r2 = r10;					\
34262306a36Sopenharmony_ci	r2 += -8;					\
34362306a36Sopenharmony_ci	r1 = %[map_hash_48b] ll;			\
34462306a36Sopenharmony_ci	call %[bpf_map_lookup_elem];			\
34562306a36Sopenharmony_ci	*(u64*)(r10 - 8) = r0;		/* spill r0 */	\
34662306a36Sopenharmony_ci	if r0 == 0 goto l0_%=;				\
34762306a36Sopenharmony_cil0_%=:	/* The verifier will walk the rest twice with r0 == 0 and r0 == map_value */\
34862306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
34962306a36Sopenharmony_ci	r2 = r0;					\
35062306a36Sopenharmony_ci	if r2 == 20 goto l1_%=;				\
35162306a36Sopenharmony_cil1_%=:	/* The verifier will walk the rest two more times with r0 == 20 and r0 == unknown */\
35262306a36Sopenharmony_ci	r3 = *(u64*)(r10 - 8);		/* fill r3 with map_value */\
35362306a36Sopenharmony_ci	if r3 == 0 goto l2_%=;		/* skip ldx if map_value == NULL */\
35462306a36Sopenharmony_ci	/* Buggy verifier will think that r3 == 20 here */\
35562306a36Sopenharmony_ci	r0 = *(u64*)(r3 + 0);		/* read from map_value */\
35662306a36Sopenharmony_cil2_%=:	exit;						\
35762306a36Sopenharmony_ci"	:
35862306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32),
35962306a36Sopenharmony_ci	  __imm(bpf_map_lookup_elem),
36062306a36Sopenharmony_ci	  __imm_addr(map_hash_48b)
36162306a36Sopenharmony_ci	: __clobber_all);
36262306a36Sopenharmony_ci}
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
365