// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
/* Converted from tools/testing/selftests/bpf/prog_tests/align.c */

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include "bpf_misc.h"

/* Four tests of known constants.  These aren't staggeringly
 * interesting since we track exact values now.
 */

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
__msg("0: R1=ctx() R10=fp0")
__msg("0: {{.*}} R3=2")
__msg("1: {{.*}} R3=4")
__msg("2: {{.*}} R3=8")
__msg("3: {{.*}} R3=16")
__msg("4: {{.*}} R3=32")
__naked void mov(void)
{
	asm volatile ("					\
	r3 = 2;						\
	r3 = 4;						\
	r3 = 8;						\
	r3 = 16;					\
	r3 = 32;					\
	r0 = 0;						\
	exit;						\
"	::: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
__msg("0: R1=ctx() R10=fp0")
__msg("0: {{.*}}R3=1")
__msg("1: {{.*}}R3=2")
__msg("2: {{.*}}R3=4")
__msg("3: {{.*}}R3=8")
__msg("4: {{.*}}R3=16")
__msg("5: {{.*}}R3=1")
__msg("6: {{.*}}R4=32")
__msg("7: {{.*}}R4=16")
__msg("8: {{.*}}R4=8")
__msg("9: {{.*}}R4=4")
__msg("10: {{.*}}R4=2")
__naked void shift(void)
{
	asm volatile ("					\
	r3 = 1;						\
	r3 <<= 1;					\
	r3 <<= 1;					\
	r3 <<= 1;					\
	r3 <<= 1;					\
	r3 >>= 4;					\
	r4 = 32;					\
	r4 >>= 1;					\
	r4 >>= 1;					\
	r4 >>= 1;					\
	r4 >>= 1;					\
	r0 = 0;						\
	exit;						\
"	::: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
__msg("0: R1=ctx() R10=fp0")
__msg("0: {{.*}}R3=4")
__msg("1: {{.*}}R3=8")
__msg("2: {{.*}}R3=10")
__msg("3: {{.*}}R4=8")
__msg("4: {{.*}}R4=12")
__msg("5: {{.*}}R4=14")
__naked void addsub(void)
{
	asm volatile ("					\
	r3 = 4;						\
	r3 += 4;					\
	r3 += 2;					\
	r4 = 8;						\
	r4 += 4;					\
	r4 += 2;					\
	r0 = 0;						\
	exit;						\
"	::: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
__msg("0: R1=ctx() R10=fp0")
__msg("0: {{.*}}R3=7")
__msg("1: {{.*}}R3=7")
__msg("2: {{.*}}R3=14")
__msg("3: {{.*}}R3=56")
__naked void mul(void)
{
	asm volatile ("					\
	r3 = 7;						\
	r3 *= 1;					\
	r3 *= 2;					\
	r3 *= 4;					\
	r0 = 0;						\
	exit;						\
"	::: __clobber_all);
}

/* Tests using unknown values */

#define PREP_PKT_POINTERS				\
	"r2 = *(u32*)(r1 + %[__sk_buff_data]);"		\
	"r3 = *(u32*)(r1 + %[__sk_buff_data_end]);"

#define __LOAD_UNKNOWN(DST_REG, LBL)			\
	"r2 = *(u32*)(r1 + %[__sk_buff_data]);"		\
	"r3 = *(u32*)(r1 + %[__sk_buff_data_end]);"	\
	"r0 = r2;"					\
	"r0 += 8;"					\
	"if r3 >= r0 goto " LBL ";"			\
	"exit;"						\
LBL ":"							\
	DST_REG " = *(u8*)(r2 + 0);"

#define LOAD_UNKNOWN(DST_REG) __LOAD_UNKNOWN(DST_REG, "l99_%=")

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
__msg("6: {{.*}} R2=pkt(r=8)")
__msg("6: {{.*}} R3={{[^)]*}}var_off=(0x0; 0xff)")
__msg("7: {{.*}} R3={{[^)]*}}var_off=(0x0; 0x1fe)")
__msg("8: {{.*}} R3={{[^)]*}}var_off=(0x0; 0x3fc)")
__msg("9: {{.*}} R3={{[^)]*}}var_off=(0x0; 0x7f8)")
__msg("10: {{.*}} R3={{[^)]*}}var_off=(0x0; 0xff0)")
__msg("12: {{.*}} R3=pkt_end()")
__msg("17: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff)")
__msg("18: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x1fe0)")
__msg("19: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff0)")
__msg("20: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x7f8)")
__msg("21: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x3fc)")
__msg("22: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x1fe)")
__naked void unknown_shift(void)
{
	asm volatile ("					\
	" __LOAD_UNKNOWN("r3", "l99_%=") "		\
	r3 <<= 1;					\
	r3 <<= 1;					\
	r3 <<= 1;					\
	r3 <<= 1;					\
	" __LOAD_UNKNOWN("r4", "l98_%=") "		\
	r4 <<= 5;					\
	r4 >>= 1;					\
	r4 >>= 1;					\
	r4 >>= 1;					\
	r4 >>= 1;					\
	r0 = 0;						\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
__msg("6: {{.*}} R3={{[^)]*}}var_off=(0x0; 0xff)")
__msg("7: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff)")
__msg("8: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff)")
__msg("9: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff)")
__msg("10: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x1fe)")
__msg("11: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff)")
__msg("12: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x3fc)")
__msg("13: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff)")
__msg("14: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x7f8)")
__msg("15: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff0)")
__naked void unknown_mul(void)
{
	asm volatile ("					\
	" LOAD_UNKNOWN("r3") "				\
	r4 = r3;					\
	r4 *= 1;					\
	r4 = r3;					\
	r4 *= 2;					\
	r4 = r3;					\
	r4 *= 4;					\
	r4 = r3;					\
	r4 *= 8;					\
	r4 *= 2;					\
	r0 = 0;						\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__msg("2: {{.*}} R5=pkt(r=0)")
__msg("4: {{.*}} R5=pkt(r=0,imm=14)")
__msg("5: {{.*}} R4=pkt(r=0,imm=14)")
__msg("9: {{.*}} R5=pkt(r=18,imm=14)")
__msg("10: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xff){{.*}} R5=pkt(r=18,imm=14)")
__msg("13: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xffff)")
__msg("14: {{.*}} R4={{[^)]*}}var_off=(0x0; 0xffff)")
__naked void packet_const_offset(void)
{
	asm volatile ("					\
	" PREP_PKT_POINTERS "				\
	r5 = r2;					\
	r0 = 0;						\
	/* Skip over ethernet header.  */		\
	r5 += 14;					\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l0_%=;				\
	exit;						\
l0_%=:	r4 = *(u8*)(r5 + 0);				\
	r4 = *(u8*)(r5 + 1);				\
	r4 = *(u8*)(r5 + 2);				\
	r4 = *(u8*)(r5 + 3);				\
	r4 = *(u16*)(r5 + 0);				\
	r4 = *(u16*)(r5 + 2);				\
	r4 = *(u32*)(r5 + 0);				\
	r0 = 0;						\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
/* Calculated offset in R6 has unknown value, but known
 * alignment of 4.
 */
__msg("6: {{.*}} R2=pkt(r=8)")
__msg("7: {{.*}} R6={{[^)]*}}var_off=(0x0; 0x3fc)")
/* Offset is added to packet pointer R5, resulting in
 * known fixed offset, and variable offset from R6.
 */
__msg("11: {{.*}} R5=pkt(id=1,{{[^)]*}},var_off=(0x2; 0x7fc)")
/* At the time the word size load is performed from R5,
 * it's total offset is NET_IP_ALIGN + reg->off (0) +
 * reg->aux_off (14) which is 16.  Then the variable
 * offset is considered using reg->aux_off_align which
 * is 4 and meets the load's requirements.
 */
__msg("15: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
/* Variable offset is added to R5 packet pointer,
 * resulting in auxiliary alignment of 4. To avoid BPF
 * verifier's precision backtracking logging
 * interfering we also have a no-op R4 = R5
 * instruction to validate R5 state. We also check
 * that R4 is what it should be in such case.
 */
__msg("18: {{.*}} R4={{[^)]*}}var_off=(0x0; 0x3fc){{.*}} R5={{[^)]*}}var_off=(0x0; 0x3fc)")
/* Constant offset is added to R5, resulting in
 * reg->off of 14.
 */
__msg("19: {{.*}} R5=pkt(id=2,{{[^)]*}}var_off=(0x2; 0x7fc)")
/* At the time the word size load is performed from R5,
 * its total fixed offset is NET_IP_ALIGN + reg->off
 * (14) which is 16.  Then the variable offset is 4-byte
 * aligned, so the total offset is 4-byte aligned and
 * meets the load's requirements.
 */
__msg("24: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
/* Constant offset is added to R5 packet pointer,
 * resulting in reg->off value of 14.
 */
__msg("26: {{.*}} R5=pkt(r=8,imm=14)")
/* Variable offset is added to R5, resulting in a
 * variable offset of (4n). See comment for insn #18
 * for R4 = R5 trick.
 */
__msg("28: {{.*}} R4={{[^)]*}}var_off=(0x2; 0x7fc){{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
/* Constant is added to R5 again, setting reg->off to 18. */
__msg("29: {{.*}} R5=pkt(id=3,{{[^)]*}}var_off=(0x2; 0xffc)")
/* And once more we add a variable; resulting {{[^)]*}}var_off
 * is still (4n), fixed offset is not changed.
 * Also, we create a new reg->id.
 */
__msg("31: {{.*}} R4={{[^)]*}}var_off=(0x2; 0xffc){{.*}} R5={{[^)]*}}var_off=(0x2; 0xffc)")
/* At the time the word size load is performed from R5,
 * its total fixed offset is NET_IP_ALIGN + reg->off (18)
 * which is 20.  Then the variable offset is (4n), so
 * the total offset is 4-byte aligned and meets the
 * load's requirements.
 */
__msg("35: {{.*}} R5={{[^)]*}}var_off=(0x2; 0xffc)")
__naked void packet_variable_offset(void)
{
	asm volatile ("					\
	" LOAD_UNKNOWN("r6") "				\
	r6 <<= 2;					\
	/* First, add a constant to the R5 packet pointer,\
	 * then a variable with a known alignment.	\
	 */						\
	r5 = r2;					\
	r5 += 14;					\
	r5 += r6;					\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l0_%=;				\
	exit;						\
l0_%=:	r4 = *(u32*)(r5 + 0);				\
	/* Now, test in the other direction.  Adding first\
	 * the variable offset to R5, then the constant.\
	 */						\
	r5 = r2;					\
	r5 += r6;					\
	r4 = r5;					\
	r5 += 14;					\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l1_%=;				\
	exit;						\
l1_%=:	r4 = *(u32*)(r5 + 0);				\
	/* Test multiple accumulations of unknown values\
	 * into a packet pointer.			\
	 */						\
	r5 = r2;					\
	r5 += 14;					\
	r5 += r6;					\
	r4 = r5;					\
	r5 += 4;					\
	r5 += r6;					\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l2_%=;				\
	exit;						\
l2_%=:	r4 = *(u32*)(r5 + 0);				\
	r0 = 0;						\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
/* Calculated offset in R6 has unknown value, but known
 * alignment of 4.
 */
__msg("6: {{.*}} R2=pkt(r=8)")
__msg("7: {{.*}} R6={{[^)]*}}var_off=(0x0; 0x3fc)")
/* Adding 14 makes R6 be (4n+2) */
__msg("8: {{.*}} R6={{[^)]*}}var_off=(0x2; 0x7fc)")
/* Packet pointer has (4n+2) offset */
__msg("11: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
__msg("12: {{.*}} R4={{[^)]*}}var_off=(0x2; 0xffc)")
/* At the time the word size load is performed from R5,
 * its total fixed offset is NET_IP_ALIGN + reg->off (0)
 * which is 2.  Then the variable offset is (4n+2), so
 * the total offset is 4-byte aligned and meets the
 * load's requirements.
 */
__msg("15: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
/* Newly read value in R6 was shifted left by 2, so has
 * known alignment of 4.
 */
__msg("17: {{.*}} R6={{[^)]*}}var_off=(0x0; 0x3fc)")
/* Added (4n) to packet pointer's (4n+2) {{[^)]*}}var_off, giving
 * another (4n+2).
 */
__msg("19: {{.*}} R5={{[^)]*}}var_off=(0x2; 0xffc)")
__msg("20: {{.*}} R4={{[^)]*}}var_off=(0x2; 0x1ffc)")
/* At the time the word size load is performed from R5,
 * its total fixed offset is NET_IP_ALIGN + reg->off (0)
 * which is 2.  Then the variable offset is (4n+2), so
 * the total offset is 4-byte aligned and meets the
 * load's requirements.
 */
__msg("23: {{.*}} R5={{[^)]*}}var_off=(0x2; 0xffc)")
__naked void packet_variable_offset_2(void)
{
	asm volatile ("					\
	/* Create an unknown offset, (4n+2)-aligned */	\
	" LOAD_UNKNOWN("r6") "			\
	r6 <<= 2;					\
	r6 += 14;					\
	/* Add it to the packet pointer */		\
	r5 = r2;					\
	r5 += r6;					\
	/* Check bounds and perform a read */		\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l0_%=;				\
	exit;						\
l0_%=:	r6 = *(u32*)(r5 + 0);				\
	/* Make a (4n) offset from the value we just read */\
	r6 &= 0xff;					\
	r6 <<= 2;					\
	/* Add it to the packet pointer */		\
	r5 += r6;					\
	/* Check bounds and perform a read */		\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l1_%=;				\
	exit;						\
l1_%=:	r6 = *(u32*)(r5 + 0);				\
	r0 = 0;						\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

SEC("tc")
__failure __log_level(2)
__msg("3: {{.*}} R5=pkt_end()")
/* (ptr - ptr) << 2 == unknown, (4n) */
__msg("5: {{.*}} R5={{[^)]*}}var_off=(0x0; 0xfffffffffffffffc)")
/* (4n) + 14 == (4n+2).  We blow our bounds, because
 * the add could overflow.
 */
__msg("6: {{.*}} R5={{[^)]*}}var_off=(0x2; 0xfffffffffffffffc)")
/* Checked s>=0 */
__msg("9: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7ffffffffffffffc)")
/* packet pointer + nonnegative (4n+2) */
__msg("11: {{.*}} R4={{[^)]*}}var_off=(0x2; 0x7ffffffffffffffc){{.*}} R6={{[^)]*}}var_off=(0x2; 0x7ffffffffffffffc)")
__msg("12: (07) r4 += 4")
/* packet smax bound overflow */
__msg("pkt pointer offset -9223372036854775808 is not allowed")
__naked void dubious_pointer_arithmetic(void)
{
	asm volatile ("					\
	" PREP_PKT_POINTERS "				\
	r0 = 0;						\
	/* (ptr - ptr) << 2 */				\
	r5 = r3;					\
	r5 -= r2;					\
	r5 <<= 2;					\
	/* We have a (4n) value.  Let's make a packet offset\
	 * out of it.  First add 14, to make it a (4n+2)\
	 */						\
	r5 += 14;					\
	/* Then make sure it's nonnegative */		\
	if r5 s>= 0 goto l0_%=;				\
	exit;						\
l0_%=:	/* Add it to packet pointer */			\
	r6 = r2;					\
	r6 += r5;					\
	/* Check bounds and perform a read */		\
	r4 = r6;					\
	r4 += 4;					\
	if r3 >= r4 goto l1_%=;				\
	exit;						\
l1_%=:	r4 = *(u32*)(r6 + 0);				\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
/* Calculated offset in R6 has unknown value, but known
 * alignment of 4.
 */
__msg("6: {{.*}} R2=pkt(r=8)")
__msg("8: {{.*}} R6={{[^)]*}}var_off=(0x0; 0x3fc)")
/* Adding 14 makes R6 be (4n+2) */
__msg("9: {{.*}} R6={{[^)]*}}var_off=(0x2; 0x7fc)")
/* New unknown value in R7 is (4n) */
__msg("10: {{.*}} R7={{[^)]*}}var_off=(0x0; 0x3fc)")
/* Subtracting it from R6 blows our unsigned bounds */
__msg("11: {{.*}} R6={{[^)]*}}var_off=(0x2; 0xfffffffffffffffc)")
/* Checked s>= 0 */
__msg("14: {{.*}} R6={{[^)]*}}var_off=(0x2; 0x7fc)")
/* At the time the word size load is performed from R5,
 * its total fixed offset is NET_IP_ALIGN + reg->off (0)
 * which is 2.  Then the variable offset is (4n+2), so
 * the total offset is 4-byte aligned and meets the
 * load's requirements.
 */
__msg("20: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
__naked void variable_subtraction(void)
{
	asm volatile ("					\
	/* Create an unknown offset, (4n+2)-aligned */	\
	" LOAD_UNKNOWN("r6") "				\
	r7 = r6;					\
	r6 <<= 2;					\
	r6 += 14;					\
	/* Create another unknown, (4n)-aligned, and subtract\
	 * it from the first one			\
	 */						\
	r7 <<= 2;					\
	r6 -= r7;					\
	/* Bounds-check the result */			\
	if r6 s>= 0 goto l0_%=;				\
	exit;						\
l0_%=:	/* Add it to the packet pointer */		\
	r5 = r2;					\
	r5 += r6;					\
	/* Check bounds and perform a read */		\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l1_%=;				\
	exit;						\
l1_%=:	r6 = *(u32*)(r5 + 0);				\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

SEC("tc")
__success __log_level(2)
__flag(BPF_F_ANY_ALIGNMENT)
/* Calculated offset in R6 has unknown value, but known
 * alignment of 4.
 */
__msg("6: {{.*}} R2=pkt(r=8)")
__msg("9: {{.*}} R6={{[^)]*}}var_off=(0x0; 0x3c)")
/* Adding 14 makes R6 be (4n+2) */
__msg("10: {{.*}} R6={{[^)]*}}var_off=(0x2; 0x7c)")
/* Subtracting from packet pointer overflows ubounds */
__msg("13: R5={{[^)]*}}var_off=(0xffffffffffffff82; 0x7c)")
/* New unknown value in R7 is (4n), >= 76 */
__msg("14: {{.*}} R7={{[^)]*}}var_off=(0x0; 0x7fc)")
/* Adding it to packet pointer gives nice bounds again */
__msg("16: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
/* At the time the word size load is performed from R5,
 * its total fixed offset is NET_IP_ALIGN + reg->off (0)
 * which is 2.  Then the variable offset is (4n+2), so
 * the total offset is 4-byte aligned and meets the
 * load's requirements.
 */
__msg("20: {{.*}} R5={{[^)]*}}var_off=(0x2; 0x7fc)")
__naked void pointer_variable_subtraction(void)
{
	asm volatile ("					\
	/* Create an unknown offset, (4n+2)-aligned and bounded\
	 * to [14,74]					\
	 */						\
	" LOAD_UNKNOWN("r6") "				\
	r7 = r6;					\
	r6 &= 0xf;					\
	r6 <<= 2;					\
	r6 += 14;					\
	/* Subtract it from the packet pointer */	\
	r5 = r2;					\
	r5 -= r6;					\
	/* Create another unknown, (4n)-aligned and >= 74.\
	 * That in fact means >= 76, since 74 mod 4 == 2\
	 */						\
	r7 <<= 2;					\
	r7 += 76;					\
	/* Add it to the packet pointer */		\
	r5 += r7;					\
	/* Check bounds and perform a read */		\
	r4 = r5;					\
	r4 += 4;					\
	if r3 >= r4 goto l0_%=;				\
	exit;						\
l0_%=:	r6 = *(u32*)(r5 + 0);				\
	exit;						\
"	:
	: __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
	  __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end))
	: __clobber_all);
}

char _license[] SEC("license") = "GPL";
