1132732Skan// SPDX-License-Identifier: GPL-2.0
272564Sobrien/* Copyright (C) 2023. Huawei Technologies Co., Ltd */
3169702Skan#include <linux/types.h>
4169702Skan#include <bpf/bpf_helpers.h>
518334Speter
690091Sobrien#include "bpf_experimental.h"
718334Speter#include "bpf_misc.h"
890091Sobrien
990091Sobrienchar _license[] SEC("license") = "GPL";
1090091Sobrien
1190091Sobrienstruct bin_data {
1218334Speter	char blob[32];
1390091Sobrien};
1490091Sobrien
1590091Sobrien#define private(name) SEC(".bss." #name) __hidden __attribute__((aligned(8)))
1690091Sobrienprivate(kptr) struct bin_data __kptr * ptr;
1718334Speter
1818334SpeterSEC("tc")
1990091Sobrien__naked int kptr_xchg_inline(void)
20169702Skan{
21169702Skan	asm volatile (
2218334Speter		"r1 = %[ptr] ll;"
23124160Skan		"r2 = 0;"
24124160Skan		"call %[bpf_kptr_xchg];"
2518334Speter		"if r0 == 0 goto 1f;"
2618334Speter		"r1 = r0;"
2718334Speter		"r2 = 0;"
2818334Speter		"call %[bpf_obj_drop_impl];"
2918334Speter	"1:"
3018334Speter		"r0 = 0;"
3118334Speter		"exit;"
3218334Speter		:
3318334Speter		: __imm_addr(ptr),
3418334Speter		  __imm(bpf_kptr_xchg),
3518334Speter		  __imm(bpf_obj_drop_impl)
3618334Speter		: __clobber_all
37169702Skan	);
3818334Speter}
3918334Speter
4052268Sobrien/* BTF FUNC records are not generated for kfuncs referenced
41132732Skan * from inline assembly. These records are necessary for
42132732Skan * libbpf to link the program. The function below is a hack
4318334Speter * to ensure that BTF FUNC records are generated.
4418334Speter */
4518334Spetervoid __btf_root(void)
4652268Sobrien{
4718334Speter	bpf_obj_drop(NULL);
4818334Speter}
49132732Skan