Lines Matching defs:ext
208 [BPF_PROG_TYPE_EXT] = "ext",
1758 static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val,
1761 switch (ext->kcfg.type) {
1765 ext->name, value);
1786 ext->name, value);
1789 ext->is_set = true;
1793 static int set_kcfg_value_str(struct extern_desc *ext, char *ext_val,
1798 if (ext->kcfg.type != KCFG_CHAR_ARR) {
1800 ext->name, value);
1807 ext->name, value);
1813 if (len >= ext->kcfg.sz) {
1815 ext->name, value, len, ext->kcfg.sz - 1);
1816 len = ext->kcfg.sz - 1;
1820 ext->is_set = true;
1843 static bool is_kcfg_value_in_range(const struct extern_desc *ext, __u64 v)
1845 int bit_sz = ext->kcfg.sz * 8;
1847 if (ext->kcfg.sz == 8)
1850 /* Validate that value stored in u64 fits in integer of `ext->sz`
1862 if (ext->kcfg.is_signed)
1868 static int set_kcfg_value_num(struct extern_desc *ext, void *ext_val,
1871 if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR &&
1872 ext->kcfg.type != KCFG_BOOL) {
1874 ext->name, (unsigned long long)value);
1877 if (ext->kcfg.type == KCFG_BOOL && value > 1) {
1879 ext->name, (unsigned long long)value);
1883 if (!is_kcfg_value_in_range(ext, value)) {
1885 ext->name, (unsigned long long)value, ext->kcfg.sz);
1888 switch (ext->kcfg.sz) {
1904 ext->is_set = true;
1911 struct extern_desc *ext;
1938 ext = find_extern_by_name(obj, buf);
1939 if (!ext || ext->is_set)
1942 ext_val = data + ext->kcfg.data_off;
1947 err = set_kcfg_value_tri(ext, ext_val, *value);
1950 err = set_kcfg_value_str(ext, ext_val, value);
1956 pr_warn("extern (kcfg) '%s': value '%s' isn't a valid integer\n", ext->name, value);
1959 if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR) {
1960 pr_warn("extern (kcfg) '%s': value '%s' implies integer type\n", ext->name, value);
1963 err = set_kcfg_value_num(ext, ext_val, num);
1968 pr_debug("extern (kcfg) '%s': set to %s\n", ext->name, value);
2039 struct extern_desc *last_ext = NULL, *ext;
2044 ext = &obj->externs[i];
2045 if (ext->type == EXT_KCFG)
2046 last_ext = ext;
2858 /* setup .BTF.ext to ELF section mapping */
3058 const struct extern_desc *ext;
3060 ext = &obj->externs[i];
3061 if (ext->type == EXT_KSYM && ext->ksym.type_id)
3365 /* .BTF and .BTF.ext don't need relocations */
3776 struct extern_desc *ext;
3809 ext = obj->externs;
3810 ext = libbpf_reallocarray(ext, obj->nr_extern + 1, sizeof(*ext));
3811 if (!ext)
3813 obj->externs = ext;
3814 ext = &ext[obj->nr_extern];
3815 memset(ext, 0, sizeof(*ext));
3818 ext->btf_id = find_extern_btf_id(obj->btf, ext_name);
3819 if (ext->btf_id <= 0) {
3821 ext_name, ext->btf_id);
3822 return ext->btf_id;
3824 t = btf__type_by_id(obj->btf, ext->btf_id);
3825 ext->name = btf__name_by_offset(obj->btf, t->name_off);
3826 ext->sym_idx = i;
3827 ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK;
3829 ext_essent_len = bpf_core_essential_name_len(ext->name);
3830 ext->essent_name = NULL;
3831 if (ext_essent_len != strlen(ext->name)) {
3832 ext->essent_name = strndup(ext->name, ext_essent_len);
3833 if (!ext->essent_name)
3837 ext->sec_btf_id = find_extern_sec_btf_id(obj->btf, ext->btf_id);
3838 if (ext->sec_btf_id <= 0) {
3840 ext_name, ext->btf_id, ext->sec_btf_id);
3841 return ext->sec_btf_id;
3843 sec = (void *)btf__type_by_id(obj->btf, ext->sec_btf_id);
3849 ext->name, KCONFIG_SEC);
3853 ext->type = EXT_KCFG;
3854 ext->kcfg.sz = btf__resolve_size(obj->btf, t->type);
3855 if (ext->kcfg.sz <= 0) {
3857 ext_name, ext->kcfg.sz);
3858 return ext->kcfg.sz;
3860 ext->kcfg.align = btf__align_of(obj->btf, t->type);
3861 if (ext->kcfg.align <= 0) {
3863 ext_name, ext->kcfg.align);
3866 ext->kcfg.type = find_kcfg_type(obj->btf, t->type,
3867 &ext->kcfg.is_signed);
3868 if (ext->kcfg.type == KCFG_UNKNOWN) {
3874 ext->type = EXT_KSYM;
3876 &ext->ksym.type_id);
3888 qsort(obj->externs, obj->nr_extern, sizeof(*ext), cmp_externs);
3908 ext = &obj->externs[i];
3909 if (ext->type != EXT_KSYM)
3912 i, ext->sym_idx, ext->name);
3923 ext = find_extern_by_name(obj, ext_name);
3924 if (!ext) {
3962 ext = &obj->externs[i];
3963 if (ext->type != EXT_KCFG)
3966 ext->kcfg.data_off = roundup(off, ext->kcfg.align);
3967 off = ext->kcfg.data_off + ext->kcfg.sz;
3969 i, ext->sym_idx, ext->kcfg.data_off, ext->name);
3978 ext = find_extern_by_name(obj, ext_name);
3979 if (!ext) {
3985 vs->offset = ext->kcfg.data_off;
4070 struct extern_desc *ext;
4073 ext = &obj->externs[i];
4074 if (ext->sym_idx == sym_idx)
4083 prog->name, i, ext->name, ext->sym_idx, insn_idx);
5836 * appends all the .BTF.ext info that used to belong to that
5937 int ext_idx, const struct extern_desc *ext)
5940 prog->name, relo_idx, insn_idx, ext->name);
5969 struct extern_desc *ext;
6000 ext = &obj->externs[relo->ext_idx];
6001 if (ext->type == EXT_KCFG) {
6009 insn[1].imm = ext->kcfg.data_off;
6011 if (ext->ksym.type_id && ext->is_set) { /* typed ksyms */
6013 insn[0].imm = ext->ksym.kernel_btf_id;
6014 insn[1].imm = ext->ksym.kernel_btf_obj_fd;
6016 insn[0].imm = (__u32)ext->ksym.addr;
6017 insn[1].imm = ext->ksym.addr >> 32;
6022 ext = &obj->externs[relo->ext_idx];
6024 if (ext->is_set) {
6025 insn[0].imm = ext->ksym.kernel_btf_id;
6026 insn[0].off = ext->ksym.btf_fd_idx;
6029 relo->ext_idx, ext);
6104 * instructions, while .BTF.ext instruction offsets generated
6131 /* no .BTF.ext relocation if .BTF.ext is missing or kernel doesn't
6149 pr_warn("prog '%s': error relocating .BTF.ext function info: %d\n",
6158 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name);
6162 pr_warn("prog '%s': missing .BTF.ext function info for the main program, skipping all of .BTF.ext func info.\n",
6177 pr_warn("prog '%s': error relocating .BTF.ext line info: %d\n",
6186 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name);
6190 pr_warn("prog '%s': missing .BTF.ext line info for the main program, skipping all of .BTF.ext line info.\n",
7189 const struct extern_desc *ext;
7199 ext = &obj->externs[ext_idx];
7204 insn_idx, ext->name);
7266 struct extern_desc *ext = &obj->externs[relo->ext_idx];
7271 if (ext->type != EXT_KSYM)
7273 kind = btf_is_var(btf__type_by_id(obj->btf, ext->btf_id)) ?
7275 bpf_gen__record_extern(obj->gen_loader, ext->name,
7276 ext->is_weak, !ext->ksym.type_id,
7280 bpf_gen__record_extern(obj->gen_loader, ext->name,
7281 ext->is_weak, false, false, BTF_KIND_FUNC,
7563 struct extern_desc *ext;
7565 ext = find_extern_by_name(obj, sym_name);
7566 if (!ext || ext->type != EXT_KSYM)
7569 t = btf__type_by_id(obj->btf, ext->btf_id);
7573 if (ext->is_set && ext->ksym.addr != sym_addr) {
7575 sym_name, ext->ksym.addr, sym_addr);
7578 if (!ext->is_set) {
7579 ext->is_set = true;
7580 ext->ksym.addr = sym_addr;
7626 struct extern_desc *ext)
7635 id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &mod_btf);
7637 if (id == -ESRCH && ext->is_weak)
7640 ext->name);
7645 local_type_id = ext->ksym.type_id;
7663 ext->name, local_type_id,
7669 ext->is_set = true;
7670 ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0;
7671 ext->ksym.kernel_btf_id = id;
7673 ext->name, id, btf_kind_str(targ_var), targ_var_name);
7679 struct extern_desc *ext)
7687 local_func_proto_id = ext->ksym.type_id;
7689 kfunc_id = find_ksym_btf_id(obj, ext->essent_name ?: ext->name, BTF_KIND_FUNC, &kern_btf,
7692 if (kfunc_id == -ESRCH && ext->is_weak)
7695 ext->name);
7705 if (ext->is_weak)
7709 ext->name, local_func_proto_id,
7719 ext->name, mod_btf->fd_array_idx);
7735 ext->is_set = true;
7736 ext->ksym.kernel_btf_id = kfunc_id;
7737 ext->ksym.btf_fd_idx = mod_btf ? mod_btf->fd_array_idx : 0;
7743 ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0;
7745 ext->name, mod_btf ? mod_btf->name : "vmlinux", kfunc_id);
7753 struct extern_desc *ext;
7757 ext = &obj->externs[i];
7758 if (ext->type != EXT_KSYM || !ext->ksym.type_id)
7762 ext->is_set = true;
7763 ext->ksym.kernel_btf_obj_fd = 0;
7764 ext->ksym.kernel_btf_id = 0;
7767 t = btf__type_by_id(obj->btf, ext->btf_id);
7769 err = bpf_object__resolve_ksym_var_btf_id(obj, ext);
7771 err = bpf_object__resolve_ksym_func_btf_id(obj, ext);
7783 struct extern_desc *ext;
7794 ext = &obj->externs[i];
7796 if (ext->type == EXT_KSYM) {
7797 if (ext->ksym.type_id)
7802 } else if (ext->type == EXT_KCFG) {
7803 void *ext_ptr = kcfg_data + ext->kcfg.data_off;
7807 if (str_has_pfx(ext->name, "CONFIG_")) {
7813 if (strcmp(ext->name, "LINUX_KERNEL_VERSION") == 0) {
7816 pr_warn("extern (kcfg) '%s': failed to get kernel version\n", ext->name);
7819 } else if (strcmp(ext->name, "LINUX_HAS_BPF_COOKIE") == 0) {
7821 } else if (strcmp(ext->name, "LINUX_HAS_SYSCALL_WRAPPER") == 0) {
7823 } else if (!str_has_pfx(ext->name, "LINUX_") || !ext->is_weak) {
7831 pr_warn("extern (kcfg) '%s': unrecognized virtual extern\n", ext->name);
7835 err = set_kcfg_value_num(ext, ext_ptr, value);
7839 ext->name, (long long)value);
7841 pr_warn("extern '%s': unrecognized extern kind\n", ext->name);
7851 ext = &obj->externs[i];
7852 if (ext->type == EXT_KCFG && !ext->is_set) {
7874 ext = &obj->externs[i];
7876 if (!ext->is_set && !ext->is_weak) {
7877 pr_warn("extern '%s' (strong): not resolved\n", ext->name);
7879 } else if (!ext->is_set) {
7881 ext->name);