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