diff options
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 7 | ||||
| -rw-r--r-- | tools/perf/arch/s390/util/Build | 2 | ||||
| -rw-r--r-- | tools/perf/arch/s390/util/machine.c | 19 | ||||
| -rw-r--r-- | tools/perf/util/machine.c | 8 | ||||
| -rw-r--r-- | tools/perf/util/machine.h | 1 |
5 files changed, 36 insertions, 1 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 32e6b6bc6f7d..b699aea9a025 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c | |||
| @@ -37,6 +37,10 @@ | |||
| 37 | #include "libbpf.h" | 37 | #include "libbpf.h" |
| 38 | #include "bpf.h" | 38 | #include "bpf.h" |
| 39 | 39 | ||
| 40 | #ifndef EM_BPF | ||
| 41 | #define EM_BPF 247 | ||
| 42 | #endif | ||
| 43 | |||
| 40 | #define __printf(a, b) __attribute__((format(printf, a, b))) | 44 | #define __printf(a, b) __attribute__((format(printf, a, b))) |
| 41 | 45 | ||
| 42 | __printf(1, 2) | 46 | __printf(1, 2) |
| @@ -439,7 +443,8 @@ static int bpf_object__elf_init(struct bpf_object *obj) | |||
| 439 | } | 443 | } |
| 440 | ep = &obj->efile.ehdr; | 444 | ep = &obj->efile.ehdr; |
| 441 | 445 | ||
| 442 | if ((ep->e_type != ET_REL) || (ep->e_machine != 0)) { | 446 | /* Old LLVM set e_machine to EM_NONE */ |
| 447 | if ((ep->e_type != ET_REL) || (ep->e_machine && (ep->e_machine != EM_BPF))) { | ||
| 443 | pr_warning("%s is not an eBPF object file\n", | 448 | pr_warning("%s is not an eBPF object file\n", |
| 444 | obj->path); | 449 | obj->path); |
| 445 | err = -LIBBPF_ERRNO__FORMAT; | 450 | err = -LIBBPF_ERRNO__FORMAT; |
diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build index 8a61372bb47a..5bd7b9260cc0 100644 --- a/tools/perf/arch/s390/util/Build +++ b/tools/perf/arch/s390/util/Build | |||
| @@ -2,3 +2,5 @@ libperf-y += header.o | |||
| 2 | libperf-y += kvm-stat.o | 2 | libperf-y += kvm-stat.o |
| 3 | 3 | ||
| 4 | libperf-$(CONFIG_DWARF) += dwarf-regs.o | 4 | libperf-$(CONFIG_DWARF) += dwarf-regs.o |
| 5 | |||
| 6 | libperf-y += machine.o | ||
diff --git a/tools/perf/arch/s390/util/machine.c b/tools/perf/arch/s390/util/machine.c new file mode 100644 index 000000000000..b9a95a1a8e69 --- /dev/null +++ b/tools/perf/arch/s390/util/machine.c | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | #include <unistd.h> | ||
| 2 | #include <stdio.h> | ||
| 3 | #include <string.h> | ||
| 4 | #include "util.h" | ||
| 5 | #include "machine.h" | ||
| 6 | #include "api/fs/fs.h" | ||
| 7 | |||
| 8 | int arch__fix_module_text_start(u64 *start, const char *name) | ||
| 9 | { | ||
| 10 | char path[PATH_MAX]; | ||
| 11 | |||
| 12 | snprintf(path, PATH_MAX, "module/%.*s/sections/.text", | ||
| 13 | (int)strlen(name) - 2, name + 1); | ||
| 14 | |||
| 15 | if (sysfs__read_ull(path, (unsigned long long *)start) < 0) | ||
| 16 | return -1; | ||
| 17 | |||
| 18 | return 0; | ||
| 19 | } | ||
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index bc2cdbd09a25..cb6388dbdd98 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
| @@ -1093,12 +1093,20 @@ static int machine__set_modules_path(struct machine *machine) | |||
| 1093 | 1093 | ||
| 1094 | return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); | 1094 | return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); |
| 1095 | } | 1095 | } |
| 1096 | int __weak arch__fix_module_text_start(u64 *start __maybe_unused, | ||
| 1097 | const char *name __maybe_unused) | ||
| 1098 | { | ||
| 1099 | return 0; | ||
| 1100 | } | ||
| 1096 | 1101 | ||
| 1097 | static int machine__create_module(void *arg, const char *name, u64 start) | 1102 | static int machine__create_module(void *arg, const char *name, u64 start) |
| 1098 | { | 1103 | { |
| 1099 | struct machine *machine = arg; | 1104 | struct machine *machine = arg; |
| 1100 | struct map *map; | 1105 | struct map *map; |
| 1101 | 1106 | ||
| 1107 | if (arch__fix_module_text_start(&start, name) < 0) | ||
| 1108 | return -1; | ||
| 1109 | |||
| 1102 | map = machine__findnew_module_map(machine, start, name); | 1110 | map = machine__findnew_module_map(machine, start, name); |
| 1103 | if (map == NULL) | 1111 | if (map == NULL) |
| 1104 | return -1; | 1112 | return -1; |
diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h index 41ac9cfd416b..20739f746bc4 100644 --- a/tools/perf/util/machine.h +++ b/tools/perf/util/machine.h | |||
| @@ -216,6 +216,7 @@ struct symbol *machine__find_kernel_function_by_name(struct machine *machine, | |||
| 216 | 216 | ||
| 217 | struct map *machine__findnew_module_map(struct machine *machine, u64 start, | 217 | struct map *machine__findnew_module_map(struct machine *machine, u64 start, |
| 218 | const char *filename); | 218 | const char *filename); |
| 219 | int arch__fix_module_text_start(u64 *start, const char *name); | ||
| 219 | 220 | ||
| 220 | int __machine__load_kallsyms(struct machine *machine, const char *filename, | 221 | int __machine__load_kallsyms(struct machine *machine, const char *filename, |
| 221 | enum map_type type, bool no_kcore, symbol_filter_t filter); | 222 | enum map_type type, bool no_kcore, symbol_filter_t filter); |
