Lines Matching defs:ext
219 [BPF_PROG_TYPE_EXT] = "ext",
1855 static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val,
1858 switch (ext->kcfg.type) {
1862 ext->name, value);
1883 ext->name, value);
1886 ext->is_set = true;
1890 static int set_kcfg_value_str(struct extern_desc *ext, char *ext_val,
1895 if (ext->kcfg.type != KCFG_CHAR_ARR) {
1897 ext->name, value);
1904 ext->name, value);
1910 if (len >= ext->kcfg.sz) {
1912 ext->name, value, len, ext->kcfg.sz - 1);
1913 len = ext->kcfg.sz - 1;
1917 ext->is_set = true;
1940 static bool is_kcfg_value_in_range(const struct extern_desc *ext, __u64 v)
1942 int bit_sz = ext->kcfg.sz * 8;
1944 if (ext->kcfg.sz == 8)
1947 /* Validate that value stored in u64 fits in integer of `ext->sz`
1959 if (ext->kcfg.is_signed)
1965 static int set_kcfg_value_num(struct extern_desc *ext, void *ext_val,
1968 if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR &&
1969 ext->kcfg.type != KCFG_BOOL) {
1971 ext->name, (unsigned long long)value);
1974 if (ext->kcfg.type == KCFG_BOOL && value > 1) {
1976 ext->name, (unsigned long long)value);
1980 if (!is_kcfg_value_in_range(ext, value)) {
1982 ext->name, (unsigned long long)value, ext->kcfg.sz);
1985 switch (ext->kcfg.sz) {
2001 ext->is_set = true;
2008 struct extern_desc *ext;
2035 ext = find_extern_by_name(obj, buf);
2036 if (!ext || ext->is_set)
2039 ext_val = data + ext->kcfg.data_off;
2044 err = set_kcfg_value_tri(ext, ext_val, *value);
2047 err = set_kcfg_value_str(ext, ext_val, value);
2053 pr_warn("extern (kcfg) '%s': value '%s' isn't a valid integer\n", ext->name, value);
2056 if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR) {
2057 pr_warn("extern (kcfg) '%s': value '%s' implies integer type\n", ext->name, value);
2060 err = set_kcfg_value_num(ext, ext_val, num);
2065 pr_debug("extern (kcfg) '%s': set to %s\n", ext->name, value);
2136 struct extern_desc *last_ext = NULL, *ext;
2141 ext = &obj->externs[i];
2142 if (ext->type == EXT_KCFG)
2143 last_ext = ext;
2966 /* setup .BTF.ext to ELF section mapping */
3180 const struct extern_desc *ext;
3182 ext = &obj->externs[i];
3183 if (ext->type == EXT_KSYM && ext->ksym.type_id)
3633 /* .BTF and .BTF.ext don't need relocations */
4151 struct extern_desc *ext;
4193 ext = obj->externs;
4194 ext = libbpf_reallocarray(ext, obj->nr_extern + 1, sizeof(*ext));
4195 if (!ext)
4197 obj->externs = ext;
4198 ext = &ext[obj->nr_extern];
4199 memset(ext, 0, sizeof(*ext));
4202 ext->btf_id = find_extern_btf_id(obj->btf, ext_name);
4203 if (ext->btf_id <= 0) {
4205 ext_name, ext->btf_id);
4206 return ext->btf_id;
4208 t = btf__type_by_id(obj->btf, ext->btf_id);
4209 ext->name = btf__name_by_offset(obj->btf, t->name_off);
4210 ext->sym_idx = i;
4211 ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK;
4213 ext_essent_len = bpf_core_essential_name_len(ext->name);
4214 ext->essent_name = NULL;
4215 if (ext_essent_len != strlen(ext->name)) {
4216 ext->essent_name = strndup(ext->name, ext_essent_len);
4217 if (!ext->essent_name)
4221 ext->sec_btf_id = find_extern_sec_btf_id(obj->btf, ext->btf_id);
4222 if (ext->sec_btf_id <= 0) {
4224 ext_name, ext->btf_id, ext->sec_btf_id);
4225 return ext->sec_btf_id;
4227 sec = (void *)btf__type_by_id(obj->btf, ext->sec_btf_id);
4233 ext->name, KCONFIG_SEC);
4237 ext->type = EXT_KCFG;
4238 ext->kcfg.sz = btf__resolve_size(obj->btf, t->type);
4239 if (ext->kcfg.sz <= 0) {
4241 ext_name, ext->kcfg.sz);
4242 return ext->kcfg.sz;
4244 ext->kcfg.align = btf__align_of(obj->btf, t->type);
4245 if (ext->kcfg.align <= 0) {
4247 ext_name, ext->kcfg.align);
4250 ext->kcfg.type = find_kcfg_type(obj->btf, t->type,
4251 &ext->kcfg.is_signed);
4252 if (ext->kcfg.type == KCFG_UNKNOWN) {
4258 ext->type = EXT_KSYM;
4260 &ext->ksym.type_id);
4272 qsort(obj->externs, obj->nr_extern, sizeof(*ext), cmp_externs);
4292 ext = &obj->externs[i];
4293 if (ext->type != EXT_KSYM)
4296 i, ext->sym_idx, ext->name);
4307 ext = find_extern_by_name(obj, ext_name);
4308 if (!ext) {
4346 ext = &obj->externs[i];
4347 if (ext->type != EXT_KCFG)
4350 ext->kcfg.data_off = roundup(off, ext->kcfg.align);
4351 off = ext->kcfg.data_off + ext->kcfg.sz;
4353 i, ext->sym_idx, ext->kcfg.data_off, ext->name);
4362 ext = find_extern_by_name(obj, ext_name);
4363 if (!ext) {
4369 vs->offset = ext->kcfg.data_off;
4454 struct extern_desc *ext;
4457 ext = &obj->externs[i];
4458 if (ext->sym_idx == sym_idx)
4467 prog->name, i, ext->name, ext->sym_idx, insn_idx);
6241 * appends all the .BTF.ext info that used to belong to that
6342 int ext_idx, const struct extern_desc *ext)
6345 prog->name, relo_idx, insn_idx, ext->name);
6374 struct extern_desc *ext;
6405 ext = &obj->externs[relo->ext_idx];
6406 if (ext->type == EXT_KCFG) {
6414 insn[1].imm = ext->kcfg.data_off;
6416 if (ext->ksym.type_id && ext->is_set) { /* typed ksyms */
6418 insn[0].imm = ext->ksym.kernel_btf_id;
6419 insn[1].imm = ext->ksym.kernel_btf_obj_fd;
6421 insn[0].imm = (__u32)ext->ksym.addr;
6422 insn[1].imm = ext->ksym.addr >> 32;
6427 ext = &obj->externs[relo->ext_idx];
6429 if (ext->is_set) {
6430 insn[0].imm = ext->ksym.kernel_btf_id;
6431 insn[0].off = ext->ksym.btf_fd_idx;
6434 relo->ext_idx, ext);
6509 * instructions, while .BTF.ext instruction offsets generated
6536 /* no .BTF.ext relocation if .BTF.ext is missing or kernel doesn't
6554 pr_warn("prog '%s': error relocating .BTF.ext function info: %d\n",
6563 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name);
6567 pr_warn("prog '%s': missing .BTF.ext function info for the main program, skipping all of .BTF.ext func info.\n",
6582 pr_warn("prog '%s': error relocating .BTF.ext line info: %d\n",
6591 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name);
6595 pr_warn("prog '%s': missing .BTF.ext line info for the main program, skipping all of .BTF.ext line info.\n",
7632 const struct extern_desc *ext;
7642 ext = &obj->externs[ext_idx];
7647 insn_idx, ext->name);
7709 struct extern_desc *ext = &obj->externs[relo->ext_idx];
7714 if (ext->type != EXT_KSYM)
7716 kind = btf_is_var(btf__type_by_id(obj->btf, ext->btf_id)) ?
7718 bpf_gen__record_extern(obj->gen_loader, ext->name,
7719 ext->is_weak, !ext->ksym.type_id,
7723 bpf_gen__record_extern(obj->gen_loader, ext->name,
7724 ext->is_weak, false, false, BTF_KIND_FUNC,
8008 struct extern_desc *ext;
8010 ext = find_extern_by_name(obj, sym_name);
8011 if (!ext || ext->type != EXT_KSYM)
8014 t = btf__type_by_id(obj->btf, ext->btf_id);
8018 if (ext->is_set && ext->ksym.addr != sym_addr) {
8020 sym_name, ext->ksym.addr, sym_addr);
8023 if (!ext->is_set) {
8024 ext->is_set = true;
8025 ext->ksym.addr = sym_addr;
8071 struct extern_desc *ext)
8080 id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &mod_btf);
8082 if (id == -ESRCH && ext->is_weak)
8085 ext->name);
8090 local_type_id = ext->ksym.type_id;
8108 ext->name, local_type_id,
8114 ext->is_set = true;
8115 ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0;
8116 ext->ksym.kernel_btf_id = id;
8118 ext->name, id, btf_kind_str(targ_var), targ_var_name);
8124 struct extern_desc *ext)
8132 local_func_proto_id = ext->ksym.type_id;
8134 kfunc_id = find_ksym_btf_id(obj, ext->essent_name ?: ext->name, BTF_KIND_FUNC, &kern_btf,
8137 if (kfunc_id == -ESRCH && ext->is_weak)
8140 ext->name);
8150 if (ext->is_weak)
8154 ext->name, local_func_proto_id,
8164 ext->name, mod_btf->fd_array_idx);
8180 ext->is_set = true;
8181 ext->ksym.kernel_btf_id = kfunc_id;
8182 ext->ksym.btf_fd_idx = mod_btf ? mod_btf->fd_array_idx : 0;
8188 ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0;
8190 ext->name, mod_btf ? mod_btf->name : "vmlinux", kfunc_id);
8198 struct extern_desc *ext;
8202 ext = &obj->externs[i];
8203 if (ext->type != EXT_KSYM || !ext->ksym.type_id)
8207 ext->is_set = true;
8208 ext->ksym.kernel_btf_obj_fd = 0;
8209 ext->ksym.kernel_btf_id = 0;
8212 t = btf__type_by_id(obj->btf, ext->btf_id);
8214 err = bpf_object__resolve_ksym_var_btf_id(obj, ext);
8216 err = bpf_object__resolve_ksym_func_btf_id(obj, ext);
8228 struct extern_desc *ext;
8239 ext = &obj->externs[i];
8241 if (ext->type == EXT_KSYM) {
8242 if (ext->ksym.type_id)
8247 } else if (ext->type == EXT_KCFG) {
8248 void *ext_ptr = kcfg_data + ext->kcfg.data_off;
8252 if (str_has_pfx(ext->name, "CONFIG_")) {
8258 if (strcmp(ext->name, "LINUX_KERNEL_VERSION") == 0) {
8261 pr_warn("extern (kcfg) '%s': failed to get kernel version\n", ext->name);
8264 } else if (strcmp(ext->name, "LINUX_HAS_BPF_COOKIE") == 0) {
8266 } else if (strcmp(ext->name, "LINUX_HAS_SYSCALL_WRAPPER") == 0) {
8268 } else if (!str_has_pfx(ext->name, "LINUX_") || !ext->is_weak) {
8276 pr_warn("extern (kcfg) '%s': unrecognized virtual extern\n", ext->name);
8280 err = set_kcfg_value_num(ext, ext_ptr, value);
8284 ext->name, (long long)value);
8286 pr_warn("extern '%s': unrecognized extern kind\n", ext->name);
8296 ext = &obj->externs[i];
8297 if (ext->type == EXT_KCFG && !ext->is_set) {
8319 ext = &obj->externs[i];
8321 if (!ext->is_set && !ext->is_weak) {
8322 pr_warn("extern '%s' (strong): not resolved\n", ext->name);
8324 } else if (!ext->is_set) {
8326 ext->name);