提交 7d57696d 编写于 作者: K Kumar Kartikeya Dwivedi 提交者: Zheng Zengkai

bpf: Add bpf_kallsyms_lookup_name helper

mainline inclusion
from mainline-5.16-rc1
commit d6aef08a
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5EUVD
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d6aef08a872b9e23eecc92d0e92393473b13c497

-------------------------------------------------

This helper allows us to get the address of a kernel symbol from inside
a BPF_PROG_TYPE_SYSCALL prog (used by gen_loader), so that we can
relocate typeless ksym vars.
Signed-off-by: NKumar Kartikeya Dwivedi <memxor@gmail.com>
Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
Acked-by: NSong Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20211028063501.2239335-2-memxor@gmail.com
(cherry picked from commit d6aef08a)
Signed-off-by: NWang Yufen <wangyufen@huawei.com>

Conflicts:
	include/linux/bpf.h
	include/uapi/linux/bpf.h
	tools/include/uapi/linux/bpf.h
Signed-off-by: NWang Yufen <wangyufen@huawei.com>
上级 6d49ff90
...@@ -2057,6 +2057,7 @@ extern const struct bpf_func_proto bpf_per_cpu_ptr_proto; ...@@ -2057,6 +2057,7 @@ extern const struct bpf_func_proto bpf_per_cpu_ptr_proto;
extern const struct bpf_func_proto bpf_this_cpu_ptr_proto; extern const struct bpf_func_proto bpf_this_cpu_ptr_proto;
extern const struct bpf_func_proto bpf_for_each_map_elem_proto; extern const struct bpf_func_proto bpf_for_each_map_elem_proto;
extern const struct bpf_func_proto bpf_btf_find_by_name_kind_proto; extern const struct bpf_func_proto bpf_btf_find_by_name_kind_proto;
extern const struct bpf_func_proto bpf_kallsyms_lookup_name_proto;
const struct bpf_func_proto *bpf_tracing_func_proto( const struct bpf_func_proto *bpf_tracing_func_proto(
enum bpf_func_id func_id, const struct bpf_prog *prog); enum bpf_func_id func_id, const struct bpf_prog *prog);
......
...@@ -4033,6 +4033,21 @@ union bpf_attr { ...@@ -4033,6 +4033,21 @@ union bpf_attr {
* Execute close syscall for given FD. * Execute close syscall for given FD.
* Return * Return
* A syscall result. * A syscall result.
*
* long bpf_kallsyms_lookup_name(const char *name, int name_sz, int flags, u64 *res)
* Description
* Get the address of a kernel symbol, returned in *res*. *res* is
* set to 0 if the symbol is not found.
* Return
* On success, zero. On error, a negative value.
*
* **-EINVAL** if *flags* is not zero.
*
* **-EINVAL** if string *name* is not the same size as *name_sz*.
*
* **-ENOENT** if symbol is not found.
*
* **-EPERM** if caller does not have permission to obtain kernel address.
*/ */
#define __BPF_FUNC_MAPPER(FN) \ #define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \ FN(unspec), \
...@@ -4217,6 +4232,7 @@ union bpf_attr { ...@@ -4217,6 +4232,7 @@ union bpf_attr {
FN(sys_bpf), \ FN(sys_bpf), \
FN(btf_find_by_name_kind), \ FN(btf_find_by_name_kind), \
FN(sys_close), \ FN(sys_close), \
FN(kallsyms_lookup_name), \
/* */ /* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper /* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
...@@ -4706,6 +4706,31 @@ const struct bpf_func_proto bpf_sys_close_proto = { ...@@ -4706,6 +4706,31 @@ const struct bpf_func_proto bpf_sys_close_proto = {
.arg1_type = ARG_ANYTHING, .arg1_type = ARG_ANYTHING,
}; };
BPF_CALL_4(bpf_kallsyms_lookup_name, const char *, name, int, name_sz, int, flags, u64 *, res)
{
if (flags)
return -EINVAL;
if (name_sz <= 1 || name[name_sz - 1])
return -EINVAL;
if (!bpf_dump_raw_ok(current_cred()))
return -EPERM;
*res = kallsyms_lookup_name(name);
return *res ? 0 : -ENOENT;
}
const struct bpf_func_proto bpf_kallsyms_lookup_name_proto = {
.func = bpf_kallsyms_lookup_name,
.gpl_only = false,
.ret_type = RET_INTEGER,
.arg1_type = ARG_PTR_TO_MEM,
.arg2_type = ARG_CONST_SIZE,
.arg3_type = ARG_ANYTHING,
.arg4_type = ARG_PTR_TO_LONG,
};
static const struct bpf_func_proto * static const struct bpf_func_proto *
syscall_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) syscall_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{ {
...@@ -4716,6 +4741,8 @@ syscall_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) ...@@ -4716,6 +4741,8 @@ syscall_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
return &bpf_btf_find_by_name_kind_proto; return &bpf_btf_find_by_name_kind_proto;
case BPF_FUNC_sys_close: case BPF_FUNC_sys_close:
return &bpf_sys_close_proto; return &bpf_sys_close_proto;
case BPF_FUNC_kallsyms_lookup_name:
return &bpf_kallsyms_lookup_name_proto;
default: default:
return tracing_prog_func_proto(func_id, prog); return tracing_prog_func_proto(func_id, prog);
} }
......
...@@ -4743,6 +4743,21 @@ union bpf_attr { ...@@ -4743,6 +4743,21 @@ union bpf_attr {
* Execute close syscall for given FD. * Execute close syscall for given FD.
* Return * Return
* A syscall result. * A syscall result.
*
* long bpf_kallsyms_lookup_name(const char *name, int name_sz, int flags, u64 *res)
* Description
* Get the address of a kernel symbol, returned in *res*. *res* is
* set to 0 if the symbol is not found.
* Return
* On success, zero. On error, a negative value.
*
* **-EINVAL** if *flags* is not zero.
*
* **-EINVAL** if string *name* is not the same size as *name_sz*.
*
* **-ENOENT** if symbol is not found.
*
* **-EPERM** if caller does not have permission to obtain kernel address.
*/ */
#define __BPF_FUNC_MAPPER(FN) \ #define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \ FN(unspec), \
...@@ -4927,6 +4942,7 @@ union bpf_attr { ...@@ -4927,6 +4942,7 @@ union bpf_attr {
FN(sys_bpf), \ FN(sys_bpf), \
FN(btf_find_by_name_kind), \ FN(btf_find_by_name_kind), \
FN(sys_close), \ FN(sys_close), \
FN(kallsyms_lookup_name), \
/* */ /* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper /* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册