1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) 2 3 /* 4 * Common eBPF ELF object loading operations. 5 * 6 * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org> 7 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com> 8 * Copyright (C) 2015 Huawei Inc. 9 * Copyright (C) 2017 Nicira, Inc. 10 */ 11 12 #ifndef _GNU_SOURCE 13 #define _GNU_SOURCE 14 #endif 15 #include <stdlib.h> 16 #include <stdio.h> 17 #include <stdarg.h> 18 #include <libgen.h> 19 #include <inttypes.h> 20 #include <string.h> 21 #include <unistd.h> 22 #include <fcntl.h> 23 #include <errno.h> 24 #include <asm/unistd.h> 25 #include <linux/err.h> 26 #include <linux/kernel.h> 27 #include <linux/bpf.h> 28 #include <linux/btf.h> 29 #include <linux/filter.h> 30 #include <linux/list.h> 31 #include <linux/limits.h> 32 #include <linux/perf_event.h> 33 #include <linux/ring_buffer.h> 34 #include <sys/stat.h> 35 #include <sys/types.h> 36 #include <sys/vfs.h> 37 #include <tools/libc_compat.h> 38 #include <libelf.h> 39 #include <gelf.h> 40 41 #include "libbpf.h" 42 #include "bpf.h" 43 #include "btf.h" 44 #include "str_error.h" 45 #include "libbpf_util.h" 46 47 #ifndef EM_BPF 48 #define EM_BPF 247 49 #endif 50 51 #ifndef BPF_FS_MAGIC 52 #define BPF_FS_MAGIC 0xcafe4a11 53 #endif 54 55 #define __printf(a, b) __attribute__((format(printf, a, b))) 56 57 static int __base_pr(enum libbpf_print_level level, const char *format, 58 va_list args) 59 { 60 if (level == LIBBPF_DEBUG) 61 return 0; 62 63 return vfprintf(stderr, format, args); 64 } 65 66 static libbpf_print_fn_t __libbpf_pr = __base_pr; 67 68 void libbpf_set_print(libbpf_print_fn_t fn) 69 { 70 __libbpf_pr = fn; 71 } 72 73 __printf(2, 3) 74 void libbpf_print(enum libbpf_print_level level, const char *format, ...) 75 { 76 va_list args; 77 78 if (!__libbpf_pr) 79 return; 80 81 va_start(args, format); 82 __libbpf_pr(level, format, args); 83 va_end(args); 84 } 85 86 #define STRERR_BUFSIZE 128 87 88 #define CHECK_ERR(action, err, out) do { \ 89 err = action; \ 90 if (err) \ 91 goto out; \ 92 } while(0) 93 94 95 /* Copied from tools/perf/util/util.h */ 96 #ifndef zfree 97 # define zfree(ptr) ({ free(*ptr); *ptr = NULL; }) 98 #endif 99 100 #ifndef zclose 101 # define zclose(fd) ({ \ 102 int ___err = 0; \ 103 if ((fd) >= 0) \ 104 ___err = close((fd)); \ 105 fd = -1; \ 106 ___err; }) 107 #endif 108 109 #ifdef HAVE_LIBELF_MMAP_SUPPORT 110 # define LIBBPF_ELF_C_READ_MMAP ELF_C_READ_MMAP 111 #else 112 # define LIBBPF_ELF_C_READ_MMAP ELF_C_READ 113 #endif 114 115 struct bpf_capabilities { 116 /* v4.14: kernel support for program & map names. */ 117 __u32 name:1; 118 }; 119 120 /* 121 * bpf_prog should be a better name but it has been used in 122 * linux/filter.h. 123 */ 124 struct bpf_program { 125 /* Index in elf obj file, for relocation use. */ 126 int idx; 127 char *name; 128 int prog_ifindex; 129 char *section_name; 130 /* section_name with / replaced by _; makes recursive pinning 131 * in bpf_object__pin_programs easier 132 */ 133 char *pin_name; 134 struct bpf_insn *insns; 135 size_t insns_cnt, main_prog_cnt; 136 enum bpf_prog_type type; 137 138 struct reloc_desc { 139 enum { 140 RELO_LD64, 141 RELO_CALL, 142 } type; 143 int insn_idx; 144 union { 145 int map_idx; 146 int text_off; 147 }; 148 } *reloc_desc; 149 int nr_reloc; 150 151 struct { 152 int nr; 153 int *fds; 154 } instances; 155 bpf_program_prep_t preprocessor; 156 157 struct bpf_object *obj; 158 void *priv; 159 bpf_program_clear_priv_t clear_priv; 160 161 enum bpf_attach_type expected_attach_type; 162 int btf_fd; 163 void *func_info; 164 __u32 func_info_rec_size; 165 __u32 func_info_cnt; 166 167 struct bpf_capabilities *caps; 168 169 void *line_info; 170 __u32 line_info_rec_size; 171 __u32 line_info_cnt; 172 }; 173 174 struct bpf_map { 175 int fd; 176 char *name; 177 size_t offset; 178 int map_ifindex; 179 int inner_map_fd; 180 struct bpf_map_def def; 181 __u32 btf_key_type_id; 182 __u32 btf_value_type_id; 183 void *priv; 184 bpf_map_clear_priv_t clear_priv; 185 }; 186 187 static LIST_HEAD(bpf_objects_list); 188 189 struct bpf_object { 190 char license[64]; 191 __u32 kern_version; 192 193 struct bpf_program *programs; 194 size_t nr_programs; 195 struct bpf_map *maps; 196 size_t nr_maps; 197 198 bool loaded; 199 bool has_pseudo_calls; 200 201 /* 202 * Information when doing elf related work. Only valid if fd 203 * is valid. 204 */ 205 struct { 206 int fd; 207 void *obj_buf; 208 size_t obj_buf_sz; 209 Elf *elf; 210 GElf_Ehdr ehdr; 211 Elf_Data *symbols; 212 size_t strtabidx; 213 struct { 214 GElf_Shdr shdr; 215 Elf_Data *data; 216 } *reloc; 217 int nr_reloc; 218 int maps_shndx; 219 int text_shndx; 220 } efile; 221 /* 222 * All loaded bpf_object is linked in a list, which is 223 * hidden to caller. bpf_objects__<func> handlers deal with 224 * all objects. 225 */ 226 struct list_head list; 227 228 struct btf *btf; 229 struct btf_ext *btf_ext; 230 231 void *priv; 232 bpf_object_clear_priv_t clear_priv; 233 234 struct bpf_capabilities caps; 235 236 char path[]; 237 }; 238 #define obj_elf_valid(o) ((o)->efile.elf) 239 240 void bpf_program__unload(struct bpf_program *prog) 241 { 242 int i; 243 244 if (!prog) 245 return; 246 247 /* 248 * If the object is opened but the program was never loaded, 249 * it is possible that prog->instances.nr == -1. 250 */ 251 if (prog->instances.nr > 0) { 252 for (i = 0; i < prog->instances.nr; i++) 253 zclose(prog->instances.fds[i]); 254 } else if (prog->instances.nr != -1) { 255 pr_warning("Internal error: instances.nr is %d\n", 256 prog->instances.nr); 257 } 258 259 prog->instances.nr = -1; 260 zfree(&prog->instances.fds); 261 262 zclose(prog->btf_fd); 263 zfree(&prog->func_info); 264 zfree(&prog->line_info); 265 } 266 267 static void bpf_program__exit(struct bpf_program *prog) 268 { 269 if (!prog) 270 return; 271 272 if (prog->clear_priv) 273 prog->clear_priv(prog, prog->priv); 274 275 prog->priv = NULL; 276 prog->clear_priv = NULL; 277 278 bpf_program__unload(prog); 279 zfree(&prog->name); 280 zfree(&prog->section_name); 281 zfree(&prog->pin_name); 282 zfree(&prog->insns); 283 zfree(&prog->reloc_desc); 284 285 prog->nr_reloc = 0; 286 prog->insns_cnt = 0; 287 prog->idx = -1; 288 } 289 290 static char *__bpf_program__pin_name(struct bpf_program *prog) 291 { 292 char *name, *p; 293 294 name = p = strdup(prog->section_name); 295 while ((p = strchr(p, '/'))) 296 *p = '_'; 297 298 return name; 299 } 300 301 static int 302 bpf_program__init(void *data, size_t size, char *section_name, int idx, 303 struct bpf_program *prog) 304 { 305 if (size < sizeof(struct bpf_insn)) { 306 pr_warning("corrupted section '%s'\n", section_name); 307 return -EINVAL; 308 } 309 310 memset(prog, 0, sizeof(*prog)); 311 312 prog->section_name = strdup(section_name); 313 if (!prog->section_name) { 314 pr_warning("failed to alloc name for prog under section(%d) %s\n", 315 idx, section_name); 316 goto errout; 317 } 318 319 prog->pin_name = __bpf_program__pin_name(prog); 320 if (!prog->pin_name) { 321 pr_warning("failed to alloc pin name for prog under section(%d) %s\n", 322 idx, section_name); 323 goto errout; 324 } 325 326 prog->insns = malloc(size); 327 if (!prog->insns) { 328 pr_warning("failed to alloc insns for prog under section %s\n", 329 section_name); 330 goto errout; 331 } 332 prog->insns_cnt = size / sizeof(struct bpf_insn); 333 memcpy(prog->insns, data, 334 prog->insns_cnt * sizeof(struct bpf_insn)); 335 prog->idx = idx; 336 prog->instances.fds = NULL; 337 prog->instances.nr = -1; 338 prog->type = BPF_PROG_TYPE_UNSPEC; 339 prog->btf_fd = -1; 340 341 return 0; 342 errout: 343 bpf_program__exit(prog); 344 return -ENOMEM; 345 } 346 347 static int 348 bpf_object__add_program(struct bpf_object *obj, void *data, size_t size, 349 char *section_name, int idx) 350 { 351 struct bpf_program prog, *progs; 352 int nr_progs, err; 353 354 err = bpf_program__init(data, size, section_name, idx, &prog); 355 if (err) 356 return err; 357 358 prog.caps = &obj->caps; 359 progs = obj->programs; 360 nr_progs = obj->nr_programs; 361 362 progs = reallocarray(progs, nr_progs + 1, sizeof(progs[0])); 363 if (!progs) { 364 /* 365 * In this case the original obj->programs 366 * is still valid, so don't need special treat for 367 * bpf_close_object(). 368 */ 369 pr_warning("failed to alloc a new program under section '%s'\n", 370 section_name); 371 bpf_program__exit(&prog); 372 return -ENOMEM; 373 } 374 375 pr_debug("found program %s\n", prog.section_name); 376 obj->programs = progs; 377 obj->nr_programs = nr_progs + 1; 378 prog.obj = obj; 379 progs[nr_progs] = prog; 380 return 0; 381 } 382 383 static int 384 bpf_object__init_prog_names(struct bpf_object *obj) 385 { 386 Elf_Data *symbols = obj->efile.symbols; 387 struct bpf_program *prog; 388 size_t pi, si; 389 390 for (pi = 0; pi < obj->nr_programs; pi++) { 391 const char *name = NULL; 392 393 prog = &obj->programs[pi]; 394 395 for (si = 0; si < symbols->d_size / sizeof(GElf_Sym) && !name; 396 si++) { 397 GElf_Sym sym; 398 399 if (!gelf_getsym(symbols, si, &sym)) 400 continue; 401 if (sym.st_shndx != prog->idx) 402 continue; 403 if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL) 404 continue; 405 406 name = elf_strptr(obj->efile.elf, 407 obj->efile.strtabidx, 408 sym.st_name); 409 if (!name) { 410 pr_warning("failed to get sym name string for prog %s\n", 411 prog->section_name); 412 return -LIBBPF_ERRNO__LIBELF; 413 } 414 } 415 416 if (!name && prog->idx == obj->efile.text_shndx) 417 name = ".text"; 418 419 if (!name) { 420 pr_warning("failed to find sym for prog %s\n", 421 prog->section_name); 422 return -EINVAL; 423 } 424 425 prog->name = strdup(name); 426 if (!prog->name) { 427 pr_warning("failed to allocate memory for prog sym %s\n", 428 name); 429 return -ENOMEM; 430 } 431 } 432 433 return 0; 434 } 435 436 static struct bpf_object *bpf_object__new(const char *path, 437 void *obj_buf, 438 size_t obj_buf_sz) 439 { 440 struct bpf_object *obj; 441 442 obj = calloc(1, sizeof(struct bpf_object) + strlen(path) + 1); 443 if (!obj) { 444 pr_warning("alloc memory failed for %s\n", path); 445 return ERR_PTR(-ENOMEM); 446 } 447 448 strcpy(obj->path, path); 449 obj->efile.fd = -1; 450 451 /* 452 * Caller of this function should also calls 453 * bpf_object__elf_finish() after data collection to return 454 * obj_buf to user. If not, we should duplicate the buffer to 455 * avoid user freeing them before elf finish. 456 */ 457 obj->efile.obj_buf = obj_buf; 458 obj->efile.obj_buf_sz = obj_buf_sz; 459 obj->efile.maps_shndx = -1; 460 461 obj->loaded = false; 462 463 INIT_LIST_HEAD(&obj->list); 464 list_add(&obj->list, &bpf_objects_list); 465 return obj; 466 } 467 468 static void bpf_object__elf_finish(struct bpf_object *obj) 469 { 470 if (!obj_elf_valid(obj)) 471 return; 472 473 if (obj->efile.elf) { 474 elf_end(obj->efile.elf); 475 obj->efile.elf = NULL; 476 } 477 obj->efile.symbols = NULL; 478 479 zfree(&obj->efile.reloc); 480 obj->efile.nr_reloc = 0; 481 zclose(obj->efile.fd); 482 obj->efile.obj_buf = NULL; 483 obj->efile.obj_buf_sz = 0; 484 } 485 486 static int bpf_object__elf_init(struct bpf_object *obj) 487 { 488 int err = 0; 489 GElf_Ehdr *ep; 490 491 if (obj_elf_valid(obj)) { 492 pr_warning("elf init: internal error\n"); 493 return -LIBBPF_ERRNO__LIBELF; 494 } 495 496 if (obj->efile.obj_buf_sz > 0) { 497 /* 498 * obj_buf should have been validated by 499 * bpf_object__open_buffer(). 500 */ 501 obj->efile.elf = elf_memory(obj->efile.obj_buf, 502 obj->efile.obj_buf_sz); 503 } else { 504 obj->efile.fd = open(obj->path, O_RDONLY); 505 if (obj->efile.fd < 0) { 506 char errmsg[STRERR_BUFSIZE]; 507 char *cp = libbpf_strerror_r(errno, errmsg, 508 sizeof(errmsg)); 509 510 pr_warning("failed to open %s: %s\n", obj->path, cp); 511 return -errno; 512 } 513 514 obj->efile.elf = elf_begin(obj->efile.fd, 515 LIBBPF_ELF_C_READ_MMAP, 516 NULL); 517 } 518 519 if (!obj->efile.elf) { 520 pr_warning("failed to open %s as ELF file\n", 521 obj->path); 522 err = -LIBBPF_ERRNO__LIBELF; 523 goto errout; 524 } 525 526 if (!gelf_getehdr(obj->efile.elf, &obj->efile.ehdr)) { 527 pr_warning("failed to get EHDR from %s\n", 528 obj->path); 529 err = -LIBBPF_ERRNO__FORMAT; 530 goto errout; 531 } 532 ep = &obj->efile.ehdr; 533 534 /* Old LLVM set e_machine to EM_NONE */ 535 if ((ep->e_type != ET_REL) || (ep->e_machine && (ep->e_machine != EM_BPF))) { 536 pr_warning("%s is not an eBPF object file\n", 537 obj->path); 538 err = -LIBBPF_ERRNO__FORMAT; 539 goto errout; 540 } 541 542 return 0; 543 errout: 544 bpf_object__elf_finish(obj); 545 return err; 546 } 547 548 static int 549 bpf_object__check_endianness(struct bpf_object *obj) 550 { 551 static unsigned int const endian = 1; 552 553 switch (obj->efile.ehdr.e_ident[EI_DATA]) { 554 case ELFDATA2LSB: 555 /* We are big endian, BPF obj is little endian. */ 556 if (*(unsigned char const *)&endian != 1) 557 goto mismatch; 558 break; 559 560 case ELFDATA2MSB: 561 /* We are little endian, BPF obj is big endian. */ 562 if (*(unsigned char const *)&endian != 0) 563 goto mismatch; 564 break; 565 default: 566 return -LIBBPF_ERRNO__ENDIAN; 567 } 568 569 return 0; 570 571 mismatch: 572 pr_warning("Error: endianness mismatch.\n"); 573 return -LIBBPF_ERRNO__ENDIAN; 574 } 575 576 static int 577 bpf_object__init_license(struct bpf_object *obj, 578 void *data, size_t size) 579 { 580 memcpy(obj->license, data, 581 min(size, sizeof(obj->license) - 1)); 582 pr_debug("license of %s is %s\n", obj->path, obj->license); 583 return 0; 584 } 585 586 static int 587 bpf_object__init_kversion(struct bpf_object *obj, 588 void *data, size_t size) 589 { 590 __u32 kver; 591 592 if (size != sizeof(kver)) { 593 pr_warning("invalid kver section in %s\n", obj->path); 594 return -LIBBPF_ERRNO__FORMAT; 595 } 596 memcpy(&kver, data, sizeof(kver)); 597 obj->kern_version = kver; 598 pr_debug("kernel version of %s is %x\n", obj->path, 599 obj->kern_version); 600 return 0; 601 } 602 603 static int compare_bpf_map(const void *_a, const void *_b) 604 { 605 const struct bpf_map *a = _a; 606 const struct bpf_map *b = _b; 607 608 return a->offset - b->offset; 609 } 610 611 static bool bpf_map_type__is_map_in_map(enum bpf_map_type type) 612 { 613 if (type == BPF_MAP_TYPE_ARRAY_OF_MAPS || 614 type == BPF_MAP_TYPE_HASH_OF_MAPS) 615 return true; 616 return false; 617 } 618 619 static int 620 bpf_object__init_maps(struct bpf_object *obj, int flags) 621 { 622 bool strict = !(flags & MAPS_RELAX_COMPAT); 623 int i, map_idx, map_def_sz, nr_maps = 0; 624 Elf_Scn *scn; 625 Elf_Data *data; 626 Elf_Data *symbols = obj->efile.symbols; 627 628 if (obj->efile.maps_shndx < 0) 629 return -EINVAL; 630 if (!symbols) 631 return -EINVAL; 632 633 scn = elf_getscn(obj->efile.elf, obj->efile.maps_shndx); 634 if (scn) 635 data = elf_getdata(scn, NULL); 636 if (!scn || !data) { 637 pr_warning("failed to get Elf_Data from map section %d\n", 638 obj->efile.maps_shndx); 639 return -EINVAL; 640 } 641 642 /* 643 * Count number of maps. Each map has a name. 644 * Array of maps is not supported: only the first element is 645 * considered. 646 * 647 * TODO: Detect array of map and report error. 648 */ 649 for (i = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) { 650 GElf_Sym sym; 651 652 if (!gelf_getsym(symbols, i, &sym)) 653 continue; 654 if (sym.st_shndx != obj->efile.maps_shndx) 655 continue; 656 nr_maps++; 657 } 658 659 /* Alloc obj->maps and fill nr_maps. */ 660 pr_debug("maps in %s: %d maps in %zd bytes\n", obj->path, 661 nr_maps, data->d_size); 662 663 if (!nr_maps) 664 return 0; 665 666 /* Assume equally sized map definitions */ 667 map_def_sz = data->d_size / nr_maps; 668 if (!data->d_size || (data->d_size % nr_maps) != 0) { 669 pr_warning("unable to determine map definition size " 670 "section %s, %d maps in %zd bytes\n", 671 obj->path, nr_maps, data->d_size); 672 return -EINVAL; 673 } 674 675 obj->maps = calloc(nr_maps, sizeof(obj->maps[0])); 676 if (!obj->maps) { 677 pr_warning("alloc maps for object failed\n"); 678 return -ENOMEM; 679 } 680 obj->nr_maps = nr_maps; 681 682 for (i = 0; i < nr_maps; i++) { 683 /* 684 * fill all fd with -1 so won't close incorrect 685 * fd (fd=0 is stdin) when failure (zclose won't close 686 * negative fd)). 687 */ 688 obj->maps[i].fd = -1; 689 obj->maps[i].inner_map_fd = -1; 690 } 691 692 /* 693 * Fill obj->maps using data in "maps" section. 694 */ 695 for (i = 0, map_idx = 0; i < symbols->d_size / sizeof(GElf_Sym); i++) { 696 GElf_Sym sym; 697 const char *map_name; 698 struct bpf_map_def *def; 699 700 if (!gelf_getsym(symbols, i, &sym)) 701 continue; 702 if (sym.st_shndx != obj->efile.maps_shndx) 703 continue; 704 705 map_name = elf_strptr(obj->efile.elf, 706 obj->efile.strtabidx, 707 sym.st_name); 708 obj->maps[map_idx].offset = sym.st_value; 709 if (sym.st_value + map_def_sz > data->d_size) { 710 pr_warning("corrupted maps section in %s: last map \"%s\" too small\n", 711 obj->path, map_name); 712 return -EINVAL; 713 } 714 715 obj->maps[map_idx].name = strdup(map_name); 716 if (!obj->maps[map_idx].name) { 717 pr_warning("failed to alloc map name\n"); 718 return -ENOMEM; 719 } 720 pr_debug("map %d is \"%s\"\n", map_idx, 721 obj->maps[map_idx].name); 722 def = (struct bpf_map_def *)(data->d_buf + sym.st_value); 723 /* 724 * If the definition of the map in the object file fits in 725 * bpf_map_def, copy it. Any extra fields in our version 726 * of bpf_map_def will default to zero as a result of the 727 * calloc above. 728 */ 729 if (map_def_sz <= sizeof(struct bpf_map_def)) { 730 memcpy(&obj->maps[map_idx].def, def, map_def_sz); 731 } else { 732 /* 733 * Here the map structure being read is bigger than what 734 * we expect, truncate if the excess bits are all zero. 735 * If they are not zero, reject this map as 736 * incompatible. 737 */ 738 char *b; 739 for (b = ((char *)def) + sizeof(struct bpf_map_def); 740 b < ((char *)def) + map_def_sz; b++) { 741 if (*b != 0) { 742 pr_warning("maps section in %s: \"%s\" " 743 "has unrecognized, non-zero " 744 "options\n", 745 obj->path, map_name); 746 if (strict) 747 return -EINVAL; 748 } 749 } 750 memcpy(&obj->maps[map_idx].def, def, 751 sizeof(struct bpf_map_def)); 752 } 753 map_idx++; 754 } 755 756 qsort(obj->maps, obj->nr_maps, sizeof(obj->maps[0]), compare_bpf_map); 757 return 0; 758 } 759 760 static bool section_have_execinstr(struct bpf_object *obj, int idx) 761 { 762 Elf_Scn *scn; 763 GElf_Shdr sh; 764 765 scn = elf_getscn(obj->efile.elf, idx); 766 if (!scn) 767 return false; 768 769 if (gelf_getshdr(scn, &sh) != &sh) 770 return false; 771 772 if (sh.sh_flags & SHF_EXECINSTR) 773 return true; 774 775 return false; 776 } 777 778 static int bpf_object__elf_collect(struct bpf_object *obj, int flags) 779 { 780 Elf *elf = obj->efile.elf; 781 GElf_Ehdr *ep = &obj->efile.ehdr; 782 Elf_Data *btf_ext_data = NULL; 783 Elf_Scn *scn = NULL; 784 int idx = 0, err = 0; 785 786 /* Elf is corrupted/truncated, avoid calling elf_strptr. */ 787 if (!elf_rawdata(elf_getscn(elf, ep->e_shstrndx), NULL)) { 788 pr_warning("failed to get e_shstrndx from %s\n", 789 obj->path); 790 return -LIBBPF_ERRNO__FORMAT; 791 } 792 793 while ((scn = elf_nextscn(elf, scn)) != NULL) { 794 char *name; 795 GElf_Shdr sh; 796 Elf_Data *data; 797 798 idx++; 799 if (gelf_getshdr(scn, &sh) != &sh) { 800 pr_warning("failed to get section(%d) header from %s\n", 801 idx, obj->path); 802 err = -LIBBPF_ERRNO__FORMAT; 803 goto out; 804 } 805 806 name = elf_strptr(elf, ep->e_shstrndx, sh.sh_name); 807 if (!name) { 808 pr_warning("failed to get section(%d) name from %s\n", 809 idx, obj->path); 810 err = -LIBBPF_ERRNO__FORMAT; 811 goto out; 812 } 813 814 data = elf_getdata(scn, 0); 815 if (!data) { 816 pr_warning("failed to get section(%d) data from %s(%s)\n", 817 idx, name, obj->path); 818 err = -LIBBPF_ERRNO__FORMAT; 819 goto out; 820 } 821 pr_debug("section(%d) %s, size %ld, link %d, flags %lx, type=%d\n", 822 idx, name, (unsigned long)data->d_size, 823 (int)sh.sh_link, (unsigned long)sh.sh_flags, 824 (int)sh.sh_type); 825 826 if (strcmp(name, "license") == 0) 827 err = bpf_object__init_license(obj, 828 data->d_buf, 829 data->d_size); 830 else if (strcmp(name, "version") == 0) 831 err = bpf_object__init_kversion(obj, 832 data->d_buf, 833 data->d_size); 834 else if (strcmp(name, "maps") == 0) 835 obj->efile.maps_shndx = idx; 836 else if (strcmp(name, BTF_ELF_SEC) == 0) { 837 obj->btf = btf__new(data->d_buf, data->d_size); 838 if (IS_ERR(obj->btf) || btf__load(obj->btf)) { 839 pr_warning("Error loading ELF section %s: %ld. Ignored and continue.\n", 840 BTF_ELF_SEC, PTR_ERR(obj->btf)); 841 obj->btf = NULL; 842 } 843 } else if (strcmp(name, BTF_EXT_ELF_SEC) == 0) { 844 btf_ext_data = data; 845 } else if (sh.sh_type == SHT_SYMTAB) { 846 if (obj->efile.symbols) { 847 pr_warning("bpf: multiple SYMTAB in %s\n", 848 obj->path); 849 err = -LIBBPF_ERRNO__FORMAT; 850 } else { 851 obj->efile.symbols = data; 852 obj->efile.strtabidx = sh.sh_link; 853 } 854 } else if ((sh.sh_type == SHT_PROGBITS) && 855 (sh.sh_flags & SHF_EXECINSTR) && 856 (data->d_size > 0)) { 857 if (strcmp(name, ".text") == 0) 858 obj->efile.text_shndx = idx; 859 err = bpf_object__add_program(obj, data->d_buf, 860 data->d_size, name, idx); 861 if (err) { 862 char errmsg[STRERR_BUFSIZE]; 863 char *cp = libbpf_strerror_r(-err, errmsg, 864 sizeof(errmsg)); 865 866 pr_warning("failed to alloc program %s (%s): %s", 867 name, obj->path, cp); 868 } 869 } else if (sh.sh_type == SHT_REL) { 870 void *reloc = obj->efile.reloc; 871 int nr_reloc = obj->efile.nr_reloc + 1; 872 int sec = sh.sh_info; /* points to other section */ 873 874 /* Only do relo for section with exec instructions */ 875 if (!section_have_execinstr(obj, sec)) { 876 pr_debug("skip relo %s(%d) for section(%d)\n", 877 name, idx, sec); 878 continue; 879 } 880 881 reloc = reallocarray(reloc, nr_reloc, 882 sizeof(*obj->efile.reloc)); 883 if (!reloc) { 884 pr_warning("realloc failed\n"); 885 err = -ENOMEM; 886 } else { 887 int n = nr_reloc - 1; 888 889 obj->efile.reloc = reloc; 890 obj->efile.nr_reloc = nr_reloc; 891 892 obj->efile.reloc[n].shdr = sh; 893 obj->efile.reloc[n].data = data; 894 } 895 } else { 896 pr_debug("skip section(%d) %s\n", idx, name); 897 } 898 if (err) 899 goto out; 900 } 901 902 if (!obj->efile.strtabidx || obj->efile.strtabidx >= idx) { 903 pr_warning("Corrupted ELF file: index of strtab invalid\n"); 904 return LIBBPF_ERRNO__FORMAT; 905 } 906 if (btf_ext_data) { 907 if (!obj->btf) { 908 pr_debug("Ignore ELF section %s because its depending ELF section %s is not found.\n", 909 BTF_EXT_ELF_SEC, BTF_ELF_SEC); 910 } else { 911 obj->btf_ext = btf_ext__new(btf_ext_data->d_buf, 912 btf_ext_data->d_size); 913 if (IS_ERR(obj->btf_ext)) { 914 pr_warning("Error loading ELF section %s: %ld. Ignored and continue.\n", 915 BTF_EXT_ELF_SEC, 916 PTR_ERR(obj->btf_ext)); 917 obj->btf_ext = NULL; 918 } 919 } 920 } 921 if (obj->efile.maps_shndx >= 0) { 922 err = bpf_object__init_maps(obj, flags); 923 if (err) 924 goto out; 925 } 926 err = bpf_object__init_prog_names(obj); 927 out: 928 return err; 929 } 930 931 static struct bpf_program * 932 bpf_object__find_prog_by_idx(struct bpf_object *obj, int idx) 933 { 934 struct bpf_program *prog; 935 size_t i; 936 937 for (i = 0; i < obj->nr_programs; i++) { 938 prog = &obj->programs[i]; 939 if (prog->idx == idx) 940 return prog; 941 } 942 return NULL; 943 } 944 945 struct bpf_program * 946 bpf_object__find_program_by_title(struct bpf_object *obj, const char *title) 947 { 948 struct bpf_program *pos; 949 950 bpf_object__for_each_program(pos, obj) { 951 if (pos->section_name && !strcmp(pos->section_name, title)) 952 return pos; 953 } 954 return NULL; 955 } 956 957 static int 958 bpf_program__collect_reloc(struct bpf_program *prog, GElf_Shdr *shdr, 959 Elf_Data *data, struct bpf_object *obj) 960 { 961 Elf_Data *symbols = obj->efile.symbols; 962 int text_shndx = obj->efile.text_shndx; 963 int maps_shndx = obj->efile.maps_shndx; 964 struct bpf_map *maps = obj->maps; 965 size_t nr_maps = obj->nr_maps; 966 int i, nrels; 967 968 pr_debug("collecting relocating info for: '%s'\n", 969 prog->section_name); 970 nrels = shdr->sh_size / shdr->sh_entsize; 971 972 prog->reloc_desc = malloc(sizeof(*prog->reloc_desc) * nrels); 973 if (!prog->reloc_desc) { 974 pr_warning("failed to alloc memory in relocation\n"); 975 return -ENOMEM; 976 } 977 prog->nr_reloc = nrels; 978 979 for (i = 0; i < nrels; i++) { 980 GElf_Sym sym; 981 GElf_Rel rel; 982 unsigned int insn_idx; 983 struct bpf_insn *insns = prog->insns; 984 size_t map_idx; 985 986 if (!gelf_getrel(data, i, &rel)) { 987 pr_warning("relocation: failed to get %d reloc\n", i); 988 return -LIBBPF_ERRNO__FORMAT; 989 } 990 991 if (!gelf_getsym(symbols, 992 GELF_R_SYM(rel.r_info), 993 &sym)) { 994 pr_warning("relocation: symbol %"PRIx64" not found\n", 995 GELF_R_SYM(rel.r_info)); 996 return -LIBBPF_ERRNO__FORMAT; 997 } 998 pr_debug("relo for %lld value %lld name %d\n", 999 (long long) (rel.r_info >> 32), 1000 (long long) sym.st_value, sym.st_name); 1001 1002 if (sym.st_shndx != maps_shndx && sym.st_shndx != text_shndx) { 1003 pr_warning("Program '%s' contains non-map related relo data pointing to section %u\n", 1004 prog->section_name, sym.st_shndx); 1005 return -LIBBPF_ERRNO__RELOC; 1006 } 1007 1008 insn_idx = rel.r_offset / sizeof(struct bpf_insn); 1009 pr_debug("relocation: insn_idx=%u\n", insn_idx); 1010 1011 if (insns[insn_idx].code == (BPF_JMP | BPF_CALL)) { 1012 if (insns[insn_idx].src_reg != BPF_PSEUDO_CALL) { 1013 pr_warning("incorrect bpf_call opcode\n"); 1014 return -LIBBPF_ERRNO__RELOC; 1015 } 1016 prog->reloc_desc[i].type = RELO_CALL; 1017 prog->reloc_desc[i].insn_idx = insn_idx; 1018 prog->reloc_desc[i].text_off = sym.st_value; 1019 obj->has_pseudo_calls = true; 1020 continue; 1021 } 1022 1023 if (insns[insn_idx].code != (BPF_LD | BPF_IMM | BPF_DW)) { 1024 pr_warning("bpf: relocation: invalid relo for insns[%d].code 0x%x\n", 1025 insn_idx, insns[insn_idx].code); 1026 return -LIBBPF_ERRNO__RELOC; 1027 } 1028 1029 /* TODO: 'maps' is sorted. We can use bsearch to make it faster. */ 1030 for (map_idx = 0; map_idx < nr_maps; map_idx++) { 1031 if (maps[map_idx].offset == sym.st_value) { 1032 pr_debug("relocation: find map %zd (%s) for insn %u\n", 1033 map_idx, maps[map_idx].name, insn_idx); 1034 break; 1035 } 1036 } 1037 1038 if (map_idx >= nr_maps) { 1039 pr_warning("bpf relocation: map_idx %d large than %d\n", 1040 (int)map_idx, (int)nr_maps - 1); 1041 return -LIBBPF_ERRNO__RELOC; 1042 } 1043 1044 prog->reloc_desc[i].type = RELO_LD64; 1045 prog->reloc_desc[i].insn_idx = insn_idx; 1046 prog->reloc_desc[i].map_idx = map_idx; 1047 } 1048 return 0; 1049 } 1050 1051 static int bpf_map_find_btf_info(struct bpf_map *map, const struct btf *btf) 1052 { 1053 struct bpf_map_def *def = &map->def; 1054 __u32 key_type_id, value_type_id; 1055 int ret; 1056 1057 ret = btf__get_map_kv_tids(btf, map->name, def->key_size, 1058 def->value_size, &key_type_id, 1059 &value_type_id); 1060 if (ret) 1061 return ret; 1062 1063 map->btf_key_type_id = key_type_id; 1064 map->btf_value_type_id = value_type_id; 1065 1066 return 0; 1067 } 1068 1069 int bpf_map__reuse_fd(struct bpf_map *map, int fd) 1070 { 1071 struct bpf_map_info info = {}; 1072 __u32 len = sizeof(info); 1073 int new_fd, err; 1074 char *new_name; 1075 1076 err = bpf_obj_get_info_by_fd(fd, &info, &len); 1077 if (err) 1078 return err; 1079 1080 new_name = strdup(info.name); 1081 if (!new_name) 1082 return -errno; 1083 1084 new_fd = open("/", O_RDONLY | O_CLOEXEC); 1085 if (new_fd < 0) 1086 goto err_free_new_name; 1087 1088 new_fd = dup3(fd, new_fd, O_CLOEXEC); 1089 if (new_fd < 0) 1090 goto err_close_new_fd; 1091 1092 err = zclose(map->fd); 1093 if (err) 1094 goto err_close_new_fd; 1095 free(map->name); 1096 1097 map->fd = new_fd; 1098 map->name = new_name; 1099 map->def.type = info.type; 1100 map->def.key_size = info.key_size; 1101 map->def.value_size = info.value_size; 1102 map->def.max_entries = info.max_entries; 1103 map->def.map_flags = info.map_flags; 1104 map->btf_key_type_id = info.btf_key_type_id; 1105 map->btf_value_type_id = info.btf_value_type_id; 1106 1107 return 0; 1108 1109 err_close_new_fd: 1110 close(new_fd); 1111 err_free_new_name: 1112 free(new_name); 1113 return -errno; 1114 } 1115 1116 int bpf_map__resize(struct bpf_map *map, __u32 max_entries) 1117 { 1118 if (!map || !max_entries) 1119 return -EINVAL; 1120 1121 /* If map already created, its attributes can't be changed. */ 1122 if (map->fd >= 0) 1123 return -EBUSY; 1124 1125 map->def.max_entries = max_entries; 1126 1127 return 0; 1128 } 1129 1130 static int 1131 bpf_object__probe_name(struct bpf_object *obj) 1132 { 1133 struct bpf_load_program_attr attr; 1134 char *cp, errmsg[STRERR_BUFSIZE]; 1135 struct bpf_insn insns[] = { 1136 BPF_MOV64_IMM(BPF_REG_0, 0), 1137 BPF_EXIT_INSN(), 1138 }; 1139 int ret; 1140 1141 /* make sure basic loading works */ 1142 1143 memset(&attr, 0, sizeof(attr)); 1144 attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; 1145 attr.insns = insns; 1146 attr.insns_cnt = ARRAY_SIZE(insns); 1147 attr.license = "GPL"; 1148 1149 ret = bpf_load_program_xattr(&attr, NULL, 0); 1150 if (ret < 0) { 1151 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 1152 pr_warning("Error in %s():%s(%d). Couldn't load basic 'r0 = 0' BPF program.\n", 1153 __func__, cp, errno); 1154 return -errno; 1155 } 1156 close(ret); 1157 1158 /* now try the same program, but with the name */ 1159 1160 attr.name = "test"; 1161 ret = bpf_load_program_xattr(&attr, NULL, 0); 1162 if (ret >= 0) { 1163 obj->caps.name = 1; 1164 close(ret); 1165 } 1166 1167 return 0; 1168 } 1169 1170 static int 1171 bpf_object__probe_caps(struct bpf_object *obj) 1172 { 1173 return bpf_object__probe_name(obj); 1174 } 1175 1176 static int 1177 bpf_object__create_maps(struct bpf_object *obj) 1178 { 1179 struct bpf_create_map_attr create_attr = {}; 1180 unsigned int i; 1181 int err; 1182 1183 for (i = 0; i < obj->nr_maps; i++) { 1184 struct bpf_map *map = &obj->maps[i]; 1185 struct bpf_map_def *def = &map->def; 1186 char *cp, errmsg[STRERR_BUFSIZE]; 1187 int *pfd = &map->fd; 1188 1189 if (map->fd >= 0) { 1190 pr_debug("skip map create (preset) %s: fd=%d\n", 1191 map->name, map->fd); 1192 continue; 1193 } 1194 1195 if (obj->caps.name) 1196 create_attr.name = map->name; 1197 create_attr.map_ifindex = map->map_ifindex; 1198 create_attr.map_type = def->type; 1199 create_attr.map_flags = def->map_flags; 1200 create_attr.key_size = def->key_size; 1201 create_attr.value_size = def->value_size; 1202 create_attr.max_entries = def->max_entries; 1203 create_attr.btf_fd = 0; 1204 create_attr.btf_key_type_id = 0; 1205 create_attr.btf_value_type_id = 0; 1206 if (bpf_map_type__is_map_in_map(def->type) && 1207 map->inner_map_fd >= 0) 1208 create_attr.inner_map_fd = map->inner_map_fd; 1209 1210 if (obj->btf && !bpf_map_find_btf_info(map, obj->btf)) { 1211 create_attr.btf_fd = btf__fd(obj->btf); 1212 create_attr.btf_key_type_id = map->btf_key_type_id; 1213 create_attr.btf_value_type_id = map->btf_value_type_id; 1214 } 1215 1216 *pfd = bpf_create_map_xattr(&create_attr); 1217 if (*pfd < 0 && create_attr.btf_key_type_id) { 1218 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 1219 pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", 1220 map->name, cp, errno); 1221 create_attr.btf_fd = 0; 1222 create_attr.btf_key_type_id = 0; 1223 create_attr.btf_value_type_id = 0; 1224 map->btf_key_type_id = 0; 1225 map->btf_value_type_id = 0; 1226 *pfd = bpf_create_map_xattr(&create_attr); 1227 } 1228 1229 if (*pfd < 0) { 1230 size_t j; 1231 1232 err = *pfd; 1233 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 1234 pr_warning("failed to create map (name: '%s'): %s\n", 1235 map->name, cp); 1236 for (j = 0; j < i; j++) 1237 zclose(obj->maps[j].fd); 1238 return err; 1239 } 1240 pr_debug("create map %s: fd=%d\n", map->name, *pfd); 1241 } 1242 1243 return 0; 1244 } 1245 1246 static int 1247 check_btf_ext_reloc_err(struct bpf_program *prog, int err, 1248 void *btf_prog_info, const char *info_name) 1249 { 1250 if (err != -ENOENT) { 1251 pr_warning("Error in loading %s for sec %s.\n", 1252 info_name, prog->section_name); 1253 return err; 1254 } 1255 1256 /* err == -ENOENT (i.e. prog->section_name not found in btf_ext) */ 1257 1258 if (btf_prog_info) { 1259 /* 1260 * Some info has already been found but has problem 1261 * in the last btf_ext reloc. Must have to error 1262 * out. 1263 */ 1264 pr_warning("Error in relocating %s for sec %s.\n", 1265 info_name, prog->section_name); 1266 return err; 1267 } 1268 1269 /* 1270 * Have problem loading the very first info. Ignore 1271 * the rest. 1272 */ 1273 pr_warning("Cannot find %s for main program sec %s. Ignore all %s.\n", 1274 info_name, prog->section_name, info_name); 1275 return 0; 1276 } 1277 1278 static int 1279 bpf_program_reloc_btf_ext(struct bpf_program *prog, struct bpf_object *obj, 1280 const char *section_name, __u32 insn_offset) 1281 { 1282 int err; 1283 1284 if (!insn_offset || prog->func_info) { 1285 /* 1286 * !insn_offset => main program 1287 * 1288 * For sub prog, the main program's func_info has to 1289 * be loaded first (i.e. prog->func_info != NULL) 1290 */ 1291 err = btf_ext__reloc_func_info(obj->btf, obj->btf_ext, 1292 section_name, insn_offset, 1293 &prog->func_info, 1294 &prog->func_info_cnt); 1295 if (err) 1296 return check_btf_ext_reloc_err(prog, err, 1297 prog->func_info, 1298 "bpf_func_info"); 1299 1300 prog->func_info_rec_size = btf_ext__func_info_rec_size(obj->btf_ext); 1301 } 1302 1303 if (!insn_offset || prog->line_info) { 1304 err = btf_ext__reloc_line_info(obj->btf, obj->btf_ext, 1305 section_name, insn_offset, 1306 &prog->line_info, 1307 &prog->line_info_cnt); 1308 if (err) 1309 return check_btf_ext_reloc_err(prog, err, 1310 prog->line_info, 1311 "bpf_line_info"); 1312 1313 prog->line_info_rec_size = btf_ext__line_info_rec_size(obj->btf_ext); 1314 } 1315 1316 if (!insn_offset) 1317 prog->btf_fd = btf__fd(obj->btf); 1318 1319 return 0; 1320 } 1321 1322 static int 1323 bpf_program__reloc_text(struct bpf_program *prog, struct bpf_object *obj, 1324 struct reloc_desc *relo) 1325 { 1326 struct bpf_insn *insn, *new_insn; 1327 struct bpf_program *text; 1328 size_t new_cnt; 1329 int err; 1330 1331 if (relo->type != RELO_CALL) 1332 return -LIBBPF_ERRNO__RELOC; 1333 1334 if (prog->idx == obj->efile.text_shndx) { 1335 pr_warning("relo in .text insn %d into off %d\n", 1336 relo->insn_idx, relo->text_off); 1337 return -LIBBPF_ERRNO__RELOC; 1338 } 1339 1340 if (prog->main_prog_cnt == 0) { 1341 text = bpf_object__find_prog_by_idx(obj, obj->efile.text_shndx); 1342 if (!text) { 1343 pr_warning("no .text section found yet relo into text exist\n"); 1344 return -LIBBPF_ERRNO__RELOC; 1345 } 1346 new_cnt = prog->insns_cnt + text->insns_cnt; 1347 new_insn = reallocarray(prog->insns, new_cnt, sizeof(*insn)); 1348 if (!new_insn) { 1349 pr_warning("oom in prog realloc\n"); 1350 return -ENOMEM; 1351 } 1352 1353 if (obj->btf_ext) { 1354 err = bpf_program_reloc_btf_ext(prog, obj, 1355 text->section_name, 1356 prog->insns_cnt); 1357 if (err) 1358 return err; 1359 } 1360 1361 memcpy(new_insn + prog->insns_cnt, text->insns, 1362 text->insns_cnt * sizeof(*insn)); 1363 prog->insns = new_insn; 1364 prog->main_prog_cnt = prog->insns_cnt; 1365 prog->insns_cnt = new_cnt; 1366 pr_debug("added %zd insn from %s to prog %s\n", 1367 text->insns_cnt, text->section_name, 1368 prog->section_name); 1369 } 1370 insn = &prog->insns[relo->insn_idx]; 1371 insn->imm += prog->main_prog_cnt - relo->insn_idx; 1372 return 0; 1373 } 1374 1375 static int 1376 bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj) 1377 { 1378 int i, err; 1379 1380 if (!prog) 1381 return 0; 1382 1383 if (obj->btf_ext) { 1384 err = bpf_program_reloc_btf_ext(prog, obj, 1385 prog->section_name, 0); 1386 if (err) 1387 return err; 1388 } 1389 1390 if (!prog->reloc_desc) 1391 return 0; 1392 1393 for (i = 0; i < prog->nr_reloc; i++) { 1394 if (prog->reloc_desc[i].type == RELO_LD64) { 1395 struct bpf_insn *insns = prog->insns; 1396 int insn_idx, map_idx; 1397 1398 insn_idx = prog->reloc_desc[i].insn_idx; 1399 map_idx = prog->reloc_desc[i].map_idx; 1400 1401 if (insn_idx >= (int)prog->insns_cnt) { 1402 pr_warning("relocation out of range: '%s'\n", 1403 prog->section_name); 1404 return -LIBBPF_ERRNO__RELOC; 1405 } 1406 insns[insn_idx].src_reg = BPF_PSEUDO_MAP_FD; 1407 insns[insn_idx].imm = obj->maps[map_idx].fd; 1408 } else { 1409 err = bpf_program__reloc_text(prog, obj, 1410 &prog->reloc_desc[i]); 1411 if (err) 1412 return err; 1413 } 1414 } 1415 1416 zfree(&prog->reloc_desc); 1417 prog->nr_reloc = 0; 1418 return 0; 1419 } 1420 1421 1422 static int 1423 bpf_object__relocate(struct bpf_object *obj) 1424 { 1425 struct bpf_program *prog; 1426 size_t i; 1427 int err; 1428 1429 for (i = 0; i < obj->nr_programs; i++) { 1430 prog = &obj->programs[i]; 1431 1432 err = bpf_program__relocate(prog, obj); 1433 if (err) { 1434 pr_warning("failed to relocate '%s'\n", 1435 prog->section_name); 1436 return err; 1437 } 1438 } 1439 return 0; 1440 } 1441 1442 static int bpf_object__collect_reloc(struct bpf_object *obj) 1443 { 1444 int i, err; 1445 1446 if (!obj_elf_valid(obj)) { 1447 pr_warning("Internal error: elf object is closed\n"); 1448 return -LIBBPF_ERRNO__INTERNAL; 1449 } 1450 1451 for (i = 0; i < obj->efile.nr_reloc; i++) { 1452 GElf_Shdr *shdr = &obj->efile.reloc[i].shdr; 1453 Elf_Data *data = obj->efile.reloc[i].data; 1454 int idx = shdr->sh_info; 1455 struct bpf_program *prog; 1456 1457 if (shdr->sh_type != SHT_REL) { 1458 pr_warning("internal error at %d\n", __LINE__); 1459 return -LIBBPF_ERRNO__INTERNAL; 1460 } 1461 1462 prog = bpf_object__find_prog_by_idx(obj, idx); 1463 if (!prog) { 1464 pr_warning("relocation failed: no section(%d)\n", idx); 1465 return -LIBBPF_ERRNO__RELOC; 1466 } 1467 1468 err = bpf_program__collect_reloc(prog, 1469 shdr, data, 1470 obj); 1471 if (err) 1472 return err; 1473 } 1474 return 0; 1475 } 1476 1477 static int 1478 load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, 1479 char *license, __u32 kern_version, int *pfd) 1480 { 1481 struct bpf_load_program_attr load_attr; 1482 char *cp, errmsg[STRERR_BUFSIZE]; 1483 char *log_buf; 1484 int ret; 1485 1486 memset(&load_attr, 0, sizeof(struct bpf_load_program_attr)); 1487 load_attr.prog_type = prog->type; 1488 load_attr.expected_attach_type = prog->expected_attach_type; 1489 if (prog->caps->name) 1490 load_attr.name = prog->name; 1491 load_attr.insns = insns; 1492 load_attr.insns_cnt = insns_cnt; 1493 load_attr.license = license; 1494 load_attr.kern_version = kern_version; 1495 load_attr.prog_ifindex = prog->prog_ifindex; 1496 load_attr.prog_btf_fd = prog->btf_fd >= 0 ? prog->btf_fd : 0; 1497 load_attr.func_info = prog->func_info; 1498 load_attr.func_info_rec_size = prog->func_info_rec_size; 1499 load_attr.func_info_cnt = prog->func_info_cnt; 1500 load_attr.line_info = prog->line_info; 1501 load_attr.line_info_rec_size = prog->line_info_rec_size; 1502 load_attr.line_info_cnt = prog->line_info_cnt; 1503 if (!load_attr.insns || !load_attr.insns_cnt) 1504 return -EINVAL; 1505 1506 log_buf = malloc(BPF_LOG_BUF_SIZE); 1507 if (!log_buf) 1508 pr_warning("Alloc log buffer for bpf loader error, continue without log\n"); 1509 1510 ret = bpf_load_program_xattr(&load_attr, log_buf, BPF_LOG_BUF_SIZE); 1511 1512 if (ret >= 0) { 1513 *pfd = ret; 1514 ret = 0; 1515 goto out; 1516 } 1517 1518 ret = -LIBBPF_ERRNO__LOAD; 1519 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 1520 pr_warning("load bpf program failed: %s\n", cp); 1521 1522 if (log_buf && log_buf[0] != '\0') { 1523 ret = -LIBBPF_ERRNO__VERIFY; 1524 pr_warning("-- BEGIN DUMP LOG ---\n"); 1525 pr_warning("\n%s\n", log_buf); 1526 pr_warning("-- END LOG --\n"); 1527 } else if (load_attr.insns_cnt >= BPF_MAXINSNS) { 1528 pr_warning("Program too large (%zu insns), at most %d insns\n", 1529 load_attr.insns_cnt, BPF_MAXINSNS); 1530 ret = -LIBBPF_ERRNO__PROG2BIG; 1531 } else { 1532 /* Wrong program type? */ 1533 if (load_attr.prog_type != BPF_PROG_TYPE_KPROBE) { 1534 int fd; 1535 1536 load_attr.prog_type = BPF_PROG_TYPE_KPROBE; 1537 load_attr.expected_attach_type = 0; 1538 fd = bpf_load_program_xattr(&load_attr, NULL, 0); 1539 if (fd >= 0) { 1540 close(fd); 1541 ret = -LIBBPF_ERRNO__PROGTYPE; 1542 goto out; 1543 } 1544 } 1545 1546 if (log_buf) 1547 ret = -LIBBPF_ERRNO__KVER; 1548 } 1549 1550 out: 1551 free(log_buf); 1552 return ret; 1553 } 1554 1555 int 1556 bpf_program__load(struct bpf_program *prog, 1557 char *license, __u32 kern_version) 1558 { 1559 int err = 0, fd, i; 1560 1561 if (prog->instances.nr < 0 || !prog->instances.fds) { 1562 if (prog->preprocessor) { 1563 pr_warning("Internal error: can't load program '%s'\n", 1564 prog->section_name); 1565 return -LIBBPF_ERRNO__INTERNAL; 1566 } 1567 1568 prog->instances.fds = malloc(sizeof(int)); 1569 if (!prog->instances.fds) { 1570 pr_warning("Not enough memory for BPF fds\n"); 1571 return -ENOMEM; 1572 } 1573 prog->instances.nr = 1; 1574 prog->instances.fds[0] = -1; 1575 } 1576 1577 if (!prog->preprocessor) { 1578 if (prog->instances.nr != 1) { 1579 pr_warning("Program '%s' is inconsistent: nr(%d) != 1\n", 1580 prog->section_name, prog->instances.nr); 1581 } 1582 err = load_program(prog, prog->insns, prog->insns_cnt, 1583 license, kern_version, &fd); 1584 if (!err) 1585 prog->instances.fds[0] = fd; 1586 goto out; 1587 } 1588 1589 for (i = 0; i < prog->instances.nr; i++) { 1590 struct bpf_prog_prep_result result; 1591 bpf_program_prep_t preprocessor = prog->preprocessor; 1592 1593 memset(&result, 0, sizeof(result)); 1594 err = preprocessor(prog, i, prog->insns, 1595 prog->insns_cnt, &result); 1596 if (err) { 1597 pr_warning("Preprocessing the %dth instance of program '%s' failed\n", 1598 i, prog->section_name); 1599 goto out; 1600 } 1601 1602 if (!result.new_insn_ptr || !result.new_insn_cnt) { 1603 pr_debug("Skip loading the %dth instance of program '%s'\n", 1604 i, prog->section_name); 1605 prog->instances.fds[i] = -1; 1606 if (result.pfd) 1607 *result.pfd = -1; 1608 continue; 1609 } 1610 1611 err = load_program(prog, result.new_insn_ptr, 1612 result.new_insn_cnt, 1613 license, kern_version, &fd); 1614 1615 if (err) { 1616 pr_warning("Loading the %dth instance of program '%s' failed\n", 1617 i, prog->section_name); 1618 goto out; 1619 } 1620 1621 if (result.pfd) 1622 *result.pfd = fd; 1623 prog->instances.fds[i] = fd; 1624 } 1625 out: 1626 if (err) 1627 pr_warning("failed to load program '%s'\n", 1628 prog->section_name); 1629 zfree(&prog->insns); 1630 prog->insns_cnt = 0; 1631 return err; 1632 } 1633 1634 static bool bpf_program__is_function_storage(struct bpf_program *prog, 1635 struct bpf_object *obj) 1636 { 1637 return prog->idx == obj->efile.text_shndx && obj->has_pseudo_calls; 1638 } 1639 1640 static int 1641 bpf_object__load_progs(struct bpf_object *obj) 1642 { 1643 size_t i; 1644 int err; 1645 1646 for (i = 0; i < obj->nr_programs; i++) { 1647 if (bpf_program__is_function_storage(&obj->programs[i], obj)) 1648 continue; 1649 err = bpf_program__load(&obj->programs[i], 1650 obj->license, 1651 obj->kern_version); 1652 if (err) 1653 return err; 1654 } 1655 return 0; 1656 } 1657 1658 static bool bpf_prog_type__needs_kver(enum bpf_prog_type type) 1659 { 1660 switch (type) { 1661 case BPF_PROG_TYPE_SOCKET_FILTER: 1662 case BPF_PROG_TYPE_SCHED_CLS: 1663 case BPF_PROG_TYPE_SCHED_ACT: 1664 case BPF_PROG_TYPE_XDP: 1665 case BPF_PROG_TYPE_CGROUP_SKB: 1666 case BPF_PROG_TYPE_CGROUP_SOCK: 1667 case BPF_PROG_TYPE_LWT_IN: 1668 case BPF_PROG_TYPE_LWT_OUT: 1669 case BPF_PROG_TYPE_LWT_XMIT: 1670 case BPF_PROG_TYPE_LWT_SEG6LOCAL: 1671 case BPF_PROG_TYPE_SOCK_OPS: 1672 case BPF_PROG_TYPE_SK_SKB: 1673 case BPF_PROG_TYPE_CGROUP_DEVICE: 1674 case BPF_PROG_TYPE_SK_MSG: 1675 case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: 1676 case BPF_PROG_TYPE_LIRC_MODE2: 1677 case BPF_PROG_TYPE_SK_REUSEPORT: 1678 case BPF_PROG_TYPE_FLOW_DISSECTOR: 1679 case BPF_PROG_TYPE_UNSPEC: 1680 case BPF_PROG_TYPE_TRACEPOINT: 1681 case BPF_PROG_TYPE_RAW_TRACEPOINT: 1682 case BPF_PROG_TYPE_PERF_EVENT: 1683 return false; 1684 case BPF_PROG_TYPE_KPROBE: 1685 default: 1686 return true; 1687 } 1688 } 1689 1690 static int bpf_object__validate(struct bpf_object *obj, bool needs_kver) 1691 { 1692 if (needs_kver && obj->kern_version == 0) { 1693 pr_warning("%s doesn't provide kernel version\n", 1694 obj->path); 1695 return -LIBBPF_ERRNO__KVERSION; 1696 } 1697 return 0; 1698 } 1699 1700 static struct bpf_object * 1701 __bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz, 1702 bool needs_kver, int flags) 1703 { 1704 struct bpf_object *obj; 1705 int err; 1706 1707 if (elf_version(EV_CURRENT) == EV_NONE) { 1708 pr_warning("failed to init libelf for %s\n", path); 1709 return ERR_PTR(-LIBBPF_ERRNO__LIBELF); 1710 } 1711 1712 obj = bpf_object__new(path, obj_buf, obj_buf_sz); 1713 if (IS_ERR(obj)) 1714 return obj; 1715 1716 CHECK_ERR(bpf_object__elf_init(obj), err, out); 1717 CHECK_ERR(bpf_object__check_endianness(obj), err, out); 1718 CHECK_ERR(bpf_object__elf_collect(obj, flags), err, out); 1719 CHECK_ERR(bpf_object__collect_reloc(obj), err, out); 1720 CHECK_ERR(bpf_object__validate(obj, needs_kver), err, out); 1721 1722 bpf_object__elf_finish(obj); 1723 return obj; 1724 out: 1725 bpf_object__close(obj); 1726 return ERR_PTR(err); 1727 } 1728 1729 struct bpf_object *__bpf_object__open_xattr(struct bpf_object_open_attr *attr, 1730 int flags) 1731 { 1732 /* param validation */ 1733 if (!attr->file) 1734 return NULL; 1735 1736 pr_debug("loading %s\n", attr->file); 1737 1738 return __bpf_object__open(attr->file, NULL, 0, 1739 bpf_prog_type__needs_kver(attr->prog_type), 1740 flags); 1741 } 1742 1743 struct bpf_object *bpf_object__open_xattr(struct bpf_object_open_attr *attr) 1744 { 1745 return __bpf_object__open_xattr(attr, 0); 1746 } 1747 1748 struct bpf_object *bpf_object__open(const char *path) 1749 { 1750 struct bpf_object_open_attr attr = { 1751 .file = path, 1752 .prog_type = BPF_PROG_TYPE_UNSPEC, 1753 }; 1754 1755 return bpf_object__open_xattr(&attr); 1756 } 1757 1758 struct bpf_object *bpf_object__open_buffer(void *obj_buf, 1759 size_t obj_buf_sz, 1760 const char *name) 1761 { 1762 char tmp_name[64]; 1763 1764 /* param validation */ 1765 if (!obj_buf || obj_buf_sz <= 0) 1766 return NULL; 1767 1768 if (!name) { 1769 snprintf(tmp_name, sizeof(tmp_name), "%lx-%lx", 1770 (unsigned long)obj_buf, 1771 (unsigned long)obj_buf_sz); 1772 tmp_name[sizeof(tmp_name) - 1] = '\0'; 1773 name = tmp_name; 1774 } 1775 pr_debug("loading object '%s' from buffer\n", 1776 name); 1777 1778 return __bpf_object__open(name, obj_buf, obj_buf_sz, true, true); 1779 } 1780 1781 int bpf_object__unload(struct bpf_object *obj) 1782 { 1783 size_t i; 1784 1785 if (!obj) 1786 return -EINVAL; 1787 1788 for (i = 0; i < obj->nr_maps; i++) 1789 zclose(obj->maps[i].fd); 1790 1791 for (i = 0; i < obj->nr_programs; i++) 1792 bpf_program__unload(&obj->programs[i]); 1793 1794 return 0; 1795 } 1796 1797 int bpf_object__load(struct bpf_object *obj) 1798 { 1799 int err; 1800 1801 if (!obj) 1802 return -EINVAL; 1803 1804 if (obj->loaded) { 1805 pr_warning("object should not be loaded twice\n"); 1806 return -EINVAL; 1807 } 1808 1809 obj->loaded = true; 1810 1811 CHECK_ERR(bpf_object__probe_caps(obj), err, out); 1812 CHECK_ERR(bpf_object__create_maps(obj), err, out); 1813 CHECK_ERR(bpf_object__relocate(obj), err, out); 1814 CHECK_ERR(bpf_object__load_progs(obj), err, out); 1815 1816 return 0; 1817 out: 1818 bpf_object__unload(obj); 1819 pr_warning("failed to load object '%s'\n", obj->path); 1820 return err; 1821 } 1822 1823 static int check_path(const char *path) 1824 { 1825 char *cp, errmsg[STRERR_BUFSIZE]; 1826 struct statfs st_fs; 1827 char *dname, *dir; 1828 int err = 0; 1829 1830 if (path == NULL) 1831 return -EINVAL; 1832 1833 dname = strdup(path); 1834 if (dname == NULL) 1835 return -ENOMEM; 1836 1837 dir = dirname(dname); 1838 if (statfs(dir, &st_fs)) { 1839 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 1840 pr_warning("failed to statfs %s: %s\n", dir, cp); 1841 err = -errno; 1842 } 1843 free(dname); 1844 1845 if (!err && st_fs.f_type != BPF_FS_MAGIC) { 1846 pr_warning("specified path %s is not on BPF FS\n", path); 1847 err = -EINVAL; 1848 } 1849 1850 return err; 1851 } 1852 1853 int bpf_program__pin_instance(struct bpf_program *prog, const char *path, 1854 int instance) 1855 { 1856 char *cp, errmsg[STRERR_BUFSIZE]; 1857 int err; 1858 1859 err = check_path(path); 1860 if (err) 1861 return err; 1862 1863 if (prog == NULL) { 1864 pr_warning("invalid program pointer\n"); 1865 return -EINVAL; 1866 } 1867 1868 if (instance < 0 || instance >= prog->instances.nr) { 1869 pr_warning("invalid prog instance %d of prog %s (max %d)\n", 1870 instance, prog->section_name, prog->instances.nr); 1871 return -EINVAL; 1872 } 1873 1874 if (bpf_obj_pin(prog->instances.fds[instance], path)) { 1875 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 1876 pr_warning("failed to pin program: %s\n", cp); 1877 return -errno; 1878 } 1879 pr_debug("pinned program '%s'\n", path); 1880 1881 return 0; 1882 } 1883 1884 int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, 1885 int instance) 1886 { 1887 int err; 1888 1889 err = check_path(path); 1890 if (err) 1891 return err; 1892 1893 if (prog == NULL) { 1894 pr_warning("invalid program pointer\n"); 1895 return -EINVAL; 1896 } 1897 1898 if (instance < 0 || instance >= prog->instances.nr) { 1899 pr_warning("invalid prog instance %d of prog %s (max %d)\n", 1900 instance, prog->section_name, prog->instances.nr); 1901 return -EINVAL; 1902 } 1903 1904 err = unlink(path); 1905 if (err != 0) 1906 return -errno; 1907 pr_debug("unpinned program '%s'\n", path); 1908 1909 return 0; 1910 } 1911 1912 static int make_dir(const char *path) 1913 { 1914 char *cp, errmsg[STRERR_BUFSIZE]; 1915 int err = 0; 1916 1917 if (mkdir(path, 0700) && errno != EEXIST) 1918 err = -errno; 1919 1920 if (err) { 1921 cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); 1922 pr_warning("failed to mkdir %s: %s\n", path, cp); 1923 } 1924 return err; 1925 } 1926 1927 int bpf_program__pin(struct bpf_program *prog, const char *path) 1928 { 1929 int i, err; 1930 1931 err = check_path(path); 1932 if (err) 1933 return err; 1934 1935 if (prog == NULL) { 1936 pr_warning("invalid program pointer\n"); 1937 return -EINVAL; 1938 } 1939 1940 if (prog->instances.nr <= 0) { 1941 pr_warning("no instances of prog %s to pin\n", 1942 prog->section_name); 1943 return -EINVAL; 1944 } 1945 1946 if (prog->instances.nr == 1) { 1947 /* don't create subdirs when pinning single instance */ 1948 return bpf_program__pin_instance(prog, path, 0); 1949 } 1950 1951 err = make_dir(path); 1952 if (err) 1953 return err; 1954 1955 for (i = 0; i < prog->instances.nr; i++) { 1956 char buf[PATH_MAX]; 1957 int len; 1958 1959 len = snprintf(buf, PATH_MAX, "%s/%d", path, i); 1960 if (len < 0) { 1961 err = -EINVAL; 1962 goto err_unpin; 1963 } else if (len >= PATH_MAX) { 1964 err = -ENAMETOOLONG; 1965 goto err_unpin; 1966 } 1967 1968 err = bpf_program__pin_instance(prog, buf, i); 1969 if (err) 1970 goto err_unpin; 1971 } 1972 1973 return 0; 1974 1975 err_unpin: 1976 for (i = i - 1; i >= 0; i--) { 1977 char buf[PATH_MAX]; 1978 int len; 1979 1980 len = snprintf(buf, PATH_MAX, "%s/%d", path, i); 1981 if (len < 0) 1982 continue; 1983 else if (len >= PATH_MAX) 1984 continue; 1985 1986 bpf_program__unpin_instance(prog, buf, i); 1987 } 1988 1989 rmdir(path); 1990 1991 return err; 1992 } 1993 1994 int bpf_program__unpin(struct bpf_program *prog, const char *path) 1995 { 1996 int i, err; 1997 1998 err = check_path(path); 1999 if (err) 2000 return err; 2001 2002 if (prog == NULL) { 2003 pr_warning("invalid program pointer\n"); 2004 return -EINVAL; 2005 } 2006 2007 if (prog->instances.nr <= 0) { 2008 pr_warning("no instances of prog %s to pin\n", 2009 prog->section_name); 2010 return -EINVAL; 2011 } 2012 2013 if (prog->instances.nr == 1) { 2014 /* don't create subdirs when pinning single instance */ 2015 return bpf_program__unpin_instance(prog, path, 0); 2016 } 2017 2018 for (i = 0; i < prog->instances.nr; i++) { 2019 char buf[PATH_MAX]; 2020 int len; 2021 2022 len = snprintf(buf, PATH_MAX, "%s/%d", path, i); 2023 if (len < 0) 2024 return -EINVAL; 2025 else if (len >= PATH_MAX) 2026 return -ENAMETOOLONG; 2027 2028 err = bpf_program__unpin_instance(prog, buf, i); 2029 if (err) 2030 return err; 2031 } 2032 2033 err = rmdir(path); 2034 if (err) 2035 return -errno; 2036 2037 return 0; 2038 } 2039 2040 int bpf_map__pin(struct bpf_map *map, const char *path) 2041 { 2042 char *cp, errmsg[STRERR_BUFSIZE]; 2043 int err; 2044 2045 err = check_path(path); 2046 if (err) 2047 return err; 2048 2049 if (map == NULL) { 2050 pr_warning("invalid map pointer\n"); 2051 return -EINVAL; 2052 } 2053 2054 if (bpf_obj_pin(map->fd, path)) { 2055 cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); 2056 pr_warning("failed to pin map: %s\n", cp); 2057 return -errno; 2058 } 2059 2060 pr_debug("pinned map '%s'\n", path); 2061 2062 return 0; 2063 } 2064 2065 int bpf_map__unpin(struct bpf_map *map, const char *path) 2066 { 2067 int err; 2068 2069 err = check_path(path); 2070 if (err) 2071 return err; 2072 2073 if (map == NULL) { 2074 pr_warning("invalid map pointer\n"); 2075 return -EINVAL; 2076 } 2077 2078 err = unlink(path); 2079 if (err != 0) 2080 return -errno; 2081 pr_debug("unpinned map '%s'\n", path); 2082 2083 return 0; 2084 } 2085 2086 int bpf_object__pin_maps(struct bpf_object *obj, const char *path) 2087 { 2088 struct bpf_map *map; 2089 int err; 2090 2091 if (!obj) 2092 return -ENOENT; 2093 2094 if (!obj->loaded) { 2095 pr_warning("object not yet loaded; load it first\n"); 2096 return -ENOENT; 2097 } 2098 2099 err = make_dir(path); 2100 if (err) 2101 return err; 2102 2103 bpf_map__for_each(map, obj) { 2104 char buf[PATH_MAX]; 2105 int len; 2106 2107 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2108 bpf_map__name(map)); 2109 if (len < 0) { 2110 err = -EINVAL; 2111 goto err_unpin_maps; 2112 } else if (len >= PATH_MAX) { 2113 err = -ENAMETOOLONG; 2114 goto err_unpin_maps; 2115 } 2116 2117 err = bpf_map__pin(map, buf); 2118 if (err) 2119 goto err_unpin_maps; 2120 } 2121 2122 return 0; 2123 2124 err_unpin_maps: 2125 while ((map = bpf_map__prev(map, obj))) { 2126 char buf[PATH_MAX]; 2127 int len; 2128 2129 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2130 bpf_map__name(map)); 2131 if (len < 0) 2132 continue; 2133 else if (len >= PATH_MAX) 2134 continue; 2135 2136 bpf_map__unpin(map, buf); 2137 } 2138 2139 return err; 2140 } 2141 2142 int bpf_object__unpin_maps(struct bpf_object *obj, const char *path) 2143 { 2144 struct bpf_map *map; 2145 int err; 2146 2147 if (!obj) 2148 return -ENOENT; 2149 2150 bpf_map__for_each(map, obj) { 2151 char buf[PATH_MAX]; 2152 int len; 2153 2154 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2155 bpf_map__name(map)); 2156 if (len < 0) 2157 return -EINVAL; 2158 else if (len >= PATH_MAX) 2159 return -ENAMETOOLONG; 2160 2161 err = bpf_map__unpin(map, buf); 2162 if (err) 2163 return err; 2164 } 2165 2166 return 0; 2167 } 2168 2169 int bpf_object__pin_programs(struct bpf_object *obj, const char *path) 2170 { 2171 struct bpf_program *prog; 2172 int err; 2173 2174 if (!obj) 2175 return -ENOENT; 2176 2177 if (!obj->loaded) { 2178 pr_warning("object not yet loaded; load it first\n"); 2179 return -ENOENT; 2180 } 2181 2182 err = make_dir(path); 2183 if (err) 2184 return err; 2185 2186 bpf_object__for_each_program(prog, obj) { 2187 char buf[PATH_MAX]; 2188 int len; 2189 2190 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2191 prog->pin_name); 2192 if (len < 0) { 2193 err = -EINVAL; 2194 goto err_unpin_programs; 2195 } else if (len >= PATH_MAX) { 2196 err = -ENAMETOOLONG; 2197 goto err_unpin_programs; 2198 } 2199 2200 err = bpf_program__pin(prog, buf); 2201 if (err) 2202 goto err_unpin_programs; 2203 } 2204 2205 return 0; 2206 2207 err_unpin_programs: 2208 while ((prog = bpf_program__prev(prog, obj))) { 2209 char buf[PATH_MAX]; 2210 int len; 2211 2212 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2213 prog->pin_name); 2214 if (len < 0) 2215 continue; 2216 else if (len >= PATH_MAX) 2217 continue; 2218 2219 bpf_program__unpin(prog, buf); 2220 } 2221 2222 return err; 2223 } 2224 2225 int bpf_object__unpin_programs(struct bpf_object *obj, const char *path) 2226 { 2227 struct bpf_program *prog; 2228 int err; 2229 2230 if (!obj) 2231 return -ENOENT; 2232 2233 bpf_object__for_each_program(prog, obj) { 2234 char buf[PATH_MAX]; 2235 int len; 2236 2237 len = snprintf(buf, PATH_MAX, "%s/%s", path, 2238 prog->pin_name); 2239 if (len < 0) 2240 return -EINVAL; 2241 else if (len >= PATH_MAX) 2242 return -ENAMETOOLONG; 2243 2244 err = bpf_program__unpin(prog, buf); 2245 if (err) 2246 return err; 2247 } 2248 2249 return 0; 2250 } 2251 2252 int bpf_object__pin(struct bpf_object *obj, const char *path) 2253 { 2254 int err; 2255 2256 err = bpf_object__pin_maps(obj, path); 2257 if (err) 2258 return err; 2259 2260 err = bpf_object__pin_programs(obj, path); 2261 if (err) { 2262 bpf_object__unpin_maps(obj, path); 2263 return err; 2264 } 2265 2266 return 0; 2267 } 2268 2269 void bpf_object__close(struct bpf_object *obj) 2270 { 2271 size_t i; 2272 2273 if (!obj) 2274 return; 2275 2276 if (obj->clear_priv) 2277 obj->clear_priv(obj, obj->priv); 2278 2279 bpf_object__elf_finish(obj); 2280 bpf_object__unload(obj); 2281 btf__free(obj->btf); 2282 btf_ext__free(obj->btf_ext); 2283 2284 for (i = 0; i < obj->nr_maps; i++) { 2285 zfree(&obj->maps[i].name); 2286 if (obj->maps[i].clear_priv) 2287 obj->maps[i].clear_priv(&obj->maps[i], 2288 obj->maps[i].priv); 2289 obj->maps[i].priv = NULL; 2290 obj->maps[i].clear_priv = NULL; 2291 } 2292 zfree(&obj->maps); 2293 obj->nr_maps = 0; 2294 2295 if (obj->programs && obj->nr_programs) { 2296 for (i = 0; i < obj->nr_programs; i++) 2297 bpf_program__exit(&obj->programs[i]); 2298 } 2299 zfree(&obj->programs); 2300 2301 list_del(&obj->list); 2302 free(obj); 2303 } 2304 2305 struct bpf_object * 2306 bpf_object__next(struct bpf_object *prev) 2307 { 2308 struct bpf_object *next; 2309 2310 if (!prev) 2311 next = list_first_entry(&bpf_objects_list, 2312 struct bpf_object, 2313 list); 2314 else 2315 next = list_next_entry(prev, list); 2316 2317 /* Empty list is noticed here so don't need checking on entry. */ 2318 if (&next->list == &bpf_objects_list) 2319 return NULL; 2320 2321 return next; 2322 } 2323 2324 const char *bpf_object__name(struct bpf_object *obj) 2325 { 2326 return obj ? obj->path : ERR_PTR(-EINVAL); 2327 } 2328 2329 unsigned int bpf_object__kversion(struct bpf_object *obj) 2330 { 2331 return obj ? obj->kern_version : 0; 2332 } 2333 2334 struct btf *bpf_object__btf(struct bpf_object *obj) 2335 { 2336 return obj ? obj->btf : NULL; 2337 } 2338 2339 int bpf_object__btf_fd(const struct bpf_object *obj) 2340 { 2341 return obj->btf ? btf__fd(obj->btf) : -1; 2342 } 2343 2344 int bpf_object__set_priv(struct bpf_object *obj, void *priv, 2345 bpf_object_clear_priv_t clear_priv) 2346 { 2347 if (obj->priv && obj->clear_priv) 2348 obj->clear_priv(obj, obj->priv); 2349 2350 obj->priv = priv; 2351 obj->clear_priv = clear_priv; 2352 return 0; 2353 } 2354 2355 void *bpf_object__priv(struct bpf_object *obj) 2356 { 2357 return obj ? obj->priv : ERR_PTR(-EINVAL); 2358 } 2359 2360 static struct bpf_program * 2361 __bpf_program__iter(struct bpf_program *p, struct bpf_object *obj, bool forward) 2362 { 2363 size_t nr_programs = obj->nr_programs; 2364 ssize_t idx; 2365 2366 if (!nr_programs) 2367 return NULL; 2368 2369 if (!p) 2370 /* Iter from the beginning */ 2371 return forward ? &obj->programs[0] : 2372 &obj->programs[nr_programs - 1]; 2373 2374 if (p->obj != obj) { 2375 pr_warning("error: program handler doesn't match object\n"); 2376 return NULL; 2377 } 2378 2379 idx = (p - obj->programs) + (forward ? 1 : -1); 2380 if (idx >= obj->nr_programs || idx < 0) 2381 return NULL; 2382 return &obj->programs[idx]; 2383 } 2384 2385 struct bpf_program * 2386 bpf_program__next(struct bpf_program *prev, struct bpf_object *obj) 2387 { 2388 struct bpf_program *prog = prev; 2389 2390 do { 2391 prog = __bpf_program__iter(prog, obj, true); 2392 } while (prog && bpf_program__is_function_storage(prog, obj)); 2393 2394 return prog; 2395 } 2396 2397 struct bpf_program * 2398 bpf_program__prev(struct bpf_program *next, struct bpf_object *obj) 2399 { 2400 struct bpf_program *prog = next; 2401 2402 do { 2403 prog = __bpf_program__iter(prog, obj, false); 2404 } while (prog && bpf_program__is_function_storage(prog, obj)); 2405 2406 return prog; 2407 } 2408 2409 int bpf_program__set_priv(struct bpf_program *prog, void *priv, 2410 bpf_program_clear_priv_t clear_priv) 2411 { 2412 if (prog->priv && prog->clear_priv) 2413 prog->clear_priv(prog, prog->priv); 2414 2415 prog->priv = priv; 2416 prog->clear_priv = clear_priv; 2417 return 0; 2418 } 2419 2420 void *bpf_program__priv(struct bpf_program *prog) 2421 { 2422 return prog ? prog->priv : ERR_PTR(-EINVAL); 2423 } 2424 2425 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) 2426 { 2427 prog->prog_ifindex = ifindex; 2428 } 2429 2430 const char *bpf_program__title(struct bpf_program *prog, bool needs_copy) 2431 { 2432 const char *title; 2433 2434 title = prog->section_name; 2435 if (needs_copy) { 2436 title = strdup(title); 2437 if (!title) { 2438 pr_warning("failed to strdup program title\n"); 2439 return ERR_PTR(-ENOMEM); 2440 } 2441 } 2442 2443 return title; 2444 } 2445 2446 int bpf_program__fd(struct bpf_program *prog) 2447 { 2448 return bpf_program__nth_fd(prog, 0); 2449 } 2450 2451 int bpf_program__set_prep(struct bpf_program *prog, int nr_instances, 2452 bpf_program_prep_t prep) 2453 { 2454 int *instances_fds; 2455 2456 if (nr_instances <= 0 || !prep) 2457 return -EINVAL; 2458 2459 if (prog->instances.nr > 0 || prog->instances.fds) { 2460 pr_warning("Can't set pre-processor after loading\n"); 2461 return -EINVAL; 2462 } 2463 2464 instances_fds = malloc(sizeof(int) * nr_instances); 2465 if (!instances_fds) { 2466 pr_warning("alloc memory failed for fds\n"); 2467 return -ENOMEM; 2468 } 2469 2470 /* fill all fd with -1 */ 2471 memset(instances_fds, -1, sizeof(int) * nr_instances); 2472 2473 prog->instances.nr = nr_instances; 2474 prog->instances.fds = instances_fds; 2475 prog->preprocessor = prep; 2476 return 0; 2477 } 2478 2479 int bpf_program__nth_fd(struct bpf_program *prog, int n) 2480 { 2481 int fd; 2482 2483 if (!prog) 2484 return -EINVAL; 2485 2486 if (n >= prog->instances.nr || n < 0) { 2487 pr_warning("Can't get the %dth fd from program %s: only %d instances\n", 2488 n, prog->section_name, prog->instances.nr); 2489 return -EINVAL; 2490 } 2491 2492 fd = prog->instances.fds[n]; 2493 if (fd < 0) { 2494 pr_warning("%dth instance of program '%s' is invalid\n", 2495 n, prog->section_name); 2496 return -ENOENT; 2497 } 2498 2499 return fd; 2500 } 2501 2502 void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) 2503 { 2504 prog->type = type; 2505 } 2506 2507 static bool bpf_program__is_type(struct bpf_program *prog, 2508 enum bpf_prog_type type) 2509 { 2510 return prog ? (prog->type == type) : false; 2511 } 2512 2513 #define BPF_PROG_TYPE_FNS(NAME, TYPE) \ 2514 int bpf_program__set_##NAME(struct bpf_program *prog) \ 2515 { \ 2516 if (!prog) \ 2517 return -EINVAL; \ 2518 bpf_program__set_type(prog, TYPE); \ 2519 return 0; \ 2520 } \ 2521 \ 2522 bool bpf_program__is_##NAME(struct bpf_program *prog) \ 2523 { \ 2524 return bpf_program__is_type(prog, TYPE); \ 2525 } \ 2526 2527 BPF_PROG_TYPE_FNS(socket_filter, BPF_PROG_TYPE_SOCKET_FILTER); 2528 BPF_PROG_TYPE_FNS(kprobe, BPF_PROG_TYPE_KPROBE); 2529 BPF_PROG_TYPE_FNS(sched_cls, BPF_PROG_TYPE_SCHED_CLS); 2530 BPF_PROG_TYPE_FNS(sched_act, BPF_PROG_TYPE_SCHED_ACT); 2531 BPF_PROG_TYPE_FNS(tracepoint, BPF_PROG_TYPE_TRACEPOINT); 2532 BPF_PROG_TYPE_FNS(raw_tracepoint, BPF_PROG_TYPE_RAW_TRACEPOINT); 2533 BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP); 2534 BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT); 2535 2536 void bpf_program__set_expected_attach_type(struct bpf_program *prog, 2537 enum bpf_attach_type type) 2538 { 2539 prog->expected_attach_type = type; 2540 } 2541 2542 #define BPF_PROG_SEC_IMPL(string, ptype, eatype, is_attachable, atype) \ 2543 { string, sizeof(string) - 1, ptype, eatype, is_attachable, atype } 2544 2545 /* Programs that can NOT be attached. */ 2546 #define BPF_PROG_SEC(string, ptype) BPF_PROG_SEC_IMPL(string, ptype, 0, 0, 0) 2547 2548 /* Programs that can be attached. */ 2549 #define BPF_APROG_SEC(string, ptype, atype) \ 2550 BPF_PROG_SEC_IMPL(string, ptype, 0, 1, atype) 2551 2552 /* Programs that must specify expected attach type at load time. */ 2553 #define BPF_EAPROG_SEC(string, ptype, eatype) \ 2554 BPF_PROG_SEC_IMPL(string, ptype, eatype, 1, eatype) 2555 2556 /* Programs that can be attached but attach type can't be identified by section 2557 * name. Kept for backward compatibility. 2558 */ 2559 #define BPF_APROG_COMPAT(string, ptype) BPF_PROG_SEC(string, ptype) 2560 2561 static const struct { 2562 const char *sec; 2563 size_t len; 2564 enum bpf_prog_type prog_type; 2565 enum bpf_attach_type expected_attach_type; 2566 int is_attachable; 2567 enum bpf_attach_type attach_type; 2568 } section_names[] = { 2569 BPF_PROG_SEC("socket", BPF_PROG_TYPE_SOCKET_FILTER), 2570 BPF_PROG_SEC("kprobe/", BPF_PROG_TYPE_KPROBE), 2571 BPF_PROG_SEC("kretprobe/", BPF_PROG_TYPE_KPROBE), 2572 BPF_PROG_SEC("classifier", BPF_PROG_TYPE_SCHED_CLS), 2573 BPF_PROG_SEC("action", BPF_PROG_TYPE_SCHED_ACT), 2574 BPF_PROG_SEC("tracepoint/", BPF_PROG_TYPE_TRACEPOINT), 2575 BPF_PROG_SEC("raw_tracepoint/", BPF_PROG_TYPE_RAW_TRACEPOINT), 2576 BPF_PROG_SEC("xdp", BPF_PROG_TYPE_XDP), 2577 BPF_PROG_SEC("perf_event", BPF_PROG_TYPE_PERF_EVENT), 2578 BPF_PROG_SEC("lwt_in", BPF_PROG_TYPE_LWT_IN), 2579 BPF_PROG_SEC("lwt_out", BPF_PROG_TYPE_LWT_OUT), 2580 BPF_PROG_SEC("lwt_xmit", BPF_PROG_TYPE_LWT_XMIT), 2581 BPF_PROG_SEC("lwt_seg6local", BPF_PROG_TYPE_LWT_SEG6LOCAL), 2582 BPF_APROG_SEC("cgroup_skb/ingress", BPF_PROG_TYPE_CGROUP_SKB, 2583 BPF_CGROUP_INET_INGRESS), 2584 BPF_APROG_SEC("cgroup_skb/egress", BPF_PROG_TYPE_CGROUP_SKB, 2585 BPF_CGROUP_INET_EGRESS), 2586 BPF_APROG_COMPAT("cgroup/skb", BPF_PROG_TYPE_CGROUP_SKB), 2587 BPF_APROG_SEC("cgroup/sock", BPF_PROG_TYPE_CGROUP_SOCK, 2588 BPF_CGROUP_INET_SOCK_CREATE), 2589 BPF_EAPROG_SEC("cgroup/post_bind4", BPF_PROG_TYPE_CGROUP_SOCK, 2590 BPF_CGROUP_INET4_POST_BIND), 2591 BPF_EAPROG_SEC("cgroup/post_bind6", BPF_PROG_TYPE_CGROUP_SOCK, 2592 BPF_CGROUP_INET6_POST_BIND), 2593 BPF_APROG_SEC("cgroup/dev", BPF_PROG_TYPE_CGROUP_DEVICE, 2594 BPF_CGROUP_DEVICE), 2595 BPF_APROG_SEC("sockops", BPF_PROG_TYPE_SOCK_OPS, 2596 BPF_CGROUP_SOCK_OPS), 2597 BPF_APROG_SEC("sk_skb/stream_parser", BPF_PROG_TYPE_SK_SKB, 2598 BPF_SK_SKB_STREAM_PARSER), 2599 BPF_APROG_SEC("sk_skb/stream_verdict", BPF_PROG_TYPE_SK_SKB, 2600 BPF_SK_SKB_STREAM_VERDICT), 2601 BPF_APROG_COMPAT("sk_skb", BPF_PROG_TYPE_SK_SKB), 2602 BPF_APROG_SEC("sk_msg", BPF_PROG_TYPE_SK_MSG, 2603 BPF_SK_MSG_VERDICT), 2604 BPF_APROG_SEC("lirc_mode2", BPF_PROG_TYPE_LIRC_MODE2, 2605 BPF_LIRC_MODE2), 2606 BPF_APROG_SEC("flow_dissector", BPF_PROG_TYPE_FLOW_DISSECTOR, 2607 BPF_FLOW_DISSECTOR), 2608 BPF_EAPROG_SEC("cgroup/bind4", BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 2609 BPF_CGROUP_INET4_BIND), 2610 BPF_EAPROG_SEC("cgroup/bind6", BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 2611 BPF_CGROUP_INET6_BIND), 2612 BPF_EAPROG_SEC("cgroup/connect4", BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 2613 BPF_CGROUP_INET4_CONNECT), 2614 BPF_EAPROG_SEC("cgroup/connect6", BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 2615 BPF_CGROUP_INET6_CONNECT), 2616 BPF_EAPROG_SEC("cgroup/sendmsg4", BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 2617 BPF_CGROUP_UDP4_SENDMSG), 2618 BPF_EAPROG_SEC("cgroup/sendmsg6", BPF_PROG_TYPE_CGROUP_SOCK_ADDR, 2619 BPF_CGROUP_UDP6_SENDMSG), 2620 }; 2621 2622 #undef BPF_PROG_SEC_IMPL 2623 #undef BPF_PROG_SEC 2624 #undef BPF_APROG_SEC 2625 #undef BPF_EAPROG_SEC 2626 #undef BPF_APROG_COMPAT 2627 2628 #define MAX_TYPE_NAME_SIZE 32 2629 2630 static char *libbpf_get_type_names(bool attach_type) 2631 { 2632 int i, len = ARRAY_SIZE(section_names) * MAX_TYPE_NAME_SIZE; 2633 char *buf; 2634 2635 buf = malloc(len); 2636 if (!buf) 2637 return NULL; 2638 2639 buf[0] = '\0'; 2640 /* Forge string buf with all available names */ 2641 for (i = 0; i < ARRAY_SIZE(section_names); i++) { 2642 if (attach_type && !section_names[i].is_attachable) 2643 continue; 2644 2645 if (strlen(buf) + strlen(section_names[i].sec) + 2 > len) { 2646 free(buf); 2647 return NULL; 2648 } 2649 strcat(buf, " "); 2650 strcat(buf, section_names[i].sec); 2651 } 2652 2653 return buf; 2654 } 2655 2656 int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, 2657 enum bpf_attach_type *expected_attach_type) 2658 { 2659 char *type_names; 2660 int i; 2661 2662 if (!name) 2663 return -EINVAL; 2664 2665 for (i = 0; i < ARRAY_SIZE(section_names); i++) { 2666 if (strncmp(name, section_names[i].sec, section_names[i].len)) 2667 continue; 2668 *prog_type = section_names[i].prog_type; 2669 *expected_attach_type = section_names[i].expected_attach_type; 2670 return 0; 2671 } 2672 pr_warning("failed to guess program type based on ELF section name '%s'\n", name); 2673 type_names = libbpf_get_type_names(false); 2674 if (type_names != NULL) { 2675 pr_info("supported section(type) names are:%s\n", type_names); 2676 free(type_names); 2677 } 2678 2679 return -EINVAL; 2680 } 2681 2682 int libbpf_attach_type_by_name(const char *name, 2683 enum bpf_attach_type *attach_type) 2684 { 2685 char *type_names; 2686 int i; 2687 2688 if (!name) 2689 return -EINVAL; 2690 2691 for (i = 0; i < ARRAY_SIZE(section_names); i++) { 2692 if (strncmp(name, section_names[i].sec, section_names[i].len)) 2693 continue; 2694 if (!section_names[i].is_attachable) 2695 return -EINVAL; 2696 *attach_type = section_names[i].attach_type; 2697 return 0; 2698 } 2699 pr_warning("failed to guess attach type based on ELF section name '%s'\n", name); 2700 type_names = libbpf_get_type_names(true); 2701 if (type_names != NULL) { 2702 pr_info("attachable section(type) names are:%s\n", type_names); 2703 free(type_names); 2704 } 2705 2706 return -EINVAL; 2707 } 2708 2709 static int 2710 bpf_program__identify_section(struct bpf_program *prog, 2711 enum bpf_prog_type *prog_type, 2712 enum bpf_attach_type *expected_attach_type) 2713 { 2714 return libbpf_prog_type_by_name(prog->section_name, prog_type, 2715 expected_attach_type); 2716 } 2717 2718 int bpf_map__fd(struct bpf_map *map) 2719 { 2720 return map ? map->fd : -EINVAL; 2721 } 2722 2723 const struct bpf_map_def *bpf_map__def(struct bpf_map *map) 2724 { 2725 return map ? &map->def : ERR_PTR(-EINVAL); 2726 } 2727 2728 const char *bpf_map__name(struct bpf_map *map) 2729 { 2730 return map ? map->name : NULL; 2731 } 2732 2733 __u32 bpf_map__btf_key_type_id(const struct bpf_map *map) 2734 { 2735 return map ? map->btf_key_type_id : 0; 2736 } 2737 2738 __u32 bpf_map__btf_value_type_id(const struct bpf_map *map) 2739 { 2740 return map ? map->btf_value_type_id : 0; 2741 } 2742 2743 int bpf_map__set_priv(struct bpf_map *map, void *priv, 2744 bpf_map_clear_priv_t clear_priv) 2745 { 2746 if (!map) 2747 return -EINVAL; 2748 2749 if (map->priv) { 2750 if (map->clear_priv) 2751 map->clear_priv(map, map->priv); 2752 } 2753 2754 map->priv = priv; 2755 map->clear_priv = clear_priv; 2756 return 0; 2757 } 2758 2759 void *bpf_map__priv(struct bpf_map *map) 2760 { 2761 return map ? map->priv : ERR_PTR(-EINVAL); 2762 } 2763 2764 bool bpf_map__is_offload_neutral(struct bpf_map *map) 2765 { 2766 return map->def.type == BPF_MAP_TYPE_PERF_EVENT_ARRAY; 2767 } 2768 2769 void bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex) 2770 { 2771 map->map_ifindex = ifindex; 2772 } 2773 2774 int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd) 2775 { 2776 if (!bpf_map_type__is_map_in_map(map->def.type)) { 2777 pr_warning("error: unsupported map type\n"); 2778 return -EINVAL; 2779 } 2780 if (map->inner_map_fd != -1) { 2781 pr_warning("error: inner_map_fd already specified\n"); 2782 return -EINVAL; 2783 } 2784 map->inner_map_fd = fd; 2785 return 0; 2786 } 2787 2788 static struct bpf_map * 2789 __bpf_map__iter(struct bpf_map *m, struct bpf_object *obj, int i) 2790 { 2791 ssize_t idx; 2792 struct bpf_map *s, *e; 2793 2794 if (!obj || !obj->maps) 2795 return NULL; 2796 2797 s = obj->maps; 2798 e = obj->maps + obj->nr_maps; 2799 2800 if ((m < s) || (m >= e)) { 2801 pr_warning("error in %s: map handler doesn't belong to object\n", 2802 __func__); 2803 return NULL; 2804 } 2805 2806 idx = (m - obj->maps) + i; 2807 if (idx >= obj->nr_maps || idx < 0) 2808 return NULL; 2809 return &obj->maps[idx]; 2810 } 2811 2812 struct bpf_map * 2813 bpf_map__next(struct bpf_map *prev, struct bpf_object *obj) 2814 { 2815 if (prev == NULL) 2816 return obj->maps; 2817 2818 return __bpf_map__iter(prev, obj, 1); 2819 } 2820 2821 struct bpf_map * 2822 bpf_map__prev(struct bpf_map *next, struct bpf_object *obj) 2823 { 2824 if (next == NULL) { 2825 if (!obj->nr_maps) 2826 return NULL; 2827 return obj->maps + obj->nr_maps - 1; 2828 } 2829 2830 return __bpf_map__iter(next, obj, -1); 2831 } 2832 2833 struct bpf_map * 2834 bpf_object__find_map_by_name(struct bpf_object *obj, const char *name) 2835 { 2836 struct bpf_map *pos; 2837 2838 bpf_map__for_each(pos, obj) { 2839 if (pos->name && !strcmp(pos->name, name)) 2840 return pos; 2841 } 2842 return NULL; 2843 } 2844 2845 int 2846 bpf_object__find_map_fd_by_name(struct bpf_object *obj, const char *name) 2847 { 2848 return bpf_map__fd(bpf_object__find_map_by_name(obj, name)); 2849 } 2850 2851 struct bpf_map * 2852 bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset) 2853 { 2854 int i; 2855 2856 for (i = 0; i < obj->nr_maps; i++) { 2857 if (obj->maps[i].offset == offset) 2858 return &obj->maps[i]; 2859 } 2860 return ERR_PTR(-ENOENT); 2861 } 2862 2863 long libbpf_get_error(const void *ptr) 2864 { 2865 if (IS_ERR(ptr)) 2866 return PTR_ERR(ptr); 2867 return 0; 2868 } 2869 2870 int bpf_prog_load(const char *file, enum bpf_prog_type type, 2871 struct bpf_object **pobj, int *prog_fd) 2872 { 2873 struct bpf_prog_load_attr attr; 2874 2875 memset(&attr, 0, sizeof(struct bpf_prog_load_attr)); 2876 attr.file = file; 2877 attr.prog_type = type; 2878 attr.expected_attach_type = 0; 2879 2880 return bpf_prog_load_xattr(&attr, pobj, prog_fd); 2881 } 2882 2883 int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, 2884 struct bpf_object **pobj, int *prog_fd) 2885 { 2886 struct bpf_object_open_attr open_attr = { 2887 .file = attr->file, 2888 .prog_type = attr->prog_type, 2889 }; 2890 struct bpf_program *prog, *first_prog = NULL; 2891 enum bpf_attach_type expected_attach_type; 2892 enum bpf_prog_type prog_type; 2893 struct bpf_object *obj; 2894 struct bpf_map *map; 2895 int err; 2896 2897 if (!attr) 2898 return -EINVAL; 2899 if (!attr->file) 2900 return -EINVAL; 2901 2902 obj = bpf_object__open_xattr(&open_attr); 2903 if (IS_ERR_OR_NULL(obj)) 2904 return -ENOENT; 2905 2906 bpf_object__for_each_program(prog, obj) { 2907 /* 2908 * If type is not specified, try to guess it based on 2909 * section name. 2910 */ 2911 prog_type = attr->prog_type; 2912 prog->prog_ifindex = attr->ifindex; 2913 expected_attach_type = attr->expected_attach_type; 2914 if (prog_type == BPF_PROG_TYPE_UNSPEC) { 2915 err = bpf_program__identify_section(prog, &prog_type, 2916 &expected_attach_type); 2917 if (err < 0) { 2918 bpf_object__close(obj); 2919 return -EINVAL; 2920 } 2921 } 2922 2923 bpf_program__set_type(prog, prog_type); 2924 bpf_program__set_expected_attach_type(prog, 2925 expected_attach_type); 2926 2927 if (!first_prog) 2928 first_prog = prog; 2929 } 2930 2931 bpf_map__for_each(map, obj) { 2932 if (!bpf_map__is_offload_neutral(map)) 2933 map->map_ifindex = attr->ifindex; 2934 } 2935 2936 if (!first_prog) { 2937 pr_warning("object file doesn't contain bpf program\n"); 2938 bpf_object__close(obj); 2939 return -ENOENT; 2940 } 2941 2942 err = bpf_object__load(obj); 2943 if (err) { 2944 bpf_object__close(obj); 2945 return -EINVAL; 2946 } 2947 2948 *pobj = obj; 2949 *prog_fd = bpf_program__fd(first_prog); 2950 return 0; 2951 } 2952 2953 enum bpf_perf_event_ret 2954 bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size, 2955 void **copy_mem, size_t *copy_size, 2956 bpf_perf_event_print_t fn, void *private_data) 2957 { 2958 struct perf_event_mmap_page *header = mmap_mem; 2959 __u64 data_head = ring_buffer_read_head(header); 2960 __u64 data_tail = header->data_tail; 2961 void *base = ((__u8 *)header) + page_size; 2962 int ret = LIBBPF_PERF_EVENT_CONT; 2963 struct perf_event_header *ehdr; 2964 size_t ehdr_size; 2965 2966 while (data_head != data_tail) { 2967 ehdr = base + (data_tail & (mmap_size - 1)); 2968 ehdr_size = ehdr->size; 2969 2970 if (((void *)ehdr) + ehdr_size > base + mmap_size) { 2971 void *copy_start = ehdr; 2972 size_t len_first = base + mmap_size - copy_start; 2973 size_t len_secnd = ehdr_size - len_first; 2974 2975 if (*copy_size < ehdr_size) { 2976 free(*copy_mem); 2977 *copy_mem = malloc(ehdr_size); 2978 if (!*copy_mem) { 2979 *copy_size = 0; 2980 ret = LIBBPF_PERF_EVENT_ERROR; 2981 break; 2982 } 2983 *copy_size = ehdr_size; 2984 } 2985 2986 memcpy(*copy_mem, copy_start, len_first); 2987 memcpy(*copy_mem + len_first, base, len_secnd); 2988 ehdr = *copy_mem; 2989 } 2990 2991 ret = fn(ehdr, private_data); 2992 data_tail += ehdr_size; 2993 if (ret != LIBBPF_PERF_EVENT_CONT) 2994 break; 2995 } 2996 2997 ring_buffer_write_tail(header, data_tail); 2998 return ret; 2999 } 3000