Lines Matching refs:ext
2062 static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val, in set_kcfg_value_tri() argument
2065 switch (ext->kcfg.type) { in set_kcfg_value_tri()
2069 ext->name, value); in set_kcfg_value_tri()
2090 ext->name, value); in set_kcfg_value_tri()
2093 ext->is_set = true; in set_kcfg_value_tri()
2097 static int set_kcfg_value_str(struct extern_desc *ext, char *ext_val, in set_kcfg_value_str() argument
2102 if (ext->kcfg.type != KCFG_CHAR_ARR) { in set_kcfg_value_str()
2104 ext->name, value); in set_kcfg_value_str()
2111 ext->name, value); in set_kcfg_value_str()
2117 if (len >= ext->kcfg.sz) { in set_kcfg_value_str()
2119 ext->name, value, len, ext->kcfg.sz - 1); in set_kcfg_value_str()
2120 len = ext->kcfg.sz - 1; in set_kcfg_value_str()
2124 ext->is_set = true; in set_kcfg_value_str()
2147 static bool is_kcfg_value_in_range(const struct extern_desc *ext, __u64 v) in is_kcfg_value_in_range() argument
2149 int bit_sz = ext->kcfg.sz * 8; in is_kcfg_value_in_range()
2151 if (ext->kcfg.sz == 8) in is_kcfg_value_in_range()
2166 if (ext->kcfg.is_signed) in is_kcfg_value_in_range()
2172 static int set_kcfg_value_num(struct extern_desc *ext, void *ext_val, in set_kcfg_value_num() argument
2175 if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR && in set_kcfg_value_num()
2176 ext->kcfg.type != KCFG_BOOL) { in set_kcfg_value_num()
2178 ext->name, (unsigned long long)value); in set_kcfg_value_num()
2181 if (ext->kcfg.type == KCFG_BOOL && value > 1) { in set_kcfg_value_num()
2183 ext->name, (unsigned long long)value); in set_kcfg_value_num()
2187 if (!is_kcfg_value_in_range(ext, value)) { in set_kcfg_value_num()
2189 ext->name, (unsigned long long)value, ext->kcfg.sz); in set_kcfg_value_num()
2192 switch (ext->kcfg.sz) { in set_kcfg_value_num()
2208 ext->is_set = true; in set_kcfg_value_num()
2215 struct extern_desc *ext; in bpf_object__process_kconfig_line() local
2242 ext = find_extern_by_name(obj, buf); in bpf_object__process_kconfig_line()
2243 if (!ext || ext->is_set) in bpf_object__process_kconfig_line()
2246 ext_val = data + ext->kcfg.data_off; in bpf_object__process_kconfig_line()
2251 err = set_kcfg_value_tri(ext, ext_val, *value); in bpf_object__process_kconfig_line()
2254 err = set_kcfg_value_str(ext, ext_val, value); in bpf_object__process_kconfig_line()
2260 pr_warn("extern (kcfg) '%s': value '%s' isn't a valid integer\n", ext->name, value); in bpf_object__process_kconfig_line()
2263 if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR) { in bpf_object__process_kconfig_line()
2264 pr_warn("extern (kcfg) '%s': value '%s' implies integer type\n", ext->name, value); in bpf_object__process_kconfig_line()
2267 err = set_kcfg_value_num(ext, ext_val, num); in bpf_object__process_kconfig_line()
2272 pr_debug("extern (kcfg) '%s': set to %s\n", ext->name, value); in bpf_object__process_kconfig_line()
2343 struct extern_desc *last_ext = NULL, *ext; in bpf_object__init_kconfig_map() local
2348 ext = &obj->externs[i]; in bpf_object__init_kconfig_map()
2349 if (ext->type == EXT_KCFG) in bpf_object__init_kconfig_map()
2350 last_ext = ext; in bpf_object__init_kconfig_map()
3477 const struct extern_desc *ext; in obj_needs_vmlinux_btf() local
3479 ext = &obj->externs[i]; in obj_needs_vmlinux_btf()
3480 if (ext->type == EXT_KSYM && ext->ksym.type_id) in obj_needs_vmlinux_btf()
4214 struct extern_desc *ext; in bpf_object__collect_externs() local
4247 ext = obj->externs; in bpf_object__collect_externs()
4248 ext = libbpf_reallocarray(ext, obj->nr_extern + 1, sizeof(*ext)); in bpf_object__collect_externs()
4249 if (!ext) in bpf_object__collect_externs()
4251 obj->externs = ext; in bpf_object__collect_externs()
4252 ext = &ext[obj->nr_extern]; in bpf_object__collect_externs()
4253 memset(ext, 0, sizeof(*ext)); in bpf_object__collect_externs()
4256 ext->btf_id = find_extern_btf_id(obj->btf, ext_name); in bpf_object__collect_externs()
4257 if (ext->btf_id <= 0) { in bpf_object__collect_externs()
4259 ext_name, ext->btf_id); in bpf_object__collect_externs()
4260 return ext->btf_id; in bpf_object__collect_externs()
4262 t = btf__type_by_id(obj->btf, ext->btf_id); in bpf_object__collect_externs()
4263 ext->name = strdup(btf__name_by_offset(obj->btf, t->name_off)); in bpf_object__collect_externs()
4264 if (!ext->name) in bpf_object__collect_externs()
4266 ext->sym_idx = i; in bpf_object__collect_externs()
4267 ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK; in bpf_object__collect_externs()
4269 ext_essent_len = bpf_core_essential_name_len(ext->name); in bpf_object__collect_externs()
4270 ext->essent_name = NULL; in bpf_object__collect_externs()
4271 if (ext_essent_len != strlen(ext->name)) { in bpf_object__collect_externs()
4272 ext->essent_name = strndup(ext->name, ext_essent_len); in bpf_object__collect_externs()
4273 if (!ext->essent_name) in bpf_object__collect_externs()
4277 ext->sec_btf_id = find_extern_sec_btf_id(obj->btf, ext->btf_id); in bpf_object__collect_externs()
4278 if (ext->sec_btf_id <= 0) { in bpf_object__collect_externs()
4280 ext_name, ext->btf_id, ext->sec_btf_id); in bpf_object__collect_externs()
4281 return ext->sec_btf_id; in bpf_object__collect_externs()
4283 sec = (void *)btf__type_by_id(obj->btf, ext->sec_btf_id); in bpf_object__collect_externs()
4289 ext->name, KCONFIG_SEC); in bpf_object__collect_externs()
4293 ext->type = EXT_KCFG; in bpf_object__collect_externs()
4294 ext->kcfg.sz = btf__resolve_size(obj->btf, t->type); in bpf_object__collect_externs()
4295 if (ext->kcfg.sz <= 0) { in bpf_object__collect_externs()
4297 ext_name, ext->kcfg.sz); in bpf_object__collect_externs()
4298 return ext->kcfg.sz; in bpf_object__collect_externs()
4300 ext->kcfg.align = btf__align_of(obj->btf, t->type); in bpf_object__collect_externs()
4301 if (ext->kcfg.align <= 0) { in bpf_object__collect_externs()
4303 ext_name, ext->kcfg.align); in bpf_object__collect_externs()
4306 ext->kcfg.type = find_kcfg_type(obj->btf, t->type, in bpf_object__collect_externs()
4307 &ext->kcfg.is_signed); in bpf_object__collect_externs()
4308 if (ext->kcfg.type == KCFG_UNKNOWN) { in bpf_object__collect_externs()
4314 ext->type = EXT_KSYM; in bpf_object__collect_externs()
4316 &ext->ksym.type_id); in bpf_object__collect_externs()
4328 qsort(obj->externs, obj->nr_extern, sizeof(*ext), cmp_externs); in bpf_object__collect_externs()
4348 ext = &obj->externs[i]; in bpf_object__collect_externs()
4349 if (ext->type != EXT_KSYM) in bpf_object__collect_externs()
4352 i, ext->sym_idx, ext->name); in bpf_object__collect_externs()
4363 ext = find_extern_by_name(obj, ext_name); in bpf_object__collect_externs()
4364 if (!ext) { in bpf_object__collect_externs()
4402 ext = &obj->externs[i]; in bpf_object__collect_externs()
4403 if (ext->type != EXT_KCFG) in bpf_object__collect_externs()
4406 ext->kcfg.data_off = roundup(off, ext->kcfg.align); in bpf_object__collect_externs()
4407 off = ext->kcfg.data_off + ext->kcfg.sz; in bpf_object__collect_externs()
4409 i, ext->sym_idx, ext->kcfg.data_off, ext->name); in bpf_object__collect_externs()
4418 ext = find_extern_by_name(obj, ext_name); in bpf_object__collect_externs()
4419 if (!ext) { in bpf_object__collect_externs()
4425 vs->offset = ext->kcfg.data_off; in bpf_object__collect_externs()
4510 struct extern_desc *ext; in bpf_program__record_reloc() local
4513 ext = &obj->externs[i]; in bpf_program__record_reloc()
4514 if (ext->sym_idx == sym_idx) in bpf_program__record_reloc()
4523 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
6076 int ext_idx, const struct extern_desc *ext) in poison_kfunc_call() argument
6079 prog->name, relo_idx, insn_idx, ext->name); in poison_kfunc_call()
6108 struct extern_desc *ext; in bpf_object__relocate_data() local
6139 ext = &obj->externs[relo->ext_idx]; in bpf_object__relocate_data()
6140 if (ext->type == EXT_KCFG) { in bpf_object__relocate_data()
6148 insn[1].imm = ext->kcfg.data_off; in bpf_object__relocate_data()
6150 if (ext->ksym.type_id && ext->is_set) { /* typed ksyms */ in bpf_object__relocate_data()
6152 insn[0].imm = ext->ksym.kernel_btf_id; in bpf_object__relocate_data()
6153 insn[1].imm = ext->ksym.kernel_btf_obj_fd; in bpf_object__relocate_data()
6155 insn[0].imm = (__u32)ext->ksym.addr; in bpf_object__relocate_data()
6156 insn[1].imm = ext->ksym.addr >> 32; in bpf_object__relocate_data()
6161 ext = &obj->externs[relo->ext_idx]; in bpf_object__relocate_data()
6163 if (ext->is_set) { in bpf_object__relocate_data()
6164 insn[0].imm = ext->ksym.kernel_btf_id; in bpf_object__relocate_data()
6165 insn[0].off = ext->ksym.btf_fd_idx; in bpf_object__relocate_data()
6168 relo->ext_idx, ext); in bpf_object__relocate_data()
7790 const struct extern_desc *ext; in fixup_log_missing_kfunc_call() local
7800 ext = &obj->externs[ext_idx]; in fixup_log_missing_kfunc_call()
7805 insn_idx, ext->name); in fixup_log_missing_kfunc_call()
7867 struct extern_desc *ext = &obj->externs[relo->ext_idx]; in bpf_program_record_relos() local
7872 if (ext->type != EXT_KSYM) in bpf_program_record_relos()
7874 kind = btf_is_var(btf__type_by_id(obj->btf, ext->btf_id)) ? in bpf_program_record_relos()
7876 bpf_gen__record_extern(obj->gen_loader, ext->name, in bpf_program_record_relos()
7877 ext->is_weak, !ext->ksym.type_id, in bpf_program_record_relos()
7881 bpf_gen__record_extern(obj->gen_loader, ext->name, in bpf_program_record_relos()
7882 ext->is_weak, false, false, BTF_KIND_FUNC, in bpf_program_record_relos()
8194 struct extern_desc *ext; in kallsyms_cb() local
8199 ext = find_extern_by_name_with_len(obj, sym_name, res - sym_name); in kallsyms_cb()
8201 ext = find_extern_by_name(obj, sym_name); in kallsyms_cb()
8202 if (!ext || ext->type != EXT_KSYM) in kallsyms_cb()
8205 t = btf__type_by_id(obj->btf, ext->btf_id); in kallsyms_cb()
8209 if (ext->is_set && ext->ksym.addr != sym_addr) { in kallsyms_cb()
8211 sym_name, ext->ksym.addr, sym_addr); in kallsyms_cb()
8214 if (!ext->is_set) { in kallsyms_cb()
8215 ext->is_set = true; in kallsyms_cb()
8216 ext->ksym.addr = sym_addr; in kallsyms_cb()
8262 struct extern_desc *ext) in bpf_object__resolve_ksym_var_btf_id() argument
8271 id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &mod_btf); in bpf_object__resolve_ksym_var_btf_id()
8273 if (id == -ESRCH && ext->is_weak) in bpf_object__resolve_ksym_var_btf_id()
8276 ext->name); in bpf_object__resolve_ksym_var_btf_id()
8281 local_type_id = ext->ksym.type_id; in bpf_object__resolve_ksym_var_btf_id()
8299 ext->name, local_type_id, in bpf_object__resolve_ksym_var_btf_id()
8305 ext->is_set = true; in bpf_object__resolve_ksym_var_btf_id()
8306 ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0; in bpf_object__resolve_ksym_var_btf_id()
8307 ext->ksym.kernel_btf_id = id; in bpf_object__resolve_ksym_var_btf_id()
8309 ext->name, id, btf_kind_str(targ_var), targ_var_name); in bpf_object__resolve_ksym_var_btf_id()
8315 struct extern_desc *ext) in bpf_object__resolve_ksym_func_btf_id() argument
8323 local_func_proto_id = ext->ksym.type_id; in bpf_object__resolve_ksym_func_btf_id()
8325 kfunc_id = find_ksym_btf_id(obj, ext->essent_name ?: ext->name, BTF_KIND_FUNC, &kern_btf, in bpf_object__resolve_ksym_func_btf_id()
8328 if (kfunc_id == -ESRCH && ext->is_weak) in bpf_object__resolve_ksym_func_btf_id()
8331 ext->name); in bpf_object__resolve_ksym_func_btf_id()
8341 if (ext->is_weak) in bpf_object__resolve_ksym_func_btf_id()
8345 ext->name, local_func_proto_id, in bpf_object__resolve_ksym_func_btf_id()
8355 ext->name, mod_btf->fd_array_idx); in bpf_object__resolve_ksym_func_btf_id()
8371 ext->is_set = true; in bpf_object__resolve_ksym_func_btf_id()
8372 ext->ksym.kernel_btf_id = kfunc_id; in bpf_object__resolve_ksym_func_btf_id()
8373 ext->ksym.btf_fd_idx = mod_btf ? mod_btf->fd_array_idx : 0; in bpf_object__resolve_ksym_func_btf_id()
8379 ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0; in bpf_object__resolve_ksym_func_btf_id()
8381 ext->name, mod_btf ? mod_btf->name : "vmlinux", kfunc_id); in bpf_object__resolve_ksym_func_btf_id()
8389 struct extern_desc *ext; in bpf_object__resolve_ksyms_btf_id() local
8393 ext = &obj->externs[i]; in bpf_object__resolve_ksyms_btf_id()
8394 if (ext->type != EXT_KSYM || !ext->ksym.type_id) in bpf_object__resolve_ksyms_btf_id()
8398 ext->is_set = true; in bpf_object__resolve_ksyms_btf_id()
8399 ext->ksym.kernel_btf_obj_fd = 0; in bpf_object__resolve_ksyms_btf_id()
8400 ext->ksym.kernel_btf_id = 0; in bpf_object__resolve_ksyms_btf_id()
8403 t = btf__type_by_id(obj->btf, ext->btf_id); in bpf_object__resolve_ksyms_btf_id()
8405 err = bpf_object__resolve_ksym_var_btf_id(obj, ext); in bpf_object__resolve_ksyms_btf_id()
8407 err = bpf_object__resolve_ksym_func_btf_id(obj, ext); in bpf_object__resolve_ksyms_btf_id()
8419 struct extern_desc *ext; in bpf_object__resolve_externs() local
8430 ext = &obj->externs[i]; in bpf_object__resolve_externs()
8432 if (ext->type == EXT_KSYM) { in bpf_object__resolve_externs()
8433 if (ext->ksym.type_id) in bpf_object__resolve_externs()
8438 } else if (ext->type == EXT_KCFG) { in bpf_object__resolve_externs()
8439 void *ext_ptr = kcfg_data + ext->kcfg.data_off; in bpf_object__resolve_externs()
8443 if (str_has_pfx(ext->name, "CONFIG_")) { in bpf_object__resolve_externs()
8449 if (strcmp(ext->name, "LINUX_KERNEL_VERSION") == 0) { in bpf_object__resolve_externs()
8452 pr_warn("extern (kcfg) '%s': failed to get kernel version\n", ext->name); in bpf_object__resolve_externs()
8455 } else if (strcmp(ext->name, "LINUX_HAS_BPF_COOKIE") == 0) { in bpf_object__resolve_externs()
8457 } else if (strcmp(ext->name, "LINUX_HAS_SYSCALL_WRAPPER") == 0) { in bpf_object__resolve_externs()
8459 } else if (!str_has_pfx(ext->name, "LINUX_") || !ext->is_weak) { in bpf_object__resolve_externs()
8467 pr_warn("extern (kcfg) '%s': unrecognized virtual extern\n", ext->name); in bpf_object__resolve_externs()
8471 err = set_kcfg_value_num(ext, ext_ptr, value); in bpf_object__resolve_externs()
8475 ext->name, (long long)value); in bpf_object__resolve_externs()
8477 pr_warn("extern '%s': unrecognized extern kind\n", ext->name); in bpf_object__resolve_externs()
8487 ext = &obj->externs[i]; in bpf_object__resolve_externs()
8488 if (ext->type == EXT_KCFG && !ext->is_set) { in bpf_object__resolve_externs()
8510 ext = &obj->externs[i]; in bpf_object__resolve_externs()
8512 if (!ext->is_set && !ext->is_weak) { in bpf_object__resolve_externs()
8513 pr_warn("extern '%s' (strong): not resolved\n", ext->name); in bpf_object__resolve_externs()
8515 } else if (!ext->is_set) { in bpf_object__resolve_externs()
8517 ext->name); in bpf_object__resolve_externs()