提交 22887d48 编写于 作者: A Alexei Starovoitov 提交者: Zheng Zengkai

libbpf: Move CO-RE types into relo_core.h.

mainline inclusion
from mainline-5.15-rc1
commit 301ba4d7
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=301ba4d710284e088d278adc477b7edad834577f

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

In order to make a clean split of CO-RE logic move its types
into independent header file.
Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
Signed-off-by: NAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210721000822.40958-4-alexei.starovoitov@gmail.com
(cherry picked from commit 301ba4d7)
Signed-off-by: NWang Yufen <wangyufen@huawei.com>
上级 2cd4cbbb
...@@ -5036,34 +5036,20 @@ static size_t bpf_core_essential_name_len(const char *name) ...@@ -5036,34 +5036,20 @@ static size_t bpf_core_essential_name_len(const char *name)
return n; return n;
} }
struct core_cand static void bpf_core_free_cands(struct bpf_core_cand_list *cands)
{
const struct btf *btf;
const struct btf_type *t;
const char *name;
__u32 id;
};
/* dynamically sized list of type IDs and its associated struct btf */
struct core_cand_list {
struct core_cand *cands;
int len;
};
static void bpf_core_free_cands(struct core_cand_list *cands)
{ {
free(cands->cands); free(cands->cands);
free(cands); free(cands);
} }
static int bpf_core_add_cands(struct core_cand *local_cand, static int bpf_core_add_cands(struct bpf_core_cand *local_cand,
size_t local_essent_len, size_t local_essent_len,
const struct btf *targ_btf, const struct btf *targ_btf,
const char *targ_btf_name, const char *targ_btf_name,
int targ_start_id, int targ_start_id,
struct core_cand_list *cands) struct bpf_core_cand_list *cands)
{ {
struct core_cand *new_cands, *cand; struct bpf_core_cand *new_cands, *cand;
const struct btf_type *t; const struct btf_type *t;
const char *targ_name; const char *targ_name;
size_t targ_essent_len; size_t targ_essent_len;
...@@ -5199,11 +5185,11 @@ static int load_module_btfs(struct bpf_object *obj) ...@@ -5199,11 +5185,11 @@ static int load_module_btfs(struct bpf_object *obj)
return 0; return 0;
} }
static struct core_cand_list * static struct bpf_core_cand_list *
bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 local_type_id) bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 local_type_id)
{ {
struct core_cand local_cand = {}; struct bpf_core_cand local_cand = {};
struct core_cand_list *cands; struct bpf_core_cand_list *cands;
const struct btf *main_btf; const struct btf *main_btf;
size_t local_essent_len; size_t local_essent_len;
int err, i; int err, i;
...@@ -6232,7 +6218,7 @@ static int bpf_core_apply_relo_insn(const char *prog_name, struct bpf_insn *insn ...@@ -6232,7 +6218,7 @@ static int bpf_core_apply_relo_insn(const char *prog_name, struct bpf_insn *insn
const struct bpf_core_relo *relo, const struct bpf_core_relo *relo,
int relo_idx, int relo_idx,
const struct btf *local_btf, const struct btf *local_btf,
struct core_cand_list *cands) struct bpf_core_cand_list *cands)
{ {
struct bpf_core_spec local_spec, cand_spec, targ_spec = {}; struct bpf_core_spec local_spec, cand_spec, targ_spec = {};
struct bpf_core_relo_res cand_res, targ_res; struct bpf_core_relo_res cand_res, targ_res;
...@@ -6386,7 +6372,7 @@ static int bpf_core_apply_relo(struct bpf_program *prog, ...@@ -6386,7 +6372,7 @@ static int bpf_core_apply_relo(struct bpf_program *prog,
struct hashmap *cand_cache) struct hashmap *cand_cache)
{ {
const void *type_key = u32_as_hash_key(relo->type_id); const void *type_key = u32_as_hash_key(relo->type_id);
struct core_cand_list *cands = NULL; struct bpf_core_cand_list *cands = NULL;
const char *prog_name = prog->name; const char *prog_name = prog->name;
const struct btf_type *local_type; const struct btf_type *local_type;
const char *local_name; const char *local_name;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <errno.h> #include <errno.h>
#include <linux/err.h> #include <linux/err.h>
#include "libbpf_legacy.h" #include "libbpf_legacy.h"
#include "relo_core.h"
/* make sure libbpf doesn't use kernel-only integer typedefs */ /* make sure libbpf doesn't use kernel-only integer typedefs */
#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 #pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64
...@@ -366,76 +367,6 @@ struct bpf_line_info_min { ...@@ -366,76 +367,6 @@ struct bpf_line_info_min {
__u32 line_col; __u32 line_col;
}; };
/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value
* has to be adjusted by relocations.
*/
enum bpf_core_relo_kind {
BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */
BPF_FIELD_BYTE_SIZE = 1, /* field size in bytes */
BPF_FIELD_EXISTS = 2, /* field existence in target kernel */
BPF_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */
BPF_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */
BPF_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */
BPF_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */
BPF_TYPE_ID_TARGET = 7, /* type ID in target kernel */
BPF_TYPE_EXISTS = 8, /* type existence in target kernel */
BPF_TYPE_SIZE = 9, /* type size in bytes */
BPF_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */
BPF_ENUMVAL_VALUE = 11, /* enum value integer value */
};
/* The minimum bpf_core_relo checked by the loader
*
* CO-RE relocation captures the following data:
* - insn_off - instruction offset (in bytes) within a BPF program that needs
* its insn->imm field to be relocated with actual field info;
* - type_id - BTF type ID of the "root" (containing) entity of a relocatable
* type or field;
* - access_str_off - offset into corresponding .BTF string section. String
* interpretation depends on specific relocation kind:
* - for field-based relocations, string encodes an accessed field using
* a sequence of field and array indices, separated by colon (:). It's
* conceptually very close to LLVM's getelementptr ([0]) instruction's
* arguments for identifying offset to a field.
* - for type-based relocations, strings is expected to be just "0";
* - for enum value-based relocations, string contains an index of enum
* value within its enum type;
*
* Example to provide a better feel.
*
* struct sample {
* int a;
* struct {
* int b[10];
* };
* };
*
* struct sample *s = ...;
* int x = &s->a; // encoded as "0:0" (a is field #0)
* int y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1,
* // b is field #0 inside anon struct, accessing elem #5)
* int z = &s[10]->b; // encoded as "10:1" (ptr is used as an array)
*
* type_id for all relocs in this example will capture BTF type id of
* `struct sample`.
*
* Such relocation is emitted when using __builtin_preserve_access_index()
* Clang built-in, passing expression that captures field address, e.g.:
*
* bpf_probe_read(&dst, sizeof(dst),
* __builtin_preserve_access_index(&src->a.b.c));
*
* In this case Clang will emit field relocation recording necessary data to
* be able to find offset of embedded `a.b.c` field within `src` struct.
*
* [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction
*/
struct bpf_core_relo {
__u32 insn_off;
__u32 type_id;
__u32 access_str_off;
enum bpf_core_relo_kind kind;
};
typedef int (*type_id_visit_fn)(__u32 *type_id, void *ctx); typedef int (*type_id_visit_fn)(__u32 *type_id, void *ctx);
typedef int (*str_off_visit_fn)(__u32 *str_off, void *ctx); typedef int (*str_off_visit_fn)(__u32 *str_off, void *ctx);
......
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
/* Copyright (c) 2019 Facebook */
#ifndef __RELO_CORE_H
#define __RELO_CORE_H
/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value
* has to be adjusted by relocations.
*/
enum bpf_core_relo_kind {
BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */
BPF_FIELD_BYTE_SIZE = 1, /* field size in bytes */
BPF_FIELD_EXISTS = 2, /* field existence in target kernel */
BPF_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */
BPF_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */
BPF_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */
BPF_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */
BPF_TYPE_ID_TARGET = 7, /* type ID in target kernel */
BPF_TYPE_EXISTS = 8, /* type existence in target kernel */
BPF_TYPE_SIZE = 9, /* type size in bytes */
BPF_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */
BPF_ENUMVAL_VALUE = 11, /* enum value integer value */
};
/* The minimum bpf_core_relo checked by the loader
*
* CO-RE relocation captures the following data:
* - insn_off - instruction offset (in bytes) within a BPF program that needs
* its insn->imm field to be relocated with actual field info;
* - type_id - BTF type ID of the "root" (containing) entity of a relocatable
* type or field;
* - access_str_off - offset into corresponding .BTF string section. String
* interpretation depends on specific relocation kind:
* - for field-based relocations, string encodes an accessed field using
* a sequence of field and array indices, separated by colon (:). It's
* conceptually very close to LLVM's getelementptr ([0]) instruction's
* arguments for identifying offset to a field.
* - for type-based relocations, strings is expected to be just "0";
* - for enum value-based relocations, string contains an index of enum
* value within its enum type;
*
* Example to provide a better feel.
*
* struct sample {
* int a;
* struct {
* int b[10];
* };
* };
*
* struct sample *s = ...;
* int x = &s->a; // encoded as "0:0" (a is field #0)
* int y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1,
* // b is field #0 inside anon struct, accessing elem #5)
* int z = &s[10]->b; // encoded as "10:1" (ptr is used as an array)
*
* type_id for all relocs in this example will capture BTF type id of
* `struct sample`.
*
* Such relocation is emitted when using __builtin_preserve_access_index()
* Clang built-in, passing expression that captures field address, e.g.:
*
* bpf_probe_read(&dst, sizeof(dst),
* __builtin_preserve_access_index(&src->a.b.c));
*
* In this case Clang will emit field relocation recording necessary data to
* be able to find offset of embedded `a.b.c` field within `src` struct.
*
* [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction
*/
struct bpf_core_relo {
__u32 insn_off;
__u32 type_id;
__u32 access_str_off;
enum bpf_core_relo_kind kind;
};
struct bpf_core_cand
{
const struct btf *btf;
const struct btf_type *t;
const char *name;
__u32 id;
};
/* dynamically sized list of type IDs and its associated struct btf */
struct bpf_core_cand_list {
struct bpf_core_cand *cands;
int len;
};
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册