@@ -2,6 +2,7 @@
SPDX-License-Identifier: GPL-2.0-only
Copyright (C) 2019 Facebook
+ Copyright (c) 2022, Oracle and/or its affiliates.
Derived from ctf_encoder.c, which is:
@@ -36,7 +37,7 @@ struct elf_function {
bool generated;
};
-#define MAX_PERCPU_VAR_CNT 4096
+#define MAX_VAR_CNT 4096
struct var_info {
uint64_t addr;
@@ -60,12 +61,12 @@ struct btf_encoder {
is_rel;
uint32_t array_index_id;
struct {
- struct var_info vars[MAX_PERCPU_VAR_CNT];
+ struct var_info vars[MAX_VAR_CNT];
int var_cnt;
- uint32_t shndx;
- uint64_t base_addr;
- uint64_t sec_sz;
- } percpu;
+ uint32_t percpu_shndx;
+ uint64_t percpu_base_addr;
+ uint64_t percpu_sec_sz;
+ } variables;
struct {
struct elf_function *entries;
int allocated;
@@ -1126,8 +1127,8 @@ static int percpu_var_cmp(const void *_a, const void *_b)
static bool btf_encoder__percpu_var_exists(struct btf_encoder *encoder, uint64_t addr, uint32_t *sz, const char **name)
{
struct var_info key = { .addr = addr };
- const struct var_info *p = bsearch(&key, encoder->percpu.vars, encoder->percpu.var_cnt,
- sizeof(encoder->percpu.vars[0]), percpu_var_cmp);
+ const struct var_info *p = bsearch(&key, encoder->variables.vars, encoder->variables.var_cnt,
+ sizeof(encoder->variables.vars[0]), percpu_var_cmp);
if (!p)
return false;
@@ -1143,7 +1144,7 @@ static int btf_encoder__collect_percpu_var(struct btf_encoder *encoder, GElf_Sym
uint32_t size;
/* compare a symbol's shndx to determine if it's a percpu variable */
- if (sym_sec_idx != encoder->percpu.shndx)
+ if (sym_sec_idx != encoder->variables.percpu_shndx)
return 0;
if (elf_sym__type(sym) != STT_OBJECT)
return 0;
@@ -1171,17 +1172,17 @@ static int btf_encoder__collect_percpu_var(struct btf_encoder *encoder, GElf_Sym
* ET_EXEC file) we need to subtract the section address.
*/
if (!encoder->is_rel)
- addr -= encoder->percpu.base_addr;
+ addr -= encoder->variables.percpu_base_addr;
- if (encoder->percpu.var_cnt == MAX_PERCPU_VAR_CNT) {
+ if (encoder->variables.var_cnt == MAX_VAR_CNT) {
fprintf(stderr, "Reached the limit of per-CPU variables: %d\n",
- MAX_PERCPU_VAR_CNT);
+ MAX_VAR_CNT);
return -1;
}
- encoder->percpu.vars[encoder->percpu.var_cnt].addr = addr;
- encoder->percpu.vars[encoder->percpu.var_cnt].sz = size;
- encoder->percpu.vars[encoder->percpu.var_cnt].name = sym_name;
- encoder->percpu.var_cnt++;
+ encoder->variables.vars[encoder->variables.var_cnt].addr = addr;
+ encoder->variables.vars[encoder->variables.var_cnt].sz = size;
+ encoder->variables.vars[encoder->variables.var_cnt].name = sym_name;
+ encoder->variables.var_cnt++;
return 0;
}
@@ -1193,7 +1194,7 @@ static int btf_encoder__collect_symbols(struct btf_encoder *encoder, bool collec
GElf_Sym sym;
/* cache variables' addresses, preparing for searching in symtab. */
- encoder->percpu.var_cnt = 0;
+ encoder->variables.var_cnt = 0;
/* search within symtab for percpu variables */
elf_symtab__for_each_symbol_index(encoder->symtab, core_id, sym, sym_sec_idx) {
@@ -1204,11 +1205,11 @@ static int btf_encoder__collect_symbols(struct btf_encoder *encoder, bool collec
}
if (collect_percpu_vars) {
- if (encoder->percpu.var_cnt)
- qsort(encoder->percpu.vars, encoder->percpu.var_cnt, sizeof(encoder->percpu.vars[0]), percpu_var_cmp);
+ if (encoder->variables.var_cnt)
+ qsort(encoder->variables.vars, encoder->variables.var_cnt, sizeof(encoder->variables.vars[0]), percpu_var_cmp);
if (encoder->verbose)
- printf("Found %d per-CPU variables!\n", encoder->percpu.var_cnt);
+ printf("Found %d per-CPU variables!\n", encoder->variables.var_cnt);
}
if (encoder->functions.cnt) {
@@ -1238,7 +1239,7 @@ static int btf_encoder__encode_cu_variables(struct btf_encoder *encoder, struct
struct tag *pos;
int err = -1;
- if (encoder->percpu.shndx == 0 || !encoder->symtab)
+ if (encoder->variables.percpu_shndx == 0 || !encoder->symtab)
return 0;
if (encoder->verbose)
@@ -1268,9 +1269,10 @@ static int btf_encoder__encode_cu_variables(struct btf_encoder *encoder, struct
* always contains virtual symbol addresses, so subtract
* the section address unconditionally.
*/
- if (addr < encoder->percpu.base_addr || addr >= encoder->percpu.base_addr + encoder->percpu.sec_sz)
+ if (addr < encoder->variables.percpu_base_addr ||
+ addr >= encoder->variables.percpu_base_addr + encoder->variables.percpu_sec_sz)
continue;
- addr -= encoder->percpu.base_addr;
+ addr -= encoder->variables.percpu_base_addr;
if (!btf_encoder__percpu_var_exists(encoder, addr, &size, &name))
continue; /* not a per-CPU variable */
@@ -1418,9 +1420,9 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam
if (encoder->verbose)
printf("%s: '%s' doesn't have '%s' section\n", __func__, cu->filename, PERCPU_SECTION);
} else {
- encoder->percpu.shndx = elf_ndxscn(sec);
- encoder->percpu.base_addr = shdr.sh_addr;
- encoder->percpu.sec_sz = shdr.sh_size;
+ encoder->variables.percpu_shndx = elf_ndxscn(sec);
+ encoder->variables.percpu_base_addr = shdr.sh_addr;
+ encoder->variables.percpu_sec_sz = shdr.sh_size;
}
if (btf_encoder__collect_symbols(encoder, !encoder->skip_encoding_vars))
The BTF encoder will now be storing symbol data for more than just percpu variables. Rename the data structure fields so that they are more general. Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com> --- btf_encoder.c | 54 ++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 26 deletions(-)