162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Converted from tools/testing/selftests/bpf/verifier/subreg.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/* This file contains sub-register zero extension checks for insns defining
962306a36Sopenharmony_ci * sub-registers, meaning:
1062306a36Sopenharmony_ci *   - All insns under BPF_ALU class. Their BPF_ALU32 variants or narrow width
1162306a36Sopenharmony_ci *     forms (BPF_END) could define sub-registers.
1262306a36Sopenharmony_ci *   - Narrow direct loads, BPF_B/H/W | BPF_LDX.
1362306a36Sopenharmony_ci *   - BPF_LD is not exposed to JIT back-ends, so no need for testing.
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * "get_prandom_u32" is used to initialize low 32-bit of some registers to
1662306a36Sopenharmony_ci * prevent potential optimizations done by verifier or JIT back-ends which could
1762306a36Sopenharmony_ci * optimize register back into constant when range info shows one register is a
1862306a36Sopenharmony_ci * constant.
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciSEC("socket")
2262306a36Sopenharmony_ci__description("add32 reg zero extend check")
2362306a36Sopenharmony_ci__success __success_unpriv __retval(0)
2462306a36Sopenharmony_ci__naked void add32_reg_zero_extend_check(void)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	asm volatile ("					\
2762306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
2862306a36Sopenharmony_ci	r1 = r0;					\
2962306a36Sopenharmony_ci	r0 = 0x100000000 ll;				\
3062306a36Sopenharmony_ci	w0 += w1;					\
3162306a36Sopenharmony_ci	r0 >>= 32;					\
3262306a36Sopenharmony_ci	exit;						\
3362306a36Sopenharmony_ci"	:
3462306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
3562306a36Sopenharmony_ci	: __clobber_all);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciSEC("socket")
3962306a36Sopenharmony_ci__description("add32 imm zero extend check")
4062306a36Sopenharmony_ci__success __success_unpriv __retval(0)
4162306a36Sopenharmony_ci__naked void add32_imm_zero_extend_check(void)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	asm volatile ("					\
4462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
4562306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
4662306a36Sopenharmony_ci	r0 |= r1;					\
4762306a36Sopenharmony_ci	/* An insn could have no effect on the low 32-bit, for example:\
4862306a36Sopenharmony_ci	 *   a = a + 0					\
4962306a36Sopenharmony_ci	 *   a = a | 0					\
5062306a36Sopenharmony_ci	 *   a = a & -1					\
5162306a36Sopenharmony_ci	 * But, they should still zero high 32-bit.	\
5262306a36Sopenharmony_ci	 */						\
5362306a36Sopenharmony_ci	w0 += 0;					\
5462306a36Sopenharmony_ci	r0 >>= 32;					\
5562306a36Sopenharmony_ci	r6 = r0;					\
5662306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
5762306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
5862306a36Sopenharmony_ci	r0 |= r1;					\
5962306a36Sopenharmony_ci	w0 += -2;					\
6062306a36Sopenharmony_ci	r0 >>= 32;					\
6162306a36Sopenharmony_ci	r0 |= r6;					\
6262306a36Sopenharmony_ci	exit;						\
6362306a36Sopenharmony_ci"	:
6462306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
6562306a36Sopenharmony_ci	: __clobber_all);
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciSEC("socket")
6962306a36Sopenharmony_ci__description("sub32 reg zero extend check")
7062306a36Sopenharmony_ci__success __success_unpriv __retval(0)
7162306a36Sopenharmony_ci__naked void sub32_reg_zero_extend_check(void)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	asm volatile ("					\
7462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
7562306a36Sopenharmony_ci	r1 = r0;					\
7662306a36Sopenharmony_ci	r0 = 0x1ffffffff ll;				\
7762306a36Sopenharmony_ci	w0 -= w1;					\
7862306a36Sopenharmony_ci	r0 >>= 32;					\
7962306a36Sopenharmony_ci	exit;						\
8062306a36Sopenharmony_ci"	:
8162306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
8262306a36Sopenharmony_ci	: __clobber_all);
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciSEC("socket")
8662306a36Sopenharmony_ci__description("sub32 imm zero extend check")
8762306a36Sopenharmony_ci__success __success_unpriv __retval(0)
8862306a36Sopenharmony_ci__naked void sub32_imm_zero_extend_check(void)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	asm volatile ("					\
9162306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
9262306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
9362306a36Sopenharmony_ci	r0 |= r1;					\
9462306a36Sopenharmony_ci	w0 -= 0;					\
9562306a36Sopenharmony_ci	r0 >>= 32;					\
9662306a36Sopenharmony_ci	r6 = r0;					\
9762306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
9862306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
9962306a36Sopenharmony_ci	r0 |= r1;					\
10062306a36Sopenharmony_ci	w0 -= 1;					\
10162306a36Sopenharmony_ci	r0 >>= 32;					\
10262306a36Sopenharmony_ci	r0 |= r6;					\
10362306a36Sopenharmony_ci	exit;						\
10462306a36Sopenharmony_ci"	:
10562306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
10662306a36Sopenharmony_ci	: __clobber_all);
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciSEC("socket")
11062306a36Sopenharmony_ci__description("mul32 reg zero extend check")
11162306a36Sopenharmony_ci__success __success_unpriv __retval(0)
11262306a36Sopenharmony_ci__naked void mul32_reg_zero_extend_check(void)
11362306a36Sopenharmony_ci{
11462306a36Sopenharmony_ci	asm volatile ("					\
11562306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
11662306a36Sopenharmony_ci	r1 = r0;					\
11762306a36Sopenharmony_ci	r0 = 0x100000001 ll;				\
11862306a36Sopenharmony_ci	w0 *= w1;					\
11962306a36Sopenharmony_ci	r0 >>= 32;					\
12062306a36Sopenharmony_ci	exit;						\
12162306a36Sopenharmony_ci"	:
12262306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
12362306a36Sopenharmony_ci	: __clobber_all);
12462306a36Sopenharmony_ci}
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ciSEC("socket")
12762306a36Sopenharmony_ci__description("mul32 imm zero extend check")
12862306a36Sopenharmony_ci__success __success_unpriv __retval(0)
12962306a36Sopenharmony_ci__naked void mul32_imm_zero_extend_check(void)
13062306a36Sopenharmony_ci{
13162306a36Sopenharmony_ci	asm volatile ("					\
13262306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
13362306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
13462306a36Sopenharmony_ci	r0 |= r1;					\
13562306a36Sopenharmony_ci	w0 *= 1;					\
13662306a36Sopenharmony_ci	r0 >>= 32;					\
13762306a36Sopenharmony_ci	r6 = r0;					\
13862306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
13962306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
14062306a36Sopenharmony_ci	r0 |= r1;					\
14162306a36Sopenharmony_ci	w0 *= -1;					\
14262306a36Sopenharmony_ci	r0 >>= 32;					\
14362306a36Sopenharmony_ci	r0 |= r6;					\
14462306a36Sopenharmony_ci	exit;						\
14562306a36Sopenharmony_ci"	:
14662306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
14762306a36Sopenharmony_ci	: __clobber_all);
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ciSEC("socket")
15162306a36Sopenharmony_ci__description("div32 reg zero extend check")
15262306a36Sopenharmony_ci__success __success_unpriv __retval(0)
15362306a36Sopenharmony_ci__naked void div32_reg_zero_extend_check(void)
15462306a36Sopenharmony_ci{
15562306a36Sopenharmony_ci	asm volatile ("					\
15662306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
15762306a36Sopenharmony_ci	r1 = r0;					\
15862306a36Sopenharmony_ci	r0 = -1;					\
15962306a36Sopenharmony_ci	w0 /= w1;					\
16062306a36Sopenharmony_ci	r0 >>= 32;					\
16162306a36Sopenharmony_ci	exit;						\
16262306a36Sopenharmony_ci"	:
16362306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
16462306a36Sopenharmony_ci	: __clobber_all);
16562306a36Sopenharmony_ci}
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ciSEC("socket")
16862306a36Sopenharmony_ci__description("div32 imm zero extend check")
16962306a36Sopenharmony_ci__success __success_unpriv __retval(0)
17062306a36Sopenharmony_ci__naked void div32_imm_zero_extend_check(void)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	asm volatile ("					\
17362306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
17462306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
17562306a36Sopenharmony_ci	r0 |= r1;					\
17662306a36Sopenharmony_ci	w0 /= 1;					\
17762306a36Sopenharmony_ci	r0 >>= 32;					\
17862306a36Sopenharmony_ci	r6 = r0;					\
17962306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
18062306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
18162306a36Sopenharmony_ci	r0 |= r1;					\
18262306a36Sopenharmony_ci	w0 /= 2;					\
18362306a36Sopenharmony_ci	r0 >>= 32;					\
18462306a36Sopenharmony_ci	r0 |= r6;					\
18562306a36Sopenharmony_ci	exit;						\
18662306a36Sopenharmony_ci"	:
18762306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
18862306a36Sopenharmony_ci	: __clobber_all);
18962306a36Sopenharmony_ci}
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ciSEC("socket")
19262306a36Sopenharmony_ci__description("or32 reg zero extend check")
19362306a36Sopenharmony_ci__success __success_unpriv __retval(0)
19462306a36Sopenharmony_ci__naked void or32_reg_zero_extend_check(void)
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	asm volatile ("					\
19762306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
19862306a36Sopenharmony_ci	r1 = r0;					\
19962306a36Sopenharmony_ci	r0 = 0x100000001 ll;				\
20062306a36Sopenharmony_ci	w0 |= w1;					\
20162306a36Sopenharmony_ci	r0 >>= 32;					\
20262306a36Sopenharmony_ci	exit;						\
20362306a36Sopenharmony_ci"	:
20462306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
20562306a36Sopenharmony_ci	: __clobber_all);
20662306a36Sopenharmony_ci}
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ciSEC("socket")
20962306a36Sopenharmony_ci__description("or32 imm zero extend check")
21062306a36Sopenharmony_ci__success __success_unpriv __retval(0)
21162306a36Sopenharmony_ci__naked void or32_imm_zero_extend_check(void)
21262306a36Sopenharmony_ci{
21362306a36Sopenharmony_ci	asm volatile ("					\
21462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
21562306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
21662306a36Sopenharmony_ci	r0 |= r1;					\
21762306a36Sopenharmony_ci	w0 |= 0;					\
21862306a36Sopenharmony_ci	r0 >>= 32;					\
21962306a36Sopenharmony_ci	r6 = r0;					\
22062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
22162306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
22262306a36Sopenharmony_ci	r0 |= r1;					\
22362306a36Sopenharmony_ci	w0 |= 1;					\
22462306a36Sopenharmony_ci	r0 >>= 32;					\
22562306a36Sopenharmony_ci	r0 |= r6;					\
22662306a36Sopenharmony_ci	exit;						\
22762306a36Sopenharmony_ci"	:
22862306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
22962306a36Sopenharmony_ci	: __clobber_all);
23062306a36Sopenharmony_ci}
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ciSEC("socket")
23362306a36Sopenharmony_ci__description("and32 reg zero extend check")
23462306a36Sopenharmony_ci__success __success_unpriv __retval(0)
23562306a36Sopenharmony_ci__naked void and32_reg_zero_extend_check(void)
23662306a36Sopenharmony_ci{
23762306a36Sopenharmony_ci	asm volatile ("					\
23862306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
23962306a36Sopenharmony_ci	r1 = 0x100000000 ll;				\
24062306a36Sopenharmony_ci	r1 |= r0;					\
24162306a36Sopenharmony_ci	r0 = 0x1ffffffff ll;				\
24262306a36Sopenharmony_ci	w0 &= w1;					\
24362306a36Sopenharmony_ci	r0 >>= 32;					\
24462306a36Sopenharmony_ci	exit;						\
24562306a36Sopenharmony_ci"	:
24662306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
24762306a36Sopenharmony_ci	: __clobber_all);
24862306a36Sopenharmony_ci}
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ciSEC("socket")
25162306a36Sopenharmony_ci__description("and32 imm zero extend check")
25262306a36Sopenharmony_ci__success __success_unpriv __retval(0)
25362306a36Sopenharmony_ci__naked void and32_imm_zero_extend_check(void)
25462306a36Sopenharmony_ci{
25562306a36Sopenharmony_ci	asm volatile ("					\
25662306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
25762306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
25862306a36Sopenharmony_ci	r0 |= r1;					\
25962306a36Sopenharmony_ci	w0 &= -1;					\
26062306a36Sopenharmony_ci	r0 >>= 32;					\
26162306a36Sopenharmony_ci	r6 = r0;					\
26262306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
26362306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
26462306a36Sopenharmony_ci	r0 |= r1;					\
26562306a36Sopenharmony_ci	w0 &= -2;					\
26662306a36Sopenharmony_ci	r0 >>= 32;					\
26762306a36Sopenharmony_ci	r0 |= r6;					\
26862306a36Sopenharmony_ci	exit;						\
26962306a36Sopenharmony_ci"	:
27062306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
27162306a36Sopenharmony_ci	: __clobber_all);
27262306a36Sopenharmony_ci}
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ciSEC("socket")
27562306a36Sopenharmony_ci__description("lsh32 reg zero extend check")
27662306a36Sopenharmony_ci__success __success_unpriv __retval(0)
27762306a36Sopenharmony_ci__naked void lsh32_reg_zero_extend_check(void)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	asm volatile ("					\
28062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
28162306a36Sopenharmony_ci	r1 = 0x100000000 ll;				\
28262306a36Sopenharmony_ci	r0 |= r1;					\
28362306a36Sopenharmony_ci	r1 = 1;						\
28462306a36Sopenharmony_ci	w0 <<= w1;					\
28562306a36Sopenharmony_ci	r0 >>= 32;					\
28662306a36Sopenharmony_ci	exit;						\
28762306a36Sopenharmony_ci"	:
28862306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
28962306a36Sopenharmony_ci	: __clobber_all);
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ciSEC("socket")
29362306a36Sopenharmony_ci__description("lsh32 imm zero extend check")
29462306a36Sopenharmony_ci__success __success_unpriv __retval(0)
29562306a36Sopenharmony_ci__naked void lsh32_imm_zero_extend_check(void)
29662306a36Sopenharmony_ci{
29762306a36Sopenharmony_ci	asm volatile ("					\
29862306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
29962306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
30062306a36Sopenharmony_ci	r0 |= r1;					\
30162306a36Sopenharmony_ci	w0 <<= 0;					\
30262306a36Sopenharmony_ci	r0 >>= 32;					\
30362306a36Sopenharmony_ci	r6 = r0;					\
30462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
30562306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
30662306a36Sopenharmony_ci	r0 |= r1;					\
30762306a36Sopenharmony_ci	w0 <<= 1;					\
30862306a36Sopenharmony_ci	r0 >>= 32;					\
30962306a36Sopenharmony_ci	r0 |= r6;					\
31062306a36Sopenharmony_ci	exit;						\
31162306a36Sopenharmony_ci"	:
31262306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
31362306a36Sopenharmony_ci	: __clobber_all);
31462306a36Sopenharmony_ci}
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ciSEC("socket")
31762306a36Sopenharmony_ci__description("rsh32 reg zero extend check")
31862306a36Sopenharmony_ci__success __success_unpriv __retval(0)
31962306a36Sopenharmony_ci__naked void rsh32_reg_zero_extend_check(void)
32062306a36Sopenharmony_ci{
32162306a36Sopenharmony_ci	asm volatile ("					\
32262306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
32362306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
32462306a36Sopenharmony_ci	r0 |= r1;					\
32562306a36Sopenharmony_ci	r1 = 1;						\
32662306a36Sopenharmony_ci	w0 >>= w1;					\
32762306a36Sopenharmony_ci	r0 >>= 32;					\
32862306a36Sopenharmony_ci	exit;						\
32962306a36Sopenharmony_ci"	:
33062306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
33162306a36Sopenharmony_ci	: __clobber_all);
33262306a36Sopenharmony_ci}
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ciSEC("socket")
33562306a36Sopenharmony_ci__description("rsh32 imm zero extend check")
33662306a36Sopenharmony_ci__success __success_unpriv __retval(0)
33762306a36Sopenharmony_ci__naked void rsh32_imm_zero_extend_check(void)
33862306a36Sopenharmony_ci{
33962306a36Sopenharmony_ci	asm volatile ("					\
34062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
34162306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
34262306a36Sopenharmony_ci	r0 |= r1;					\
34362306a36Sopenharmony_ci	w0 >>= 0;					\
34462306a36Sopenharmony_ci	r0 >>= 32;					\
34562306a36Sopenharmony_ci	r6 = r0;					\
34662306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
34762306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
34862306a36Sopenharmony_ci	r0 |= r1;					\
34962306a36Sopenharmony_ci	w0 >>= 1;					\
35062306a36Sopenharmony_ci	r0 >>= 32;					\
35162306a36Sopenharmony_ci	r0 |= r6;					\
35262306a36Sopenharmony_ci	exit;						\
35362306a36Sopenharmony_ci"	:
35462306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
35562306a36Sopenharmony_ci	: __clobber_all);
35662306a36Sopenharmony_ci}
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ciSEC("socket")
35962306a36Sopenharmony_ci__description("neg32 reg zero extend check")
36062306a36Sopenharmony_ci__success __success_unpriv __retval(0)
36162306a36Sopenharmony_ci__naked void neg32_reg_zero_extend_check(void)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	asm volatile ("					\
36462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
36562306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
36662306a36Sopenharmony_ci	r0 |= r1;					\
36762306a36Sopenharmony_ci	w0 = -w0;					\
36862306a36Sopenharmony_ci	r0 >>= 32;					\
36962306a36Sopenharmony_ci	exit;						\
37062306a36Sopenharmony_ci"	:
37162306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
37262306a36Sopenharmony_ci	: __clobber_all);
37362306a36Sopenharmony_ci}
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ciSEC("socket")
37662306a36Sopenharmony_ci__description("mod32 reg zero extend check")
37762306a36Sopenharmony_ci__success __success_unpriv __retval(0)
37862306a36Sopenharmony_ci__naked void mod32_reg_zero_extend_check(void)
37962306a36Sopenharmony_ci{
38062306a36Sopenharmony_ci	asm volatile ("					\
38162306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
38262306a36Sopenharmony_ci	r1 = r0;					\
38362306a36Sopenharmony_ci	r0 = -1;					\
38462306a36Sopenharmony_ci	w0 %%= w1;					\
38562306a36Sopenharmony_ci	r0 >>= 32;					\
38662306a36Sopenharmony_ci	exit;						\
38762306a36Sopenharmony_ci"	:
38862306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
38962306a36Sopenharmony_ci	: __clobber_all);
39062306a36Sopenharmony_ci}
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ciSEC("socket")
39362306a36Sopenharmony_ci__description("mod32 imm zero extend check")
39462306a36Sopenharmony_ci__success __success_unpriv __retval(0)
39562306a36Sopenharmony_ci__naked void mod32_imm_zero_extend_check(void)
39662306a36Sopenharmony_ci{
39762306a36Sopenharmony_ci	asm volatile ("					\
39862306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
39962306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
40062306a36Sopenharmony_ci	r0 |= r1;					\
40162306a36Sopenharmony_ci	w0 %%= 1;					\
40262306a36Sopenharmony_ci	r0 >>= 32;					\
40362306a36Sopenharmony_ci	r6 = r0;					\
40462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
40562306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
40662306a36Sopenharmony_ci	r0 |= r1;					\
40762306a36Sopenharmony_ci	w0 %%= 2;					\
40862306a36Sopenharmony_ci	r0 >>= 32;					\
40962306a36Sopenharmony_ci	r0 |= r6;					\
41062306a36Sopenharmony_ci	exit;						\
41162306a36Sopenharmony_ci"	:
41262306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
41362306a36Sopenharmony_ci	: __clobber_all);
41462306a36Sopenharmony_ci}
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ciSEC("socket")
41762306a36Sopenharmony_ci__description("xor32 reg zero extend check")
41862306a36Sopenharmony_ci__success __success_unpriv __retval(0)
41962306a36Sopenharmony_ci__naked void xor32_reg_zero_extend_check(void)
42062306a36Sopenharmony_ci{
42162306a36Sopenharmony_ci	asm volatile ("					\
42262306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
42362306a36Sopenharmony_ci	r1 = r0;					\
42462306a36Sopenharmony_ci	r0 = 0x100000000 ll;				\
42562306a36Sopenharmony_ci	w0 ^= w1;					\
42662306a36Sopenharmony_ci	r0 >>= 32;					\
42762306a36Sopenharmony_ci	exit;						\
42862306a36Sopenharmony_ci"	:
42962306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
43062306a36Sopenharmony_ci	: __clobber_all);
43162306a36Sopenharmony_ci}
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ciSEC("socket")
43462306a36Sopenharmony_ci__description("xor32 imm zero extend check")
43562306a36Sopenharmony_ci__success __success_unpriv __retval(0)
43662306a36Sopenharmony_ci__naked void xor32_imm_zero_extend_check(void)
43762306a36Sopenharmony_ci{
43862306a36Sopenharmony_ci	asm volatile ("					\
43962306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
44062306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
44162306a36Sopenharmony_ci	r0 |= r1;					\
44262306a36Sopenharmony_ci	w0 ^= 1;					\
44362306a36Sopenharmony_ci	r0 >>= 32;					\
44462306a36Sopenharmony_ci	exit;						\
44562306a36Sopenharmony_ci"	:
44662306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
44762306a36Sopenharmony_ci	: __clobber_all);
44862306a36Sopenharmony_ci}
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ciSEC("socket")
45162306a36Sopenharmony_ci__description("mov32 reg zero extend check")
45262306a36Sopenharmony_ci__success __success_unpriv __retval(0)
45362306a36Sopenharmony_ci__naked void mov32_reg_zero_extend_check(void)
45462306a36Sopenharmony_ci{
45562306a36Sopenharmony_ci	asm volatile ("					\
45662306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
45762306a36Sopenharmony_ci	r1 = 0x100000000 ll;				\
45862306a36Sopenharmony_ci	r1 |= r0;					\
45962306a36Sopenharmony_ci	r0 = 0x100000000 ll;				\
46062306a36Sopenharmony_ci	w0 = w1;					\
46162306a36Sopenharmony_ci	r0 >>= 32;					\
46262306a36Sopenharmony_ci	exit;						\
46362306a36Sopenharmony_ci"	:
46462306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
46562306a36Sopenharmony_ci	: __clobber_all);
46662306a36Sopenharmony_ci}
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ciSEC("socket")
46962306a36Sopenharmony_ci__description("mov32 imm zero extend check")
47062306a36Sopenharmony_ci__success __success_unpriv __retval(0)
47162306a36Sopenharmony_ci__naked void mov32_imm_zero_extend_check(void)
47262306a36Sopenharmony_ci{
47362306a36Sopenharmony_ci	asm volatile ("					\
47462306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
47562306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
47662306a36Sopenharmony_ci	r0 |= r1;					\
47762306a36Sopenharmony_ci	w0 = 0;						\
47862306a36Sopenharmony_ci	r0 >>= 32;					\
47962306a36Sopenharmony_ci	r6 = r0;					\
48062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
48162306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
48262306a36Sopenharmony_ci	r0 |= r1;					\
48362306a36Sopenharmony_ci	w0 = 1;						\
48462306a36Sopenharmony_ci	r0 >>= 32;					\
48562306a36Sopenharmony_ci	r0 |= r6;					\
48662306a36Sopenharmony_ci	exit;						\
48762306a36Sopenharmony_ci"	:
48862306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
48962306a36Sopenharmony_ci	: __clobber_all);
49062306a36Sopenharmony_ci}
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ciSEC("socket")
49362306a36Sopenharmony_ci__description("arsh32 reg zero extend check")
49462306a36Sopenharmony_ci__success __success_unpriv __retval(0)
49562306a36Sopenharmony_ci__naked void arsh32_reg_zero_extend_check(void)
49662306a36Sopenharmony_ci{
49762306a36Sopenharmony_ci	asm volatile ("					\
49862306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
49962306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
50062306a36Sopenharmony_ci	r0 |= r1;					\
50162306a36Sopenharmony_ci	r1 = 1;						\
50262306a36Sopenharmony_ci	w0 s>>= w1;					\
50362306a36Sopenharmony_ci	r0 >>= 32;					\
50462306a36Sopenharmony_ci	exit;						\
50562306a36Sopenharmony_ci"	:
50662306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
50762306a36Sopenharmony_ci	: __clobber_all);
50862306a36Sopenharmony_ci}
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ciSEC("socket")
51162306a36Sopenharmony_ci__description("arsh32 imm zero extend check")
51262306a36Sopenharmony_ci__success __success_unpriv __retval(0)
51362306a36Sopenharmony_ci__naked void arsh32_imm_zero_extend_check(void)
51462306a36Sopenharmony_ci{
51562306a36Sopenharmony_ci	asm volatile ("					\
51662306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
51762306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
51862306a36Sopenharmony_ci	r0 |= r1;					\
51962306a36Sopenharmony_ci	w0 s>>= 0;					\
52062306a36Sopenharmony_ci	r0 >>= 32;					\
52162306a36Sopenharmony_ci	r6 = r0;					\
52262306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
52362306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
52462306a36Sopenharmony_ci	r0 |= r1;					\
52562306a36Sopenharmony_ci	w0 s>>= 1;					\
52662306a36Sopenharmony_ci	r0 >>= 32;					\
52762306a36Sopenharmony_ci	r0 |= r6;					\
52862306a36Sopenharmony_ci	exit;						\
52962306a36Sopenharmony_ci"	:
53062306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
53162306a36Sopenharmony_ci	: __clobber_all);
53262306a36Sopenharmony_ci}
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ciSEC("socket")
53562306a36Sopenharmony_ci__description("end16 (to_le) reg zero extend check")
53662306a36Sopenharmony_ci__success __success_unpriv __retval(0)
53762306a36Sopenharmony_ci__naked void le_reg_zero_extend_check_1(void)
53862306a36Sopenharmony_ci{
53962306a36Sopenharmony_ci	asm volatile ("					\
54062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
54162306a36Sopenharmony_ci	r6 = r0;					\
54262306a36Sopenharmony_ci	r6 <<= 32;					\
54362306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
54462306a36Sopenharmony_ci	r0 |= r6;					\
54562306a36Sopenharmony_ci	r0 = le16 r0;					\
54662306a36Sopenharmony_ci	r0 >>= 32;					\
54762306a36Sopenharmony_ci	exit;						\
54862306a36Sopenharmony_ci"	:
54962306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
55062306a36Sopenharmony_ci	: __clobber_all);
55162306a36Sopenharmony_ci}
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ciSEC("socket")
55462306a36Sopenharmony_ci__description("end32 (to_le) reg zero extend check")
55562306a36Sopenharmony_ci__success __success_unpriv __retval(0)
55662306a36Sopenharmony_ci__naked void le_reg_zero_extend_check_2(void)
55762306a36Sopenharmony_ci{
55862306a36Sopenharmony_ci	asm volatile ("					\
55962306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
56062306a36Sopenharmony_ci	r6 = r0;					\
56162306a36Sopenharmony_ci	r6 <<= 32;					\
56262306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
56362306a36Sopenharmony_ci	r0 |= r6;					\
56462306a36Sopenharmony_ci	r0 = le32 r0;					\
56562306a36Sopenharmony_ci	r0 >>= 32;					\
56662306a36Sopenharmony_ci	exit;						\
56762306a36Sopenharmony_ci"	:
56862306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
56962306a36Sopenharmony_ci	: __clobber_all);
57062306a36Sopenharmony_ci}
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ciSEC("socket")
57362306a36Sopenharmony_ci__description("end16 (to_be) reg zero extend check")
57462306a36Sopenharmony_ci__success __success_unpriv __retval(0)
57562306a36Sopenharmony_ci__naked void be_reg_zero_extend_check_1(void)
57662306a36Sopenharmony_ci{
57762306a36Sopenharmony_ci	asm volatile ("					\
57862306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
57962306a36Sopenharmony_ci	r6 = r0;					\
58062306a36Sopenharmony_ci	r6 <<= 32;					\
58162306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
58262306a36Sopenharmony_ci	r0 |= r6;					\
58362306a36Sopenharmony_ci	r0 = be16 r0;					\
58462306a36Sopenharmony_ci	r0 >>= 32;					\
58562306a36Sopenharmony_ci	exit;						\
58662306a36Sopenharmony_ci"	:
58762306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
58862306a36Sopenharmony_ci	: __clobber_all);
58962306a36Sopenharmony_ci}
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ciSEC("socket")
59262306a36Sopenharmony_ci__description("end32 (to_be) reg zero extend check")
59362306a36Sopenharmony_ci__success __success_unpriv __retval(0)
59462306a36Sopenharmony_ci__naked void be_reg_zero_extend_check_2(void)
59562306a36Sopenharmony_ci{
59662306a36Sopenharmony_ci	asm volatile ("					\
59762306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
59862306a36Sopenharmony_ci	r6 = r0;					\
59962306a36Sopenharmony_ci	r6 <<= 32;					\
60062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
60162306a36Sopenharmony_ci	r0 |= r6;					\
60262306a36Sopenharmony_ci	r0 = be32 r0;					\
60362306a36Sopenharmony_ci	r0 >>= 32;					\
60462306a36Sopenharmony_ci	exit;						\
60562306a36Sopenharmony_ci"	:
60662306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
60762306a36Sopenharmony_ci	: __clobber_all);
60862306a36Sopenharmony_ci}
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ciSEC("socket")
61162306a36Sopenharmony_ci__description("ldx_b zero extend check")
61262306a36Sopenharmony_ci__success __success_unpriv __retval(0)
61362306a36Sopenharmony_ci__naked void ldx_b_zero_extend_check(void)
61462306a36Sopenharmony_ci{
61562306a36Sopenharmony_ci	asm volatile ("					\
61662306a36Sopenharmony_ci	r6 = r10;					\
61762306a36Sopenharmony_ci	r6 += -4;					\
61862306a36Sopenharmony_ci	r7 = 0xfaceb00c;				\
61962306a36Sopenharmony_ci	*(u32*)(r6 + 0) = r7;				\
62062306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
62162306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
62262306a36Sopenharmony_ci	r0 |= r1;					\
62362306a36Sopenharmony_ci	r0 = *(u8*)(r6 + 0);				\
62462306a36Sopenharmony_ci	r0 >>= 32;					\
62562306a36Sopenharmony_ci	exit;						\
62662306a36Sopenharmony_ci"	:
62762306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
62862306a36Sopenharmony_ci	: __clobber_all);
62962306a36Sopenharmony_ci}
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ciSEC("socket")
63262306a36Sopenharmony_ci__description("ldx_h zero extend check")
63362306a36Sopenharmony_ci__success __success_unpriv __retval(0)
63462306a36Sopenharmony_ci__naked void ldx_h_zero_extend_check(void)
63562306a36Sopenharmony_ci{
63662306a36Sopenharmony_ci	asm volatile ("					\
63762306a36Sopenharmony_ci	r6 = r10;					\
63862306a36Sopenharmony_ci	r6 += -4;					\
63962306a36Sopenharmony_ci	r7 = 0xfaceb00c;				\
64062306a36Sopenharmony_ci	*(u32*)(r6 + 0) = r7;				\
64162306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
64262306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
64362306a36Sopenharmony_ci	r0 |= r1;					\
64462306a36Sopenharmony_ci	r0 = *(u16*)(r6 + 0);				\
64562306a36Sopenharmony_ci	r0 >>= 32;					\
64662306a36Sopenharmony_ci	exit;						\
64762306a36Sopenharmony_ci"	:
64862306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
64962306a36Sopenharmony_ci	: __clobber_all);
65062306a36Sopenharmony_ci}
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ciSEC("socket")
65362306a36Sopenharmony_ci__description("ldx_w zero extend check")
65462306a36Sopenharmony_ci__success __success_unpriv __retval(0)
65562306a36Sopenharmony_ci__naked void ldx_w_zero_extend_check(void)
65662306a36Sopenharmony_ci{
65762306a36Sopenharmony_ci	asm volatile ("					\
65862306a36Sopenharmony_ci	r6 = r10;					\
65962306a36Sopenharmony_ci	r6 += -4;					\
66062306a36Sopenharmony_ci	r7 = 0xfaceb00c;				\
66162306a36Sopenharmony_ci	*(u32*)(r6 + 0) = r7;				\
66262306a36Sopenharmony_ci	call %[bpf_get_prandom_u32];			\
66362306a36Sopenharmony_ci	r1 = 0x1000000000 ll;				\
66462306a36Sopenharmony_ci	r0 |= r1;					\
66562306a36Sopenharmony_ci	r0 = *(u32*)(r6 + 0);				\
66662306a36Sopenharmony_ci	r0 >>= 32;					\
66762306a36Sopenharmony_ci	exit;						\
66862306a36Sopenharmony_ci"	:
66962306a36Sopenharmony_ci	: __imm(bpf_get_prandom_u32)
67062306a36Sopenharmony_ci	: __clobber_all);
67162306a36Sopenharmony_ci}
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
674