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