162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/bpf.h>
462306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
562306a36Sopenharmony_ci#include "bpf_misc.h"
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \
862306a36Sopenharmony_ci     (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64)) && __clang_major__ >= 18
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciSEC("socket")
1162306a36Sopenharmony_ci__description("BSWAP, 16")
1262306a36Sopenharmony_ci__success __success_unpriv __retval(0x23ff)
1362306a36Sopenharmony_ci__naked void bswap_16(void)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	asm volatile ("					\
1662306a36Sopenharmony_ci	r0 = 0xff23;					\
1762306a36Sopenharmony_ci	r0 = bswap16 r0;				\
1862306a36Sopenharmony_ci	exit;						\
1962306a36Sopenharmony_ci"	::: __clobber_all);
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciSEC("socket")
2362306a36Sopenharmony_ci__description("BSWAP, 32")
2462306a36Sopenharmony_ci__success __success_unpriv __retval(0x23ff0000)
2562306a36Sopenharmony_ci__naked void bswap_32(void)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	asm volatile ("					\
2862306a36Sopenharmony_ci	r0 = 0xff23;					\
2962306a36Sopenharmony_ci	r0 = bswap32 r0;				\
3062306a36Sopenharmony_ci	exit;						\
3162306a36Sopenharmony_ci"	::: __clobber_all);
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciSEC("socket")
3562306a36Sopenharmony_ci__description("BSWAP, 64")
3662306a36Sopenharmony_ci__success __success_unpriv __retval(0x34ff12ff)
3762306a36Sopenharmony_ci__naked void bswap_64(void)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	asm volatile ("					\
4062306a36Sopenharmony_ci	r0 = %[u64_val] ll;					\
4162306a36Sopenharmony_ci	r0 = bswap64 r0;				\
4262306a36Sopenharmony_ci	exit;						\
4362306a36Sopenharmony_ci"	:
4462306a36Sopenharmony_ci	: [u64_val]"i"(0xff12ff34ff56ff78ull)
4562306a36Sopenharmony_ci	: __clobber_all);
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#else
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciSEC("socket")
5162306a36Sopenharmony_ci__description("cpuv4 is not supported by compiler or jit, use a dummy test")
5262306a36Sopenharmony_ci__success
5362306a36Sopenharmony_ciint dummy_test(void)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	return 0;
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#endif
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
61