49 lines
1014 B
C
49 lines
1014 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (C) 2023. Huawei Technologies Co., Ltd */
|
|
#include <linux/types.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
|
|
#include "bpf_experimental.h"
|
|
#include "bpf_misc.h"
|
|
|
|
char _license[] SEC("license") = "GPL";
|
|
|
|
struct bin_data {
|
|
char blob[32];
|
|
};
|
|
|
|
#define private(name) SEC(".bss." #name) __hidden __attribute__((aligned(8)))
|
|
private(kptr) struct bin_data __kptr * ptr;
|
|
|
|
SEC("tc")
|
|
__naked int kptr_xchg_inline(void)
|
|
{
|
|
asm volatile (
|
|
"r1 = %[ptr] ll;"
|
|
"r2 = 0;"
|
|
"call %[bpf_kptr_xchg];"
|
|
"if r0 == 0 goto 1f;"
|
|
"r1 = r0;"
|
|
"r2 = 0;"
|
|
"call %[bpf_obj_drop_impl];"
|
|
"1:"
|
|
"r0 = 0;"
|
|
"exit;"
|
|
:
|
|
: __imm_addr(ptr),
|
|
__imm(bpf_kptr_xchg),
|
|
__imm(bpf_obj_drop_impl)
|
|
: __clobber_all
|
|
);
|
|
}
|
|
|
|
/* BTF FUNC records are not generated for kfuncs referenced
|
|
* from inline assembly. These records are necessary for
|
|
* libbpf to link the program. The function below is a hack
|
|
* to ensure that BTF FUNC records are generated.
|
|
*/
|
|
void __btf_root(void)
|
|
{
|
|
bpf_obj_drop(NULL);
|
|
}
|