Lines Matching refs:obj

157 	struct bpf_object *obj;  member
272 bpf_object__add_program(struct bpf_object *obj, void *data, size_t size, in bpf_object__add_program() argument
282 progs = obj->programs; in bpf_object__add_program()
283 nr_progs = obj->nr_programs; in bpf_object__add_program()
299 obj->programs = progs; in bpf_object__add_program()
300 obj->nr_programs = nr_progs + 1; in bpf_object__add_program()
301 prog.obj = obj; in bpf_object__add_program()
310 struct bpf_object *obj; in bpf_object__new() local
312 obj = calloc(1, sizeof(struct bpf_object) + strlen(path) + 1); in bpf_object__new()
313 if (!obj) { in bpf_object__new()
318 strcpy(obj->path, path); in bpf_object__new()
319 obj->efile.fd = -1; in bpf_object__new()
327 obj->efile.obj_buf = obj_buf; in bpf_object__new()
328 obj->efile.obj_buf_sz = obj_buf_sz; in bpf_object__new()
330 obj->loaded = false; in bpf_object__new()
332 INIT_LIST_HEAD(&obj->list); in bpf_object__new()
333 list_add(&obj->list, &bpf_objects_list); in bpf_object__new()
334 return obj; in bpf_object__new()
337 static void bpf_object__elf_finish(struct bpf_object *obj) in bpf_object__elf_finish() argument
339 if (!obj_elf_valid(obj)) in bpf_object__elf_finish()
342 if (obj->efile.elf) { in bpf_object__elf_finish()
343 elf_end(obj->efile.elf); in bpf_object__elf_finish()
344 obj->efile.elf = NULL; in bpf_object__elf_finish()
346 obj->efile.symbols = NULL; in bpf_object__elf_finish()
348 zfree(&obj->efile.reloc); in bpf_object__elf_finish()
349 obj->efile.nr_reloc = 0; in bpf_object__elf_finish()
350 zclose(obj->efile.fd); in bpf_object__elf_finish()
351 obj->efile.obj_buf = NULL; in bpf_object__elf_finish()
352 obj->efile.obj_buf_sz = 0; in bpf_object__elf_finish()
355 static int bpf_object__elf_init(struct bpf_object *obj) in bpf_object__elf_init() argument
360 if (obj_elf_valid(obj)) { in bpf_object__elf_init()
365 if (obj->efile.obj_buf_sz > 0) { in bpf_object__elf_init()
370 obj->efile.elf = elf_memory(obj->efile.obj_buf, in bpf_object__elf_init()
371 obj->efile.obj_buf_sz); in bpf_object__elf_init()
373 obj->efile.fd = open(obj->path, O_RDONLY); in bpf_object__elf_init()
374 if (obj->efile.fd < 0) { in bpf_object__elf_init()
375 pr_warning("failed to open %s: %s\n", obj->path, in bpf_object__elf_init()
380 obj->efile.elf = elf_begin(obj->efile.fd, in bpf_object__elf_init()
385 if (!obj->efile.elf) { in bpf_object__elf_init()
387 obj->path); in bpf_object__elf_init()
392 if (!gelf_getehdr(obj->efile.elf, &obj->efile.ehdr)) { in bpf_object__elf_init()
394 obj->path); in bpf_object__elf_init()
398 ep = &obj->efile.ehdr; in bpf_object__elf_init()
402 obj->path); in bpf_object__elf_init()
409 bpf_object__elf_finish(obj); in bpf_object__elf_init()
414 bpf_object__check_endianness(struct bpf_object *obj) in bpf_object__check_endianness() argument
418 switch (obj->efile.ehdr.e_ident[EI_DATA]) { in bpf_object__check_endianness()
442 bpf_object__init_license(struct bpf_object *obj, in bpf_object__init_license() argument
445 memcpy(obj->license, data, in bpf_object__init_license()
446 min(size, sizeof(obj->license) - 1)); in bpf_object__init_license()
447 pr_debug("license of %s is %s\n", obj->path, obj->license); in bpf_object__init_license()
452 bpf_object__init_kversion(struct bpf_object *obj, in bpf_object__init_kversion() argument
458 pr_warning("invalid kver section in %s\n", obj->path); in bpf_object__init_kversion()
462 obj->kern_version = kver; in bpf_object__init_kversion()
463 pr_debug("kernel version of %s is %x\n", obj->path, in bpf_object__init_kversion()
464 obj->kern_version); in bpf_object__init_kversion()
469 bpf_object__init_maps(struct bpf_object *obj, void *data, in bpf_object__init_maps() argument
474 obj->path); in bpf_object__init_maps()
478 obj->maps_buf = malloc(size); in bpf_object__init_maps()
479 if (!obj->maps_buf) { in bpf_object__init_maps()
480 pr_warning("malloc maps failed: %s\n", obj->path); in bpf_object__init_maps()
484 obj->maps_buf_sz = size; in bpf_object__init_maps()
485 memcpy(obj->maps_buf, data, size); in bpf_object__init_maps()
486 pr_debug("maps in %s: %ld bytes\n", obj->path, (long)size); in bpf_object__init_maps()
490 static int bpf_object__elf_collect(struct bpf_object *obj) in bpf_object__elf_collect() argument
492 Elf *elf = obj->efile.elf; in bpf_object__elf_collect()
493 GElf_Ehdr *ep = &obj->efile.ehdr; in bpf_object__elf_collect()
500 obj->path); in bpf_object__elf_collect()
512 obj->path); in bpf_object__elf_collect()
520 obj->path); in bpf_object__elf_collect()
528 name, obj->path); in bpf_object__elf_collect()
538 err = bpf_object__init_license(obj, in bpf_object__elf_collect()
542 err = bpf_object__init_kversion(obj, in bpf_object__elf_collect()
546 err = bpf_object__init_maps(obj, data->d_buf, in bpf_object__elf_collect()
549 if (obj->efile.symbols) { in bpf_object__elf_collect()
551 obj->path); in bpf_object__elf_collect()
554 obj->efile.symbols = data; in bpf_object__elf_collect()
558 err = bpf_object__add_program(obj, data->d_buf, in bpf_object__elf_collect()
565 name, obj->path, errmsg); in bpf_object__elf_collect()
568 void *reloc = obj->efile.reloc; in bpf_object__elf_collect()
569 int nr_reloc = obj->efile.nr_reloc + 1; in bpf_object__elf_collect()
572 sizeof(*obj->efile.reloc) * nr_reloc); in bpf_object__elf_collect()
579 obj->efile.reloc = reloc; in bpf_object__elf_collect()
580 obj->efile.nr_reloc = nr_reloc; in bpf_object__elf_collect()
582 obj->efile.reloc[n].shdr = sh; in bpf_object__elf_collect()
583 obj->efile.reloc[n].data = data; in bpf_object__elf_collect()
594 bpf_object__find_prog_by_idx(struct bpf_object *obj, int idx) in bpf_object__find_prog_by_idx() argument
599 for (i = 0; i < obj->nr_programs; i++) { in bpf_object__find_prog_by_idx()
600 prog = &obj->programs[i]; in bpf_object__find_prog_by_idx()
668 bpf_object__create_maps(struct bpf_object *obj) in bpf_object__create_maps() argument
674 nr_maps = obj->maps_buf_sz / sizeof(struct bpf_map_def); in bpf_object__create_maps()
675 if (!obj->maps_buf || !nr_maps) { in bpf_object__create_maps()
677 obj->path); in bpf_object__create_maps()
681 obj->map_fds = malloc(sizeof(int) * nr_maps); in bpf_object__create_maps()
682 if (!obj->map_fds) { in bpf_object__create_maps()
686 obj->nr_map_fds = nr_maps; in bpf_object__create_maps()
689 memset(obj->map_fds, -1, sizeof(int) * nr_maps); in bpf_object__create_maps()
691 pfd = obj->map_fds; in bpf_object__create_maps()
695 def = *(struct bpf_map_def *)(obj->maps_buf + in bpf_object__create_maps()
709 zclose(obj->map_fds[j]); in bpf_object__create_maps()
710 obj->nr_map_fds = 0; in bpf_object__create_maps()
711 zfree(&obj->map_fds); in bpf_object__create_maps()
718 zfree(&obj->maps_buf); in bpf_object__create_maps()
719 obj->maps_buf_sz = 0; in bpf_object__create_maps()
754 bpf_object__relocate(struct bpf_object *obj) in bpf_object__relocate() argument
760 for (i = 0; i < obj->nr_programs; i++) { in bpf_object__relocate()
761 prog = &obj->programs[i]; in bpf_object__relocate()
763 err = bpf_program__relocate(prog, obj->map_fds); in bpf_object__relocate()
773 static int bpf_object__collect_reloc(struct bpf_object *obj) in bpf_object__collect_reloc() argument
777 if (!obj_elf_valid(obj)) { in bpf_object__collect_reloc()
782 for (i = 0; i < obj->efile.nr_reloc; i++) { in bpf_object__collect_reloc()
783 GElf_Shdr *shdr = &obj->efile.reloc[i].shdr; in bpf_object__collect_reloc()
784 Elf_Data *data = obj->efile.reloc[i].data; in bpf_object__collect_reloc()
787 size_t nr_maps = obj->maps_buf_sz / in bpf_object__collect_reloc()
795 prog = bpf_object__find_prog_by_idx(obj, idx); in bpf_object__collect_reloc()
804 obj->efile.symbols); in bpf_object__collect_reloc()
879 bpf_object__load_progs(struct bpf_object *obj) in bpf_object__load_progs() argument
884 for (i = 0; i < obj->nr_programs; i++) { in bpf_object__load_progs()
885 err = bpf_program__load(&obj->programs[i], in bpf_object__load_progs()
886 obj->license, in bpf_object__load_progs()
887 obj->kern_version); in bpf_object__load_progs()
894 static int bpf_object__validate(struct bpf_object *obj) in bpf_object__validate() argument
896 if (obj->kern_version == 0) { in bpf_object__validate()
898 obj->path); in bpf_object__validate()
907 struct bpf_object *obj; in __bpf_object__open() local
915 obj = bpf_object__new(path, obj_buf, obj_buf_sz); in __bpf_object__open()
916 if (IS_ERR(obj)) in __bpf_object__open()
917 return obj; in __bpf_object__open()
919 CHECK_ERR(bpf_object__elf_init(obj), err, out); in __bpf_object__open()
920 CHECK_ERR(bpf_object__check_endianness(obj), err, out); in __bpf_object__open()
921 CHECK_ERR(bpf_object__elf_collect(obj), err, out); in __bpf_object__open()
922 CHECK_ERR(bpf_object__collect_reloc(obj), err, out); in __bpf_object__open()
923 CHECK_ERR(bpf_object__validate(obj), err, out); in __bpf_object__open()
925 bpf_object__elf_finish(obj); in __bpf_object__open()
926 return obj; in __bpf_object__open()
928 bpf_object__close(obj); in __bpf_object__open()
966 int bpf_object__unload(struct bpf_object *obj) in bpf_object__unload() argument
970 if (!obj) in bpf_object__unload()
973 for (i = 0; i < obj->nr_map_fds; i++) in bpf_object__unload()
974 zclose(obj->map_fds[i]); in bpf_object__unload()
975 zfree(&obj->map_fds); in bpf_object__unload()
976 obj->nr_map_fds = 0; in bpf_object__unload()
978 for (i = 0; i < obj->nr_programs; i++) in bpf_object__unload()
979 bpf_program__unload(&obj->programs[i]); in bpf_object__unload()
984 int bpf_object__load(struct bpf_object *obj) in bpf_object__load() argument
988 if (!obj) in bpf_object__load()
991 if (obj->loaded) { in bpf_object__load()
996 obj->loaded = true; in bpf_object__load()
998 CHECK_ERR(bpf_object__create_maps(obj), err, out); in bpf_object__load()
999 CHECK_ERR(bpf_object__relocate(obj), err, out); in bpf_object__load()
1000 CHECK_ERR(bpf_object__load_progs(obj), err, out); in bpf_object__load()
1004 bpf_object__unload(obj); in bpf_object__load()
1005 pr_warning("failed to load object '%s'\n", obj->path); in bpf_object__load()
1009 void bpf_object__close(struct bpf_object *obj) in bpf_object__close() argument
1013 if (!obj) in bpf_object__close()
1016 bpf_object__elf_finish(obj); in bpf_object__close()
1017 bpf_object__unload(obj); in bpf_object__close()
1019 zfree(&obj->maps_buf); in bpf_object__close()
1021 if (obj->programs && obj->nr_programs) { in bpf_object__close()
1022 for (i = 0; i < obj->nr_programs; i++) in bpf_object__close()
1023 bpf_program__exit(&obj->programs[i]); in bpf_object__close()
1025 zfree(&obj->programs); in bpf_object__close()
1027 list_del(&obj->list); in bpf_object__close()
1028 free(obj); in bpf_object__close()
1051 bpf_object__get_name(struct bpf_object *obj) in bpf_object__get_name() argument
1053 if (!obj) in bpf_object__get_name()
1055 return obj->path; in bpf_object__get_name()
1059 bpf_object__get_kversion(struct bpf_object *obj) in bpf_object__get_kversion() argument
1061 if (!obj) in bpf_object__get_kversion()
1063 return obj->kern_version; in bpf_object__get_kversion()
1067 bpf_program__next(struct bpf_program *prev, struct bpf_object *obj) in bpf_program__next() argument
1071 if (!obj->programs) in bpf_program__next()
1075 return &obj->programs[0]; in bpf_program__next()
1077 if (prev->obj != obj) { in bpf_program__next()
1082 idx = (prev - obj->programs) + 1; in bpf_program__next()
1083 if (idx >= obj->nr_programs) in bpf_program__next()
1085 return &obj->programs[idx]; in bpf_program__next()