Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include <dirent.h>
0003 #include <errno.h>
0004 #include <inttypes.h>
0005 #include <regex.h>
0006 #include <stdlib.h>
0007 #include "callchain.h"
0008 #include "debug.h"
0009 #include "dso.h"
0010 #include "env.h"
0011 #include "event.h"
0012 #include "evsel.h"
0013 #include "hist.h"
0014 #include "machine.h"
0015 #include "map.h"
0016 #include "map_symbol.h"
0017 #include "branch.h"
0018 #include "mem-events.h"
0019 #include "path.h"
0020 #include "srcline.h"
0021 #include "symbol.h"
0022 #include "sort.h"
0023 #include "strlist.h"
0024 #include "target.h"
0025 #include "thread.h"
0026 #include "util.h"
0027 #include "vdso.h"
0028 #include <stdbool.h>
0029 #include <sys/types.h>
0030 #include <sys/stat.h>
0031 #include <unistd.h>
0032 #include "unwind.h"
0033 #include "linux/hash.h"
0034 #include "asm/bug.h"
0035 #include "bpf-event.h"
0036 #include <internal/lib.h> // page_size
0037 #include "cgroup.h"
0038 #include "arm64-frame-pointer-unwind-support.h"
0039 
0040 #include <linux/ctype.h>
0041 #include <symbol/kallsyms.h>
0042 #include <linux/mman.h>
0043 #include <linux/string.h>
0044 #include <linux/zalloc.h>
0045 
0046 static void __machine__remove_thread(struct machine *machine, struct thread *th, bool lock);
0047 
0048 static struct dso *machine__kernel_dso(struct machine *machine)
0049 {
0050     return machine->vmlinux_map->dso;
0051 }
0052 
0053 static void dsos__init(struct dsos *dsos)
0054 {
0055     INIT_LIST_HEAD(&dsos->head);
0056     dsos->root = RB_ROOT;
0057     init_rwsem(&dsos->lock);
0058 }
0059 
0060 static void machine__threads_init(struct machine *machine)
0061 {
0062     int i;
0063 
0064     for (i = 0; i < THREADS__TABLE_SIZE; i++) {
0065         struct threads *threads = &machine->threads[i];
0066         threads->entries = RB_ROOT_CACHED;
0067         init_rwsem(&threads->lock);
0068         threads->nr = 0;
0069         INIT_LIST_HEAD(&threads->dead);
0070         threads->last_match = NULL;
0071     }
0072 }
0073 
0074 static int machine__set_mmap_name(struct machine *machine)
0075 {
0076     if (machine__is_host(machine))
0077         machine->mmap_name = strdup("[kernel.kallsyms]");
0078     else if (machine__is_default_guest(machine))
0079         machine->mmap_name = strdup("[guest.kernel.kallsyms]");
0080     else if (asprintf(&machine->mmap_name, "[guest.kernel.kallsyms.%d]",
0081               machine->pid) < 0)
0082         machine->mmap_name = NULL;
0083 
0084     return machine->mmap_name ? 0 : -ENOMEM;
0085 }
0086 
0087 static void thread__set_guest_comm(struct thread *thread, pid_t pid)
0088 {
0089     char comm[64];
0090 
0091     snprintf(comm, sizeof(comm), "[guest/%d]", pid);
0092     thread__set_comm(thread, comm, 0);
0093 }
0094 
0095 int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
0096 {
0097     int err = -ENOMEM;
0098 
0099     memset(machine, 0, sizeof(*machine));
0100     machine->kmaps = maps__new(machine);
0101     if (machine->kmaps == NULL)
0102         return -ENOMEM;
0103 
0104     RB_CLEAR_NODE(&machine->rb_node);
0105     dsos__init(&machine->dsos);
0106 
0107     machine__threads_init(machine);
0108 
0109     machine->vdso_info = NULL;
0110     machine->env = NULL;
0111 
0112     machine->pid = pid;
0113 
0114     machine->id_hdr_size = 0;
0115     machine->kptr_restrict_warned = false;
0116     machine->comm_exec = false;
0117     machine->kernel_start = 0;
0118     machine->vmlinux_map = NULL;
0119 
0120     machine->root_dir = strdup(root_dir);
0121     if (machine->root_dir == NULL)
0122         goto out;
0123 
0124     if (machine__set_mmap_name(machine))
0125         goto out;
0126 
0127     if (pid != HOST_KERNEL_ID) {
0128         struct thread *thread = machine__findnew_thread(machine, -1,
0129                                 pid);
0130 
0131         if (thread == NULL)
0132             goto out;
0133 
0134         thread__set_guest_comm(thread, pid);
0135         thread__put(thread);
0136     }
0137 
0138     machine->current_tid = NULL;
0139     err = 0;
0140 
0141 out:
0142     if (err) {
0143         zfree(&machine->kmaps);
0144         zfree(&machine->root_dir);
0145         zfree(&machine->mmap_name);
0146     }
0147     return 0;
0148 }
0149 
0150 struct machine *machine__new_host(void)
0151 {
0152     struct machine *machine = malloc(sizeof(*machine));
0153 
0154     if (machine != NULL) {
0155         machine__init(machine, "", HOST_KERNEL_ID);
0156 
0157         if (machine__create_kernel_maps(machine) < 0)
0158             goto out_delete;
0159     }
0160 
0161     return machine;
0162 out_delete:
0163     free(machine);
0164     return NULL;
0165 }
0166 
0167 struct machine *machine__new_kallsyms(void)
0168 {
0169     struct machine *machine = machine__new_host();
0170     /*
0171      * FIXME:
0172      * 1) We should switch to machine__load_kallsyms(), i.e. not explicitly
0173      *    ask for not using the kcore parsing code, once this one is fixed
0174      *    to create a map per module.
0175      */
0176     if (machine && machine__load_kallsyms(machine, "/proc/kallsyms") <= 0) {
0177         machine__delete(machine);
0178         machine = NULL;
0179     }
0180 
0181     return machine;
0182 }
0183 
0184 static void dsos__purge(struct dsos *dsos)
0185 {
0186     struct dso *pos, *n;
0187 
0188     down_write(&dsos->lock);
0189 
0190     list_for_each_entry_safe(pos, n, &dsos->head, node) {
0191         RB_CLEAR_NODE(&pos->rb_node);
0192         pos->root = NULL;
0193         list_del_init(&pos->node);
0194         dso__put(pos);
0195     }
0196 
0197     up_write(&dsos->lock);
0198 }
0199 
0200 static void dsos__exit(struct dsos *dsos)
0201 {
0202     dsos__purge(dsos);
0203     exit_rwsem(&dsos->lock);
0204 }
0205 
0206 void machine__delete_threads(struct machine *machine)
0207 {
0208     struct rb_node *nd;
0209     int i;
0210 
0211     for (i = 0; i < THREADS__TABLE_SIZE; i++) {
0212         struct threads *threads = &machine->threads[i];
0213         down_write(&threads->lock);
0214         nd = rb_first_cached(&threads->entries);
0215         while (nd) {
0216             struct thread *t = rb_entry(nd, struct thread, rb_node);
0217 
0218             nd = rb_next(nd);
0219             __machine__remove_thread(machine, t, false);
0220         }
0221         up_write(&threads->lock);
0222     }
0223 }
0224 
0225 void machine__exit(struct machine *machine)
0226 {
0227     int i;
0228 
0229     if (machine == NULL)
0230         return;
0231 
0232     machine__destroy_kernel_maps(machine);
0233     maps__delete(machine->kmaps);
0234     dsos__exit(&machine->dsos);
0235     machine__exit_vdso(machine);
0236     zfree(&machine->root_dir);
0237     zfree(&machine->mmap_name);
0238     zfree(&machine->current_tid);
0239     zfree(&machine->kallsyms_filename);
0240 
0241     for (i = 0; i < THREADS__TABLE_SIZE; i++) {
0242         struct threads *threads = &machine->threads[i];
0243         struct thread *thread, *n;
0244         /*
0245          * Forget about the dead, at this point whatever threads were
0246          * left in the dead lists better have a reference count taken
0247          * by who is using them, and then, when they drop those references
0248          * and it finally hits zero, thread__put() will check and see that
0249          * its not in the dead threads list and will not try to remove it
0250          * from there, just calling thread__delete() straight away.
0251          */
0252         list_for_each_entry_safe(thread, n, &threads->dead, node)
0253             list_del_init(&thread->node);
0254 
0255         exit_rwsem(&threads->lock);
0256     }
0257 }
0258 
0259 void machine__delete(struct machine *machine)
0260 {
0261     if (machine) {
0262         machine__exit(machine);
0263         free(machine);
0264     }
0265 }
0266 
0267 void machines__init(struct machines *machines)
0268 {
0269     machine__init(&machines->host, "", HOST_KERNEL_ID);
0270     machines->guests = RB_ROOT_CACHED;
0271 }
0272 
0273 void machines__exit(struct machines *machines)
0274 {
0275     machine__exit(&machines->host);
0276     /* XXX exit guest */
0277 }
0278 
0279 struct machine *machines__add(struct machines *machines, pid_t pid,
0280                   const char *root_dir)
0281 {
0282     struct rb_node **p = &machines->guests.rb_root.rb_node;
0283     struct rb_node *parent = NULL;
0284     struct machine *pos, *machine = malloc(sizeof(*machine));
0285     bool leftmost = true;
0286 
0287     if (machine == NULL)
0288         return NULL;
0289 
0290     if (machine__init(machine, root_dir, pid) != 0) {
0291         free(machine);
0292         return NULL;
0293     }
0294 
0295     while (*p != NULL) {
0296         parent = *p;
0297         pos = rb_entry(parent, struct machine, rb_node);
0298         if (pid < pos->pid)
0299             p = &(*p)->rb_left;
0300         else {
0301             p = &(*p)->rb_right;
0302             leftmost = false;
0303         }
0304     }
0305 
0306     rb_link_node(&machine->rb_node, parent, p);
0307     rb_insert_color_cached(&machine->rb_node, &machines->guests, leftmost);
0308 
0309     machine->machines = machines;
0310 
0311     return machine;
0312 }
0313 
0314 void machines__set_comm_exec(struct machines *machines, bool comm_exec)
0315 {
0316     struct rb_node *nd;
0317 
0318     machines->host.comm_exec = comm_exec;
0319 
0320     for (nd = rb_first_cached(&machines->guests); nd; nd = rb_next(nd)) {
0321         struct machine *machine = rb_entry(nd, struct machine, rb_node);
0322 
0323         machine->comm_exec = comm_exec;
0324     }
0325 }
0326 
0327 struct machine *machines__find(struct machines *machines, pid_t pid)
0328 {
0329     struct rb_node **p = &machines->guests.rb_root.rb_node;
0330     struct rb_node *parent = NULL;
0331     struct machine *machine;
0332     struct machine *default_machine = NULL;
0333 
0334     if (pid == HOST_KERNEL_ID)
0335         return &machines->host;
0336 
0337     while (*p != NULL) {
0338         parent = *p;
0339         machine = rb_entry(parent, struct machine, rb_node);
0340         if (pid < machine->pid)
0341             p = &(*p)->rb_left;
0342         else if (pid > machine->pid)
0343             p = &(*p)->rb_right;
0344         else
0345             return machine;
0346         if (!machine->pid)
0347             default_machine = machine;
0348     }
0349 
0350     return default_machine;
0351 }
0352 
0353 struct machine *machines__findnew(struct machines *machines, pid_t pid)
0354 {
0355     char path[PATH_MAX];
0356     const char *root_dir = "";
0357     struct machine *machine = machines__find(machines, pid);
0358 
0359     if (machine && (machine->pid == pid))
0360         goto out;
0361 
0362     if ((pid != HOST_KERNEL_ID) &&
0363         (pid != DEFAULT_GUEST_KERNEL_ID) &&
0364         (symbol_conf.guestmount)) {
0365         sprintf(path, "%s/%d", symbol_conf.guestmount, pid);
0366         if (access(path, R_OK)) {
0367             static struct strlist *seen;
0368 
0369             if (!seen)
0370                 seen = strlist__new(NULL, NULL);
0371 
0372             if (!strlist__has_entry(seen, path)) {
0373                 pr_err("Can't access file %s\n", path);
0374                 strlist__add(seen, path);
0375             }
0376             machine = NULL;
0377             goto out;
0378         }
0379         root_dir = path;
0380     }
0381 
0382     machine = machines__add(machines, pid, root_dir);
0383 out:
0384     return machine;
0385 }
0386 
0387 struct machine *machines__find_guest(struct machines *machines, pid_t pid)
0388 {
0389     struct machine *machine = machines__find(machines, pid);
0390 
0391     if (!machine)
0392         machine = machines__findnew(machines, DEFAULT_GUEST_KERNEL_ID);
0393     return machine;
0394 }
0395 
0396 /*
0397  * A common case for KVM test programs is that the test program acts as the
0398  * hypervisor, creating, running and destroying the virtual machine, and
0399  * providing the guest object code from its own object code. In this case,
0400  * the VM is not running an OS, but only the functions loaded into it by the
0401  * hypervisor test program, and conveniently, loaded at the same virtual
0402  * addresses.
0403  *
0404  * Normally to resolve addresses, MMAP events are needed to map addresses
0405  * back to the object code and debug symbols for that object code.
0406  *
0407  * Currently, there is no way to get such mapping information from guests
0408  * but, in the scenario described above, the guest has the same mappings
0409  * as the hypervisor, so support for that scenario can be achieved.
0410  *
0411  * To support that, copy the host thread's maps to the guest thread's maps.
0412  * Note, we do not discover the guest until we encounter a guest event,
0413  * which works well because it is not until then that we know that the host
0414  * thread's maps have been set up.
0415  *
0416  * This function returns the guest thread. Apart from keeping the data
0417  * structures sane, using a thread belonging to the guest machine, instead
0418  * of the host thread, allows it to have its own comm (refer
0419  * thread__set_guest_comm()).
0420  */
0421 static struct thread *findnew_guest_code(struct machine *machine,
0422                      struct machine *host_machine,
0423                      pid_t pid)
0424 {
0425     struct thread *host_thread;
0426     struct thread *thread;
0427     int err;
0428 
0429     if (!machine)
0430         return NULL;
0431 
0432     thread = machine__findnew_thread(machine, -1, pid);
0433     if (!thread)
0434         return NULL;
0435 
0436     /* Assume maps are set up if there are any */
0437     if (thread->maps->nr_maps)
0438         return thread;
0439 
0440     host_thread = machine__find_thread(host_machine, -1, pid);
0441     if (!host_thread)
0442         goto out_err;
0443 
0444     thread__set_guest_comm(thread, pid);
0445 
0446     /*
0447      * Guest code can be found in hypervisor process at the same address
0448      * so copy host maps.
0449      */
0450     err = maps__clone(thread, host_thread->maps);
0451     thread__put(host_thread);
0452     if (err)
0453         goto out_err;
0454 
0455     return thread;
0456 
0457 out_err:
0458     thread__zput(thread);
0459     return NULL;
0460 }
0461 
0462 struct thread *machines__findnew_guest_code(struct machines *machines, pid_t pid)
0463 {
0464     struct machine *host_machine = machines__find(machines, HOST_KERNEL_ID);
0465     struct machine *machine = machines__findnew(machines, pid);
0466 
0467     return findnew_guest_code(machine, host_machine, pid);
0468 }
0469 
0470 struct thread *machine__findnew_guest_code(struct machine *machine, pid_t pid)
0471 {
0472     struct machines *machines = machine->machines;
0473     struct machine *host_machine;
0474 
0475     if (!machines)
0476         return NULL;
0477 
0478     host_machine = machines__find(machines, HOST_KERNEL_ID);
0479 
0480     return findnew_guest_code(machine, host_machine, pid);
0481 }
0482 
0483 void machines__process_guests(struct machines *machines,
0484                   machine__process_t process, void *data)
0485 {
0486     struct rb_node *nd;
0487 
0488     for (nd = rb_first_cached(&machines->guests); nd; nd = rb_next(nd)) {
0489         struct machine *pos = rb_entry(nd, struct machine, rb_node);
0490         process(pos, data);
0491     }
0492 }
0493 
0494 void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size)
0495 {
0496     struct rb_node *node;
0497     struct machine *machine;
0498 
0499     machines->host.id_hdr_size = id_hdr_size;
0500 
0501     for (node = rb_first_cached(&machines->guests); node;
0502          node = rb_next(node)) {
0503         machine = rb_entry(node, struct machine, rb_node);
0504         machine->id_hdr_size = id_hdr_size;
0505     }
0506 
0507     return;
0508 }
0509 
0510 static void machine__update_thread_pid(struct machine *machine,
0511                        struct thread *th, pid_t pid)
0512 {
0513     struct thread *leader;
0514 
0515     if (pid == th->pid_ || pid == -1 || th->pid_ != -1)
0516         return;
0517 
0518     th->pid_ = pid;
0519 
0520     if (th->pid_ == th->tid)
0521         return;
0522 
0523     leader = __machine__findnew_thread(machine, th->pid_, th->pid_);
0524     if (!leader)
0525         goto out_err;
0526 
0527     if (!leader->maps)
0528         leader->maps = maps__new(machine);
0529 
0530     if (!leader->maps)
0531         goto out_err;
0532 
0533     if (th->maps == leader->maps)
0534         return;
0535 
0536     if (th->maps) {
0537         /*
0538          * Maps are created from MMAP events which provide the pid and
0539          * tid.  Consequently there never should be any maps on a thread
0540          * with an unknown pid.  Just print an error if there are.
0541          */
0542         if (!maps__empty(th->maps))
0543             pr_err("Discarding thread maps for %d:%d\n",
0544                    th->pid_, th->tid);
0545         maps__put(th->maps);
0546     }
0547 
0548     th->maps = maps__get(leader->maps);
0549 out_put:
0550     thread__put(leader);
0551     return;
0552 out_err:
0553     pr_err("Failed to join map groups for %d:%d\n", th->pid_, th->tid);
0554     goto out_put;
0555 }
0556 
0557 /*
0558  * Front-end cache - TID lookups come in blocks,
0559  * so most of the time we dont have to look up
0560  * the full rbtree:
0561  */
0562 static struct thread*
0563 __threads__get_last_match(struct threads *threads, struct machine *machine,
0564               int pid, int tid)
0565 {
0566     struct thread *th;
0567 
0568     th = threads->last_match;
0569     if (th != NULL) {
0570         if (th->tid == tid) {
0571             machine__update_thread_pid(machine, th, pid);
0572             return thread__get(th);
0573         }
0574 
0575         threads->last_match = NULL;
0576     }
0577 
0578     return NULL;
0579 }
0580 
0581 static struct thread*
0582 threads__get_last_match(struct threads *threads, struct machine *machine,
0583             int pid, int tid)
0584 {
0585     struct thread *th = NULL;
0586 
0587     if (perf_singlethreaded)
0588         th = __threads__get_last_match(threads, machine, pid, tid);
0589 
0590     return th;
0591 }
0592 
0593 static void
0594 __threads__set_last_match(struct threads *threads, struct thread *th)
0595 {
0596     threads->last_match = th;
0597 }
0598 
0599 static void
0600 threads__set_last_match(struct threads *threads, struct thread *th)
0601 {
0602     if (perf_singlethreaded)
0603         __threads__set_last_match(threads, th);
0604 }
0605 
0606 /*
0607  * Caller must eventually drop thread->refcnt returned with a successful
0608  * lookup/new thread inserted.
0609  */
0610 static struct thread *____machine__findnew_thread(struct machine *machine,
0611                           struct threads *threads,
0612                           pid_t pid, pid_t tid,
0613                           bool create)
0614 {
0615     struct rb_node **p = &threads->entries.rb_root.rb_node;
0616     struct rb_node *parent = NULL;
0617     struct thread *th;
0618     bool leftmost = true;
0619 
0620     th = threads__get_last_match(threads, machine, pid, tid);
0621     if (th)
0622         return th;
0623 
0624     while (*p != NULL) {
0625         parent = *p;
0626         th = rb_entry(parent, struct thread, rb_node);
0627 
0628         if (th->tid == tid) {
0629             threads__set_last_match(threads, th);
0630             machine__update_thread_pid(machine, th, pid);
0631             return thread__get(th);
0632         }
0633 
0634         if (tid < th->tid)
0635             p = &(*p)->rb_left;
0636         else {
0637             p = &(*p)->rb_right;
0638             leftmost = false;
0639         }
0640     }
0641 
0642     if (!create)
0643         return NULL;
0644 
0645     th = thread__new(pid, tid);
0646     if (th != NULL) {
0647         rb_link_node(&th->rb_node, parent, p);
0648         rb_insert_color_cached(&th->rb_node, &threads->entries, leftmost);
0649 
0650         /*
0651          * We have to initialize maps separately after rb tree is updated.
0652          *
0653          * The reason is that we call machine__findnew_thread
0654          * within thread__init_maps to find the thread
0655          * leader and that would screwed the rb tree.
0656          */
0657         if (thread__init_maps(th, machine)) {
0658             rb_erase_cached(&th->rb_node, &threads->entries);
0659             RB_CLEAR_NODE(&th->rb_node);
0660             thread__put(th);
0661             return NULL;
0662         }
0663         /*
0664          * It is now in the rbtree, get a ref
0665          */
0666         thread__get(th);
0667         threads__set_last_match(threads, th);
0668         ++threads->nr;
0669     }
0670 
0671     return th;
0672 }
0673 
0674 struct thread *__machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid)
0675 {
0676     return ____machine__findnew_thread(machine, machine__threads(machine, tid), pid, tid, true);
0677 }
0678 
0679 struct thread *machine__findnew_thread(struct machine *machine, pid_t pid,
0680                        pid_t tid)
0681 {
0682     struct threads *threads = machine__threads(machine, tid);
0683     struct thread *th;
0684 
0685     down_write(&threads->lock);
0686     th = __machine__findnew_thread(machine, pid, tid);
0687     up_write(&threads->lock);
0688     return th;
0689 }
0690 
0691 struct thread *machine__find_thread(struct machine *machine, pid_t pid,
0692                     pid_t tid)
0693 {
0694     struct threads *threads = machine__threads(machine, tid);
0695     struct thread *th;
0696 
0697     down_read(&threads->lock);
0698     th =  ____machine__findnew_thread(machine, threads, pid, tid, false);
0699     up_read(&threads->lock);
0700     return th;
0701 }
0702 
0703 /*
0704  * Threads are identified by pid and tid, and the idle task has pid == tid == 0.
0705  * So here a single thread is created for that, but actually there is a separate
0706  * idle task per cpu, so there should be one 'struct thread' per cpu, but there
0707  * is only 1. That causes problems for some tools, requiring workarounds. For
0708  * example get_idle_thread() in builtin-sched.c, or thread_stack__per_cpu().
0709  */
0710 struct thread *machine__idle_thread(struct machine *machine)
0711 {
0712     struct thread *thread = machine__findnew_thread(machine, 0, 0);
0713 
0714     if (!thread || thread__set_comm(thread, "swapper", 0) ||
0715         thread__set_namespaces(thread, 0, NULL))
0716         pr_err("problem inserting idle task for machine pid %d\n", machine->pid);
0717 
0718     return thread;
0719 }
0720 
0721 struct comm *machine__thread_exec_comm(struct machine *machine,
0722                        struct thread *thread)
0723 {
0724     if (machine->comm_exec)
0725         return thread__exec_comm(thread);
0726     else
0727         return thread__comm(thread);
0728 }
0729 
0730 int machine__process_comm_event(struct machine *machine, union perf_event *event,
0731                 struct perf_sample *sample)
0732 {
0733     struct thread *thread = machine__findnew_thread(machine,
0734                             event->comm.pid,
0735                             event->comm.tid);
0736     bool exec = event->header.misc & PERF_RECORD_MISC_COMM_EXEC;
0737     int err = 0;
0738 
0739     if (exec)
0740         machine->comm_exec = true;
0741 
0742     if (dump_trace)
0743         perf_event__fprintf_comm(event, stdout);
0744 
0745     if (thread == NULL ||
0746         __thread__set_comm(thread, event->comm.comm, sample->time, exec)) {
0747         dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n");
0748         err = -1;
0749     }
0750 
0751     thread__put(thread);
0752 
0753     return err;
0754 }
0755 
0756 int machine__process_namespaces_event(struct machine *machine __maybe_unused,
0757                       union perf_event *event,
0758                       struct perf_sample *sample __maybe_unused)
0759 {
0760     struct thread *thread = machine__findnew_thread(machine,
0761                             event->namespaces.pid,
0762                             event->namespaces.tid);
0763     int err = 0;
0764 
0765     WARN_ONCE(event->namespaces.nr_namespaces > NR_NAMESPACES,
0766           "\nWARNING: kernel seems to support more namespaces than perf"
0767           " tool.\nTry updating the perf tool..\n\n");
0768 
0769     WARN_ONCE(event->namespaces.nr_namespaces < NR_NAMESPACES,
0770           "\nWARNING: perf tool seems to support more namespaces than"
0771           " the kernel.\nTry updating the kernel..\n\n");
0772 
0773     if (dump_trace)
0774         perf_event__fprintf_namespaces(event, stdout);
0775 
0776     if (thread == NULL ||
0777         thread__set_namespaces(thread, sample->time, &event->namespaces)) {
0778         dump_printf("problem processing PERF_RECORD_NAMESPACES, skipping event.\n");
0779         err = -1;
0780     }
0781 
0782     thread__put(thread);
0783 
0784     return err;
0785 }
0786 
0787 int machine__process_cgroup_event(struct machine *machine,
0788                   union perf_event *event,
0789                   struct perf_sample *sample __maybe_unused)
0790 {
0791     struct cgroup *cgrp;
0792 
0793     if (dump_trace)
0794         perf_event__fprintf_cgroup(event, stdout);
0795 
0796     cgrp = cgroup__findnew(machine->env, event->cgroup.id, event->cgroup.path);
0797     if (cgrp == NULL)
0798         return -ENOMEM;
0799 
0800     return 0;
0801 }
0802 
0803 int machine__process_lost_event(struct machine *machine __maybe_unused,
0804                 union perf_event *event, struct perf_sample *sample __maybe_unused)
0805 {
0806     dump_printf(": id:%" PRI_lu64 ": lost:%" PRI_lu64 "\n",
0807             event->lost.id, event->lost.lost);
0808     return 0;
0809 }
0810 
0811 int machine__process_lost_samples_event(struct machine *machine __maybe_unused,
0812                     union perf_event *event, struct perf_sample *sample)
0813 {
0814     dump_printf(": id:%" PRIu64 ": lost samples :%" PRI_lu64 "\n",
0815             sample->id, event->lost_samples.lost);
0816     return 0;
0817 }
0818 
0819 static struct dso *machine__findnew_module_dso(struct machine *machine,
0820                            struct kmod_path *m,
0821                            const char *filename)
0822 {
0823     struct dso *dso;
0824 
0825     down_write(&machine->dsos.lock);
0826 
0827     dso = __dsos__find(&machine->dsos, m->name, true);
0828     if (!dso) {
0829         dso = __dsos__addnew(&machine->dsos, m->name);
0830         if (dso == NULL)
0831             goto out_unlock;
0832 
0833         dso__set_module_info(dso, m, machine);
0834         dso__set_long_name(dso, strdup(filename), true);
0835         dso->kernel = DSO_SPACE__KERNEL;
0836     }
0837 
0838     dso__get(dso);
0839 out_unlock:
0840     up_write(&machine->dsos.lock);
0841     return dso;
0842 }
0843 
0844 int machine__process_aux_event(struct machine *machine __maybe_unused,
0845                    union perf_event *event)
0846 {
0847     if (dump_trace)
0848         perf_event__fprintf_aux(event, stdout);
0849     return 0;
0850 }
0851 
0852 int machine__process_itrace_start_event(struct machine *machine __maybe_unused,
0853                     union perf_event *event)
0854 {
0855     if (dump_trace)
0856         perf_event__fprintf_itrace_start(event, stdout);
0857     return 0;
0858 }
0859 
0860 int machine__process_aux_output_hw_id_event(struct machine *machine __maybe_unused,
0861                         union perf_event *event)
0862 {
0863     if (dump_trace)
0864         perf_event__fprintf_aux_output_hw_id(event, stdout);
0865     return 0;
0866 }
0867 
0868 int machine__process_switch_event(struct machine *machine __maybe_unused,
0869                   union perf_event *event)
0870 {
0871     if (dump_trace)
0872         perf_event__fprintf_switch(event, stdout);
0873     return 0;
0874 }
0875 
0876 static int machine__process_ksymbol_register(struct machine *machine,
0877                          union perf_event *event,
0878                          struct perf_sample *sample __maybe_unused)
0879 {
0880     struct symbol *sym;
0881     struct map *map = maps__find(machine__kernel_maps(machine), event->ksymbol.addr);
0882 
0883     if (!map) {
0884         struct dso *dso = dso__new(event->ksymbol.name);
0885 
0886         if (dso) {
0887             dso->kernel = DSO_SPACE__KERNEL;
0888             map = map__new2(0, dso);
0889             dso__put(dso);
0890         }
0891 
0892         if (!dso || !map) {
0893             return -ENOMEM;
0894         }
0895 
0896         if (event->ksymbol.ksym_type == PERF_RECORD_KSYMBOL_TYPE_OOL) {
0897             map->dso->binary_type = DSO_BINARY_TYPE__OOL;
0898             map->dso->data.file_size = event->ksymbol.len;
0899             dso__set_loaded(map->dso);
0900         }
0901 
0902         map->start = event->ksymbol.addr;
0903         map->end = map->start + event->ksymbol.len;
0904         maps__insert(machine__kernel_maps(machine), map);
0905         map__put(map);
0906         dso__set_loaded(dso);
0907 
0908         if (is_bpf_image(event->ksymbol.name)) {
0909             dso->binary_type = DSO_BINARY_TYPE__BPF_IMAGE;
0910             dso__set_long_name(dso, "", false);
0911         }
0912     }
0913 
0914     sym = symbol__new(map->map_ip(map, map->start),
0915               event->ksymbol.len,
0916               0, 0, event->ksymbol.name);
0917     if (!sym)
0918         return -ENOMEM;
0919     dso__insert_symbol(map->dso, sym);
0920     return 0;
0921 }
0922 
0923 static int machine__process_ksymbol_unregister(struct machine *machine,
0924                            union perf_event *event,
0925                            struct perf_sample *sample __maybe_unused)
0926 {
0927     struct symbol *sym;
0928     struct map *map;
0929 
0930     map = maps__find(machine__kernel_maps(machine), event->ksymbol.addr);
0931     if (!map)
0932         return 0;
0933 
0934     if (map != machine->vmlinux_map)
0935         maps__remove(machine__kernel_maps(machine), map);
0936     else {
0937         sym = dso__find_symbol(map->dso, map->map_ip(map, map->start));
0938         if (sym)
0939             dso__delete_symbol(map->dso, sym);
0940     }
0941 
0942     return 0;
0943 }
0944 
0945 int machine__process_ksymbol(struct machine *machine __maybe_unused,
0946                  union perf_event *event,
0947                  struct perf_sample *sample)
0948 {
0949     if (dump_trace)
0950         perf_event__fprintf_ksymbol(event, stdout);
0951 
0952     if (event->ksymbol.flags & PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER)
0953         return machine__process_ksymbol_unregister(machine, event,
0954                                sample);
0955     return machine__process_ksymbol_register(machine, event, sample);
0956 }
0957 
0958 int machine__process_text_poke(struct machine *machine, union perf_event *event,
0959                    struct perf_sample *sample __maybe_unused)
0960 {
0961     struct map *map = maps__find(machine__kernel_maps(machine), event->text_poke.addr);
0962     u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
0963 
0964     if (dump_trace)
0965         perf_event__fprintf_text_poke(event, machine, stdout);
0966 
0967     if (!event->text_poke.new_len)
0968         return 0;
0969 
0970     if (cpumode != PERF_RECORD_MISC_KERNEL) {
0971         pr_debug("%s: unsupported cpumode - ignoring\n", __func__);
0972         return 0;
0973     }
0974 
0975     if (map && map->dso) {
0976         u8 *new_bytes = event->text_poke.bytes + event->text_poke.old_len;
0977         int ret;
0978 
0979         /*
0980          * Kernel maps might be changed when loading symbols so loading
0981          * must be done prior to using kernel maps.
0982          */
0983         map__load(map);
0984         ret = dso__data_write_cache_addr(map->dso, map, machine,
0985                          event->text_poke.addr,
0986                          new_bytes,
0987                          event->text_poke.new_len);
0988         if (ret != event->text_poke.new_len)
0989             pr_debug("Failed to write kernel text poke at %#" PRI_lx64 "\n",
0990                  event->text_poke.addr);
0991     } else {
0992         pr_debug("Failed to find kernel text poke address map for %#" PRI_lx64 "\n",
0993              event->text_poke.addr);
0994     }
0995 
0996     return 0;
0997 }
0998 
0999 static struct map *machine__addnew_module_map(struct machine *machine, u64 start,
1000                           const char *filename)
1001 {
1002     struct map *map = NULL;
1003     struct kmod_path m;
1004     struct dso *dso;
1005 
1006     if (kmod_path__parse_name(&m, filename))
1007         return NULL;
1008 
1009     dso = machine__findnew_module_dso(machine, &m, filename);
1010     if (dso == NULL)
1011         goto out;
1012 
1013     map = map__new2(start, dso);
1014     if (map == NULL)
1015         goto out;
1016 
1017     maps__insert(machine__kernel_maps(machine), map);
1018 
1019     /* Put the map here because maps__insert already got it */
1020     map__put(map);
1021 out:
1022     /* put the dso here, corresponding to  machine__findnew_module_dso */
1023     dso__put(dso);
1024     zfree(&m.name);
1025     return map;
1026 }
1027 
1028 size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
1029 {
1030     struct rb_node *nd;
1031     size_t ret = __dsos__fprintf(&machines->host.dsos.head, fp);
1032 
1033     for (nd = rb_first_cached(&machines->guests); nd; nd = rb_next(nd)) {
1034         struct machine *pos = rb_entry(nd, struct machine, rb_node);
1035         ret += __dsos__fprintf(&pos->dsos.head, fp);
1036     }
1037 
1038     return ret;
1039 }
1040 
1041 size_t machine__fprintf_dsos_buildid(struct machine *m, FILE *fp,
1042                      bool (skip)(struct dso *dso, int parm), int parm)
1043 {
1044     return __dsos__fprintf_buildid(&m->dsos.head, fp, skip, parm);
1045 }
1046 
1047 size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,
1048                      bool (skip)(struct dso *dso, int parm), int parm)
1049 {
1050     struct rb_node *nd;
1051     size_t ret = machine__fprintf_dsos_buildid(&machines->host, fp, skip, parm);
1052 
1053     for (nd = rb_first_cached(&machines->guests); nd; nd = rb_next(nd)) {
1054         struct machine *pos = rb_entry(nd, struct machine, rb_node);
1055         ret += machine__fprintf_dsos_buildid(pos, fp, skip, parm);
1056     }
1057     return ret;
1058 }
1059 
1060 size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp)
1061 {
1062     int i;
1063     size_t printed = 0;
1064     struct dso *kdso = machine__kernel_dso(machine);
1065 
1066     if (kdso->has_build_id) {
1067         char filename[PATH_MAX];
1068         if (dso__build_id_filename(kdso, filename, sizeof(filename),
1069                        false))
1070             printed += fprintf(fp, "[0] %s\n", filename);
1071     }
1072 
1073     for (i = 0; i < vmlinux_path__nr_entries; ++i)
1074         printed += fprintf(fp, "[%d] %s\n",
1075                    i + kdso->has_build_id, vmlinux_path[i]);
1076 
1077     return printed;
1078 }
1079 
1080 size_t machine__fprintf(struct machine *machine, FILE *fp)
1081 {
1082     struct rb_node *nd;
1083     size_t ret;
1084     int i;
1085 
1086     for (i = 0; i < THREADS__TABLE_SIZE; i++) {
1087         struct threads *threads = &machine->threads[i];
1088 
1089         down_read(&threads->lock);
1090 
1091         ret = fprintf(fp, "Threads: %u\n", threads->nr);
1092 
1093         for (nd = rb_first_cached(&threads->entries); nd;
1094              nd = rb_next(nd)) {
1095             struct thread *pos = rb_entry(nd, struct thread, rb_node);
1096 
1097             ret += thread__fprintf(pos, fp);
1098         }
1099 
1100         up_read(&threads->lock);
1101     }
1102     return ret;
1103 }
1104 
1105 static struct dso *machine__get_kernel(struct machine *machine)
1106 {
1107     const char *vmlinux_name = machine->mmap_name;
1108     struct dso *kernel;
1109 
1110     if (machine__is_host(machine)) {
1111         if (symbol_conf.vmlinux_name)
1112             vmlinux_name = symbol_conf.vmlinux_name;
1113 
1114         kernel = machine__findnew_kernel(machine, vmlinux_name,
1115                          "[kernel]", DSO_SPACE__KERNEL);
1116     } else {
1117         if (symbol_conf.default_guest_vmlinux_name)
1118             vmlinux_name = symbol_conf.default_guest_vmlinux_name;
1119 
1120         kernel = machine__findnew_kernel(machine, vmlinux_name,
1121                          "[guest.kernel]",
1122                          DSO_SPACE__KERNEL_GUEST);
1123     }
1124 
1125     if (kernel != NULL && (!kernel->has_build_id))
1126         dso__read_running_kernel_build_id(kernel, machine);
1127 
1128     return kernel;
1129 }
1130 
1131 struct process_args {
1132     u64 start;
1133 };
1134 
1135 void machine__get_kallsyms_filename(struct machine *machine, char *buf,
1136                     size_t bufsz)
1137 {
1138     if (machine__is_default_guest(machine))
1139         scnprintf(buf, bufsz, "%s", symbol_conf.default_guest_kallsyms);
1140     else
1141         scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir);
1142 }
1143 
1144 const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
1145 
1146 /* Figure out the start address of kernel map from /proc/kallsyms.
1147  * Returns the name of the start symbol in *symbol_name. Pass in NULL as
1148  * symbol_name if it's not that important.
1149  */
1150 static int machine__get_running_kernel_start(struct machine *machine,
1151                          const char **symbol_name,
1152                          u64 *start, u64 *end)
1153 {
1154     char filename[PATH_MAX];
1155     int i, err = -1;
1156     const char *name;
1157     u64 addr = 0;
1158 
1159     machine__get_kallsyms_filename(machine, filename, PATH_MAX);
1160 
1161     if (symbol__restricted_filename(filename, "/proc/kallsyms"))
1162         return 0;
1163 
1164     for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
1165         err = kallsyms__get_function_start(filename, name, &addr);
1166         if (!err)
1167             break;
1168     }
1169 
1170     if (err)
1171         return -1;
1172 
1173     if (symbol_name)
1174         *symbol_name = name;
1175 
1176     *start = addr;
1177 
1178     err = kallsyms__get_function_start(filename, "_etext", &addr);
1179     if (!err)
1180         *end = addr;
1181 
1182     return 0;
1183 }
1184 
1185 int machine__create_extra_kernel_map(struct machine *machine,
1186                      struct dso *kernel,
1187                      struct extra_kernel_map *xm)
1188 {
1189     struct kmap *kmap;
1190     struct map *map;
1191 
1192     map = map__new2(xm->start, kernel);
1193     if (!map)
1194         return -1;
1195 
1196     map->end   = xm->end;
1197     map->pgoff = xm->pgoff;
1198 
1199     kmap = map__kmap(map);
1200 
1201     strlcpy(kmap->name, xm->name, KMAP_NAME_LEN);
1202 
1203     maps__insert(machine__kernel_maps(machine), map);
1204 
1205     pr_debug2("Added extra kernel map %s %" PRIx64 "-%" PRIx64 "\n",
1206           kmap->name, map->start, map->end);
1207 
1208     map__put(map);
1209 
1210     return 0;
1211 }
1212 
1213 static u64 find_entry_trampoline(struct dso *dso)
1214 {
1215     /* Duplicates are removed so lookup all aliases */
1216     const char *syms[] = {
1217         "_entry_trampoline",
1218         "__entry_trampoline_start",
1219         "entry_SYSCALL_64_trampoline",
1220     };
1221     struct symbol *sym = dso__first_symbol(dso);
1222     unsigned int i;
1223 
1224     for (; sym; sym = dso__next_symbol(sym)) {
1225         if (sym->binding != STB_GLOBAL)
1226             continue;
1227         for (i = 0; i < ARRAY_SIZE(syms); i++) {
1228             if (!strcmp(sym->name, syms[i]))
1229                 return sym->start;
1230         }
1231     }
1232 
1233     return 0;
1234 }
1235 
1236 /*
1237  * These values can be used for kernels that do not have symbols for the entry
1238  * trampolines in kallsyms.
1239  */
1240 #define X86_64_CPU_ENTRY_AREA_PER_CPU   0xfffffe0000000000ULL
1241 #define X86_64_CPU_ENTRY_AREA_SIZE  0x2c000
1242 #define X86_64_ENTRY_TRAMPOLINE     0x6000
1243 
1244 /* Map x86_64 PTI entry trampolines */
1245 int machine__map_x86_64_entry_trampolines(struct machine *machine,
1246                       struct dso *kernel)
1247 {
1248     struct maps *kmaps = machine__kernel_maps(machine);
1249     int nr_cpus_avail, cpu;
1250     bool found = false;
1251     struct map *map;
1252     u64 pgoff;
1253 
1254     /*
1255      * In the vmlinux case, pgoff is a virtual address which must now be
1256      * mapped to a vmlinux offset.
1257      */
1258     maps__for_each_entry(kmaps, map) {
1259         struct kmap *kmap = __map__kmap(map);
1260         struct map *dest_map;
1261 
1262         if (!kmap || !is_entry_trampoline(kmap->name))
1263             continue;
1264 
1265         dest_map = maps__find(kmaps, map->pgoff);
1266         if (dest_map != map)
1267             map->pgoff = dest_map->map_ip(dest_map, map->pgoff);
1268         found = true;
1269     }
1270     if (found || machine->trampolines_mapped)
1271         return 0;
1272 
1273     pgoff = find_entry_trampoline(kernel);
1274     if (!pgoff)
1275         return 0;
1276 
1277     nr_cpus_avail = machine__nr_cpus_avail(machine);
1278 
1279     /* Add a 1 page map for each CPU's entry trampoline */
1280     for (cpu = 0; cpu < nr_cpus_avail; cpu++) {
1281         u64 va = X86_64_CPU_ENTRY_AREA_PER_CPU +
1282              cpu * X86_64_CPU_ENTRY_AREA_SIZE +
1283              X86_64_ENTRY_TRAMPOLINE;
1284         struct extra_kernel_map xm = {
1285             .start = va,
1286             .end   = va + page_size,
1287             .pgoff = pgoff,
1288         };
1289 
1290         strlcpy(xm.name, ENTRY_TRAMPOLINE_NAME, KMAP_NAME_LEN);
1291 
1292         if (machine__create_extra_kernel_map(machine, kernel, &xm) < 0)
1293             return -1;
1294     }
1295 
1296     machine->trampolines_mapped = nr_cpus_avail;
1297 
1298     return 0;
1299 }
1300 
1301 int __weak machine__create_extra_kernel_maps(struct machine *machine __maybe_unused,
1302                          struct dso *kernel __maybe_unused)
1303 {
1304     return 0;
1305 }
1306 
1307 static int
1308 __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
1309 {
1310     /* In case of renewal the kernel map, destroy previous one */
1311     machine__destroy_kernel_maps(machine);
1312 
1313     machine->vmlinux_map = map__new2(0, kernel);
1314     if (machine->vmlinux_map == NULL)
1315         return -1;
1316 
1317     machine->vmlinux_map->map_ip = machine->vmlinux_map->unmap_ip = identity__map_ip;
1318     maps__insert(machine__kernel_maps(machine), machine->vmlinux_map);
1319     return 0;
1320 }
1321 
1322 void machine__destroy_kernel_maps(struct machine *machine)
1323 {
1324     struct kmap *kmap;
1325     struct map *map = machine__kernel_map(machine);
1326 
1327     if (map == NULL)
1328         return;
1329 
1330     kmap = map__kmap(map);
1331     maps__remove(machine__kernel_maps(machine), map);
1332     if (kmap && kmap->ref_reloc_sym) {
1333         zfree((char **)&kmap->ref_reloc_sym->name);
1334         zfree(&kmap->ref_reloc_sym);
1335     }
1336 
1337     map__zput(machine->vmlinux_map);
1338 }
1339 
1340 int machines__create_guest_kernel_maps(struct machines *machines)
1341 {
1342     int ret = 0;
1343     struct dirent **namelist = NULL;
1344     int i, items = 0;
1345     char path[PATH_MAX];
1346     pid_t pid;
1347     char *endp;
1348 
1349     if (symbol_conf.default_guest_vmlinux_name ||
1350         symbol_conf.default_guest_modules ||
1351         symbol_conf.default_guest_kallsyms) {
1352         machines__create_kernel_maps(machines, DEFAULT_GUEST_KERNEL_ID);
1353     }
1354 
1355     if (symbol_conf.guestmount) {
1356         items = scandir(symbol_conf.guestmount, &namelist, NULL, NULL);
1357         if (items <= 0)
1358             return -ENOENT;
1359         for (i = 0; i < items; i++) {
1360             if (!isdigit(namelist[i]->d_name[0])) {
1361                 /* Filter out . and .. */
1362                 continue;
1363             }
1364             pid = (pid_t)strtol(namelist[i]->d_name, &endp, 10);
1365             if ((*endp != '\0') ||
1366                 (endp == namelist[i]->d_name) ||
1367                 (errno == ERANGE)) {
1368                 pr_debug("invalid directory (%s). Skipping.\n",
1369                      namelist[i]->d_name);
1370                 continue;
1371             }
1372             sprintf(path, "%s/%s/proc/kallsyms",
1373                 symbol_conf.guestmount,
1374                 namelist[i]->d_name);
1375             ret = access(path, R_OK);
1376             if (ret) {
1377                 pr_debug("Can't access file %s\n", path);
1378                 goto failure;
1379             }
1380             machines__create_kernel_maps(machines, pid);
1381         }
1382 failure:
1383         free(namelist);
1384     }
1385 
1386     return ret;
1387 }
1388 
1389 void machines__destroy_kernel_maps(struct machines *machines)
1390 {
1391     struct rb_node *next = rb_first_cached(&machines->guests);
1392 
1393     machine__destroy_kernel_maps(&machines->host);
1394 
1395     while (next) {
1396         struct machine *pos = rb_entry(next, struct machine, rb_node);
1397 
1398         next = rb_next(&pos->rb_node);
1399         rb_erase_cached(&pos->rb_node, &machines->guests);
1400         machine__delete(pos);
1401     }
1402 }
1403 
1404 int machines__create_kernel_maps(struct machines *machines, pid_t pid)
1405 {
1406     struct machine *machine = machines__findnew(machines, pid);
1407 
1408     if (machine == NULL)
1409         return -1;
1410 
1411     return machine__create_kernel_maps(machine);
1412 }
1413 
1414 int machine__load_kallsyms(struct machine *machine, const char *filename)
1415 {
1416     struct map *map = machine__kernel_map(machine);
1417     int ret = __dso__load_kallsyms(map->dso, filename, map, true);
1418 
1419     if (ret > 0) {
1420         dso__set_loaded(map->dso);
1421         /*
1422          * Since /proc/kallsyms will have multiple sessions for the
1423          * kernel, with modules between them, fixup the end of all
1424          * sections.
1425          */
1426         maps__fixup_end(machine__kernel_maps(machine));
1427     }
1428 
1429     return ret;
1430 }
1431 
1432 int machine__load_vmlinux_path(struct machine *machine)
1433 {
1434     struct map *map = machine__kernel_map(machine);
1435     int ret = dso__load_vmlinux_path(map->dso, map);
1436 
1437     if (ret > 0)
1438         dso__set_loaded(map->dso);
1439 
1440     return ret;
1441 }
1442 
1443 static char *get_kernel_version(const char *root_dir)
1444 {
1445     char version[PATH_MAX];
1446     FILE *file;
1447     char *name, *tmp;
1448     const char *prefix = "Linux version ";
1449 
1450     sprintf(version, "%s/proc/version", root_dir);
1451     file = fopen(version, "r");
1452     if (!file)
1453         return NULL;
1454 
1455     tmp = fgets(version, sizeof(version), file);
1456     fclose(file);
1457     if (!tmp)
1458         return NULL;
1459 
1460     name = strstr(version, prefix);
1461     if (!name)
1462         return NULL;
1463     name += strlen(prefix);
1464     tmp = strchr(name, ' ');
1465     if (tmp)
1466         *tmp = '\0';
1467 
1468     return strdup(name);
1469 }
1470 
1471 static bool is_kmod_dso(struct dso *dso)
1472 {
1473     return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
1474            dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE;
1475 }
1476 
1477 static int maps__set_module_path(struct maps *maps, const char *path, struct kmod_path *m)
1478 {
1479     char *long_name;
1480     struct map *map = maps__find_by_name(maps, m->name);
1481 
1482     if (map == NULL)
1483         return 0;
1484 
1485     long_name = strdup(path);
1486     if (long_name == NULL)
1487         return -ENOMEM;
1488 
1489     dso__set_long_name(map->dso, long_name, true);
1490     dso__kernel_module_get_build_id(map->dso, "");
1491 
1492     /*
1493      * Full name could reveal us kmod compression, so
1494      * we need to update the symtab_type if needed.
1495      */
1496     if (m->comp && is_kmod_dso(map->dso)) {
1497         map->dso->symtab_type++;
1498         map->dso->comp = m->comp;
1499     }
1500 
1501     return 0;
1502 }
1503 
1504 static int maps__set_modules_path_dir(struct maps *maps, const char *dir_name, int depth)
1505 {
1506     struct dirent *dent;
1507     DIR *dir = opendir(dir_name);
1508     int ret = 0;
1509 
1510     if (!dir) {
1511         pr_debug("%s: cannot open %s dir\n", __func__, dir_name);
1512         return -1;
1513     }
1514 
1515     while ((dent = readdir(dir)) != NULL) {
1516         char path[PATH_MAX];
1517         struct stat st;
1518 
1519         /*sshfs might return bad dent->d_type, so we have to stat*/
1520         path__join(path, sizeof(path), dir_name, dent->d_name);
1521         if (stat(path, &st))
1522             continue;
1523 
1524         if (S_ISDIR(st.st_mode)) {
1525             if (!strcmp(dent->d_name, ".") ||
1526                 !strcmp(dent->d_name, ".."))
1527                 continue;
1528 
1529             /* Do not follow top-level source and build symlinks */
1530             if (depth == 0) {
1531                 if (!strcmp(dent->d_name, "source") ||
1532                     !strcmp(dent->d_name, "build"))
1533                     continue;
1534             }
1535 
1536             ret = maps__set_modules_path_dir(maps, path, depth + 1);
1537             if (ret < 0)
1538                 goto out;
1539         } else {
1540             struct kmod_path m;
1541 
1542             ret = kmod_path__parse_name(&m, dent->d_name);
1543             if (ret)
1544                 goto out;
1545 
1546             if (m.kmod)
1547                 ret = maps__set_module_path(maps, path, &m);
1548 
1549             zfree(&m.name);
1550 
1551             if (ret)
1552                 goto out;
1553         }
1554     }
1555 
1556 out:
1557     closedir(dir);
1558     return ret;
1559 }
1560 
1561 static int machine__set_modules_path(struct machine *machine)
1562 {
1563     char *version;
1564     char modules_path[PATH_MAX];
1565 
1566     version = get_kernel_version(machine->root_dir);
1567     if (!version)
1568         return -1;
1569 
1570     snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s",
1571          machine->root_dir, version);
1572     free(version);
1573 
1574     return maps__set_modules_path_dir(machine__kernel_maps(machine), modules_path, 0);
1575 }
1576 int __weak arch__fix_module_text_start(u64 *start __maybe_unused,
1577                 u64 *size __maybe_unused,
1578                 const char *name __maybe_unused)
1579 {
1580     return 0;
1581 }
1582 
1583 static int machine__create_module(void *arg, const char *name, u64 start,
1584                   u64 size)
1585 {
1586     struct machine *machine = arg;
1587     struct map *map;
1588 
1589     if (arch__fix_module_text_start(&start, &size, name) < 0)
1590         return -1;
1591 
1592     map = machine__addnew_module_map(machine, start, name);
1593     if (map == NULL)
1594         return -1;
1595     map->end = start + size;
1596 
1597     dso__kernel_module_get_build_id(map->dso, machine->root_dir);
1598 
1599     return 0;
1600 }
1601 
1602 static int machine__create_modules(struct machine *machine)
1603 {
1604     const char *modules;
1605     char path[PATH_MAX];
1606 
1607     if (machine__is_default_guest(machine)) {
1608         modules = symbol_conf.default_guest_modules;
1609     } else {
1610         snprintf(path, PATH_MAX, "%s/proc/modules", machine->root_dir);
1611         modules = path;
1612     }
1613 
1614     if (symbol__restricted_filename(modules, "/proc/modules"))
1615         return -1;
1616 
1617     if (modules__parse(modules, machine, machine__create_module))
1618         return -1;
1619 
1620     if (!machine__set_modules_path(machine))
1621         return 0;
1622 
1623     pr_debug("Problems setting modules path maps, continuing anyway...\n");
1624 
1625     return 0;
1626 }
1627 
1628 static void machine__set_kernel_mmap(struct machine *machine,
1629                      u64 start, u64 end)
1630 {
1631     machine->vmlinux_map->start = start;
1632     machine->vmlinux_map->end   = end;
1633     /*
1634      * Be a bit paranoid here, some perf.data file came with
1635      * a zero sized synthesized MMAP event for the kernel.
1636      */
1637     if (start == 0 && end == 0)
1638         machine->vmlinux_map->end = ~0ULL;
1639 }
1640 
1641 static void machine__update_kernel_mmap(struct machine *machine,
1642                      u64 start, u64 end)
1643 {
1644     struct map *map = machine__kernel_map(machine);
1645 
1646     map__get(map);
1647     maps__remove(machine__kernel_maps(machine), map);
1648 
1649     machine__set_kernel_mmap(machine, start, end);
1650 
1651     maps__insert(machine__kernel_maps(machine), map);
1652     map__put(map);
1653 }
1654 
1655 int machine__create_kernel_maps(struct machine *machine)
1656 {
1657     struct dso *kernel = machine__get_kernel(machine);
1658     const char *name = NULL;
1659     struct map *map;
1660     u64 start = 0, end = ~0ULL;
1661     int ret;
1662 
1663     if (kernel == NULL)
1664         return -1;
1665 
1666     ret = __machine__create_kernel_maps(machine, kernel);
1667     if (ret < 0)
1668         goto out_put;
1669 
1670     if (symbol_conf.use_modules && machine__create_modules(machine) < 0) {
1671         if (machine__is_host(machine))
1672             pr_debug("Problems creating module maps, "
1673                  "continuing anyway...\n");
1674         else
1675             pr_debug("Problems creating module maps for guest %d, "
1676                  "continuing anyway...\n", machine->pid);
1677     }
1678 
1679     if (!machine__get_running_kernel_start(machine, &name, &start, &end)) {
1680         if (name &&
1681             map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map, name, start)) {
1682             machine__destroy_kernel_maps(machine);
1683             ret = -1;
1684             goto out_put;
1685         }
1686 
1687         /*
1688          * we have a real start address now, so re-order the kmaps
1689          * assume it's the last in the kmaps
1690          */
1691         machine__update_kernel_mmap(machine, start, end);
1692     }
1693 
1694     if (machine__create_extra_kernel_maps(machine, kernel))
1695         pr_debug("Problems creating extra kernel maps, continuing anyway...\n");
1696 
1697     if (end == ~0ULL) {
1698         /* update end address of the kernel map using adjacent module address */
1699         map = map__next(machine__kernel_map(machine));
1700         if (map)
1701             machine__set_kernel_mmap(machine, start, map->start);
1702     }
1703 
1704 out_put:
1705     dso__put(kernel);
1706     return ret;
1707 }
1708 
1709 static bool machine__uses_kcore(struct machine *machine)
1710 {
1711     struct dso *dso;
1712 
1713     list_for_each_entry(dso, &machine->dsos.head, node) {
1714         if (dso__is_kcore(dso))
1715             return true;
1716     }
1717 
1718     return false;
1719 }
1720 
1721 static bool perf_event__is_extra_kernel_mmap(struct machine *machine,
1722                          struct extra_kernel_map *xm)
1723 {
1724     return machine__is(machine, "x86_64") &&
1725            is_entry_trampoline(xm->name);
1726 }
1727 
1728 static int machine__process_extra_kernel_map(struct machine *machine,
1729                          struct extra_kernel_map *xm)
1730 {
1731     struct dso *kernel = machine__kernel_dso(machine);
1732 
1733     if (kernel == NULL)
1734         return -1;
1735 
1736     return machine__create_extra_kernel_map(machine, kernel, xm);
1737 }
1738 
1739 static int machine__process_kernel_mmap_event(struct machine *machine,
1740                           struct extra_kernel_map *xm,
1741                           struct build_id *bid)
1742 {
1743     struct map *map;
1744     enum dso_space_type dso_space;
1745     bool is_kernel_mmap;
1746     const char *mmap_name = machine->mmap_name;
1747 
1748     /* If we have maps from kcore then we do not need or want any others */
1749     if (machine__uses_kcore(machine))
1750         return 0;
1751 
1752     if (machine__is_host(machine))
1753         dso_space = DSO_SPACE__KERNEL;
1754     else
1755         dso_space = DSO_SPACE__KERNEL_GUEST;
1756 
1757     is_kernel_mmap = memcmp(xm->name, mmap_name, strlen(mmap_name) - 1) == 0;
1758     if (!is_kernel_mmap && !machine__is_host(machine)) {
1759         /*
1760          * If the event was recorded inside the guest and injected into
1761          * the host perf.data file, then it will match a host mmap_name,
1762          * so try that - see machine__set_mmap_name().
1763          */
1764         mmap_name = "[kernel.kallsyms]";
1765         is_kernel_mmap = memcmp(xm->name, mmap_name, strlen(mmap_name) - 1) == 0;
1766     }
1767     if (xm->name[0] == '/' ||
1768         (!is_kernel_mmap && xm->name[0] == '[')) {
1769         map = machine__addnew_module_map(machine, xm->start,
1770                          xm->name);
1771         if (map == NULL)
1772             goto out_problem;
1773 
1774         map->end = map->start + xm->end - xm->start;
1775 
1776         if (build_id__is_defined(bid))
1777             dso__set_build_id(map->dso, bid);
1778 
1779     } else if (is_kernel_mmap) {
1780         const char *symbol_name = xm->name + strlen(mmap_name);
1781         /*
1782          * Should be there already, from the build-id table in
1783          * the header.
1784          */
1785         struct dso *kernel = NULL;
1786         struct dso *dso;
1787 
1788         down_read(&machine->dsos.lock);
1789 
1790         list_for_each_entry(dso, &machine->dsos.head, node) {
1791 
1792             /*
1793              * The cpumode passed to is_kernel_module is not the
1794              * cpumode of *this* event. If we insist on passing
1795              * correct cpumode to is_kernel_module, we should
1796              * record the cpumode when we adding this dso to the
1797              * linked list.
1798              *
1799              * However we don't really need passing correct
1800              * cpumode.  We know the correct cpumode must be kernel
1801              * mode (if not, we should not link it onto kernel_dsos
1802              * list).
1803              *
1804              * Therefore, we pass PERF_RECORD_MISC_CPUMODE_UNKNOWN.
1805              * is_kernel_module() treats it as a kernel cpumode.
1806              */
1807 
1808             if (!dso->kernel ||
1809                 is_kernel_module(dso->long_name,
1810                          PERF_RECORD_MISC_CPUMODE_UNKNOWN))
1811                 continue;
1812 
1813 
1814             kernel = dso;
1815             break;
1816         }
1817 
1818         up_read(&machine->dsos.lock);
1819 
1820         if (kernel == NULL)
1821             kernel = machine__findnew_dso(machine, machine->mmap_name);
1822         if (kernel == NULL)
1823             goto out_problem;
1824 
1825         kernel->kernel = dso_space;
1826         if (__machine__create_kernel_maps(machine, kernel) < 0) {
1827             dso__put(kernel);
1828             goto out_problem;
1829         }
1830 
1831         if (strstr(kernel->long_name, "vmlinux"))
1832             dso__set_short_name(kernel, "[kernel.vmlinux]", false);
1833 
1834         machine__update_kernel_mmap(machine, xm->start, xm->end);
1835 
1836         if (build_id__is_defined(bid))
1837             dso__set_build_id(kernel, bid);
1838 
1839         /*
1840          * Avoid using a zero address (kptr_restrict) for the ref reloc
1841          * symbol. Effectively having zero here means that at record
1842          * time /proc/sys/kernel/kptr_restrict was non zero.
1843          */
1844         if (xm->pgoff != 0) {
1845             map__set_kallsyms_ref_reloc_sym(machine->vmlinux_map,
1846                             symbol_name,
1847                             xm->pgoff);
1848         }
1849 
1850         if (machine__is_default_guest(machine)) {
1851             /*
1852              * preload dso of guest kernel and modules
1853              */
1854             dso__load(kernel, machine__kernel_map(machine));
1855         }
1856     } else if (perf_event__is_extra_kernel_mmap(machine, xm)) {
1857         return machine__process_extra_kernel_map(machine, xm);
1858     }
1859     return 0;
1860 out_problem:
1861     return -1;
1862 }
1863 
1864 int machine__process_mmap2_event(struct machine *machine,
1865                  union perf_event *event,
1866                  struct perf_sample *sample)
1867 {
1868     struct thread *thread;
1869     struct map *map;
1870     struct dso_id dso_id = {
1871         .maj = event->mmap2.maj,
1872         .min = event->mmap2.min,
1873         .ino = event->mmap2.ino,
1874         .ino_generation = event->mmap2.ino_generation,
1875     };
1876     struct build_id __bid, *bid = NULL;
1877     int ret = 0;
1878 
1879     if (dump_trace)
1880         perf_event__fprintf_mmap2(event, stdout);
1881 
1882     if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) {
1883         bid = &__bid;
1884         build_id__init(bid, event->mmap2.build_id, event->mmap2.build_id_size);
1885     }
1886 
1887     if (sample->cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
1888         sample->cpumode == PERF_RECORD_MISC_KERNEL) {
1889         struct extra_kernel_map xm = {
1890             .start = event->mmap2.start,
1891             .end   = event->mmap2.start + event->mmap2.len,
1892             .pgoff = event->mmap2.pgoff,
1893         };
1894 
1895         strlcpy(xm.name, event->mmap2.filename, KMAP_NAME_LEN);
1896         ret = machine__process_kernel_mmap_event(machine, &xm, bid);
1897         if (ret < 0)
1898             goto out_problem;
1899         return 0;
1900     }
1901 
1902     thread = machine__findnew_thread(machine, event->mmap2.pid,
1903                     event->mmap2.tid);
1904     if (thread == NULL)
1905         goto out_problem;
1906 
1907     map = map__new(machine, event->mmap2.start,
1908             event->mmap2.len, event->mmap2.pgoff,
1909             &dso_id, event->mmap2.prot,
1910             event->mmap2.flags, bid,
1911             event->mmap2.filename, thread);
1912 
1913     if (map == NULL)
1914         goto out_problem_map;
1915 
1916     ret = thread__insert_map(thread, map);
1917     if (ret)
1918         goto out_problem_insert;
1919 
1920     thread__put(thread);
1921     map__put(map);
1922     return 0;
1923 
1924 out_problem_insert:
1925     map__put(map);
1926 out_problem_map:
1927     thread__put(thread);
1928 out_problem:
1929     dump_printf("problem processing PERF_RECORD_MMAP2, skipping event.\n");
1930     return 0;
1931 }
1932 
1933 int machine__process_mmap_event(struct machine *machine, union perf_event *event,
1934                 struct perf_sample *sample)
1935 {
1936     struct thread *thread;
1937     struct map *map;
1938     u32 prot = 0;
1939     int ret = 0;
1940 
1941     if (dump_trace)
1942         perf_event__fprintf_mmap(event, stdout);
1943 
1944     if (sample->cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
1945         sample->cpumode == PERF_RECORD_MISC_KERNEL) {
1946         struct extra_kernel_map xm = {
1947             .start = event->mmap.start,
1948             .end   = event->mmap.start + event->mmap.len,
1949             .pgoff = event->mmap.pgoff,
1950         };
1951 
1952         strlcpy(xm.name, event->mmap.filename, KMAP_NAME_LEN);
1953         ret = machine__process_kernel_mmap_event(machine, &xm, NULL);
1954         if (ret < 0)
1955             goto out_problem;
1956         return 0;
1957     }
1958 
1959     thread = machine__findnew_thread(machine, event->mmap.pid,
1960                      event->mmap.tid);
1961     if (thread == NULL)
1962         goto out_problem;
1963 
1964     if (!(event->header.misc & PERF_RECORD_MISC_MMAP_DATA))
1965         prot = PROT_EXEC;
1966 
1967     map = map__new(machine, event->mmap.start,
1968             event->mmap.len, event->mmap.pgoff,
1969             NULL, prot, 0, NULL, event->mmap.filename, thread);
1970 
1971     if (map == NULL)
1972         goto out_problem_map;
1973 
1974     ret = thread__insert_map(thread, map);
1975     if (ret)
1976         goto out_problem_insert;
1977 
1978     thread__put(thread);
1979     map__put(map);
1980     return 0;
1981 
1982 out_problem_insert:
1983     map__put(map);
1984 out_problem_map:
1985     thread__put(thread);
1986 out_problem:
1987     dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n");
1988     return 0;
1989 }
1990 
1991 static void __machine__remove_thread(struct machine *machine, struct thread *th, bool lock)
1992 {
1993     struct threads *threads = machine__threads(machine, th->tid);
1994 
1995     if (threads->last_match == th)
1996         threads__set_last_match(threads, NULL);
1997 
1998     if (lock)
1999         down_write(&threads->lock);
2000 
2001     BUG_ON(refcount_read(&th->refcnt) == 0);
2002 
2003     rb_erase_cached(&th->rb_node, &threads->entries);
2004     RB_CLEAR_NODE(&th->rb_node);
2005     --threads->nr;
2006     /*
2007      * Move it first to the dead_threads list, then drop the reference,
2008      * if this is the last reference, then the thread__delete destructor
2009      * will be called and we will remove it from the dead_threads list.
2010      */
2011     list_add_tail(&th->node, &threads->dead);
2012 
2013     /*
2014      * We need to do the put here because if this is the last refcount,
2015      * then we will be touching the threads->dead head when removing the
2016      * thread.
2017      */
2018     thread__put(th);
2019 
2020     if (lock)
2021         up_write(&threads->lock);
2022 }
2023 
2024 void machine__remove_thread(struct machine *machine, struct thread *th)
2025 {
2026     return __machine__remove_thread(machine, th, true);
2027 }
2028 
2029 int machine__process_fork_event(struct machine *machine, union perf_event *event,
2030                 struct perf_sample *sample)
2031 {
2032     struct thread *thread = machine__find_thread(machine,
2033                              event->fork.pid,
2034                              event->fork.tid);
2035     struct thread *parent = machine__findnew_thread(machine,
2036                             event->fork.ppid,
2037                             event->fork.ptid);
2038     bool do_maps_clone = true;
2039     int err = 0;
2040 
2041     if (dump_trace)
2042         perf_event__fprintf_task(event, stdout);
2043 
2044     /*
2045      * There may be an existing thread that is not actually the parent,
2046      * either because we are processing events out of order, or because the
2047      * (fork) event that would have removed the thread was lost. Assume the
2048      * latter case and continue on as best we can.
2049      */
2050     if (parent->pid_ != (pid_t)event->fork.ppid) {
2051         dump_printf("removing erroneous parent thread %d/%d\n",
2052                 parent->pid_, parent->tid);
2053         machine__remove_thread(machine, parent);
2054         thread__put(parent);
2055         parent = machine__findnew_thread(machine, event->fork.ppid,
2056                          event->fork.ptid);
2057     }
2058 
2059     /* if a thread currently exists for the thread id remove it */
2060     if (thread != NULL) {
2061         machine__remove_thread(machine, thread);
2062         thread__put(thread);
2063     }
2064 
2065     thread = machine__findnew_thread(machine, event->fork.pid,
2066                      event->fork.tid);
2067     /*
2068      * When synthesizing FORK events, we are trying to create thread
2069      * objects for the already running tasks on the machine.
2070      *
2071      * Normally, for a kernel FORK event, we want to clone the parent's
2072      * maps because that is what the kernel just did.
2073      *
2074      * But when synthesizing, this should not be done.  If we do, we end up
2075      * with overlapping maps as we process the synthesized MMAP2 events that
2076      * get delivered shortly thereafter.
2077      *
2078      * Use the FORK event misc flags in an internal way to signal this
2079      * situation, so we can elide the map clone when appropriate.
2080      */
2081     if (event->fork.header.misc & PERF_RECORD_MISC_FORK_EXEC)
2082         do_maps_clone = false;
2083 
2084     if (thread == NULL || parent == NULL ||
2085         thread__fork(thread, parent, sample->time, do_maps_clone) < 0) {
2086         dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n");
2087         err = -1;
2088     }
2089     thread__put(thread);
2090     thread__put(parent);
2091 
2092     return err;
2093 }
2094 
2095 int machine__process_exit_event(struct machine *machine, union perf_event *event,
2096                 struct perf_sample *sample __maybe_unused)
2097 {
2098     struct thread *thread = machine__find_thread(machine,
2099                              event->fork.pid,
2100                              event->fork.tid);
2101 
2102     if (dump_trace)
2103         perf_event__fprintf_task(event, stdout);
2104 
2105     if (thread != NULL) {
2106         thread__exited(thread);
2107         thread__put(thread);
2108     }
2109 
2110     return 0;
2111 }
2112 
2113 int machine__process_event(struct machine *machine, union perf_event *event,
2114                struct perf_sample *sample)
2115 {
2116     int ret;
2117 
2118     switch (event->header.type) {
2119     case PERF_RECORD_COMM:
2120         ret = machine__process_comm_event(machine, event, sample); break;
2121     case PERF_RECORD_MMAP:
2122         ret = machine__process_mmap_event(machine, event, sample); break;
2123     case PERF_RECORD_NAMESPACES:
2124         ret = machine__process_namespaces_event(machine, event, sample); break;
2125     case PERF_RECORD_CGROUP:
2126         ret = machine__process_cgroup_event(machine, event, sample); break;
2127     case PERF_RECORD_MMAP2:
2128         ret = machine__process_mmap2_event(machine, event, sample); break;
2129     case PERF_RECORD_FORK:
2130         ret = machine__process_fork_event(machine, event, sample); break;
2131     case PERF_RECORD_EXIT:
2132         ret = machine__process_exit_event(machine, event, sample); break;
2133     case PERF_RECORD_LOST:
2134         ret = machine__process_lost_event(machine, event, sample); break;
2135     case PERF_RECORD_AUX:
2136         ret = machine__process_aux_event(machine, event); break;
2137     case PERF_RECORD_ITRACE_START:
2138         ret = machine__process_itrace_start_event(machine, event); break;
2139     case PERF_RECORD_LOST_SAMPLES:
2140         ret = machine__process_lost_samples_event(machine, event, sample); break;
2141     case PERF_RECORD_SWITCH:
2142     case PERF_RECORD_SWITCH_CPU_WIDE:
2143         ret = machine__process_switch_event(machine, event); break;
2144     case PERF_RECORD_KSYMBOL:
2145         ret = machine__process_ksymbol(machine, event, sample); break;
2146     case PERF_RECORD_BPF_EVENT:
2147         ret = machine__process_bpf(machine, event, sample); break;
2148     case PERF_RECORD_TEXT_POKE:
2149         ret = machine__process_text_poke(machine, event, sample); break;
2150     case PERF_RECORD_AUX_OUTPUT_HW_ID:
2151         ret = machine__process_aux_output_hw_id_event(machine, event); break;
2152     default:
2153         ret = -1;
2154         break;
2155     }
2156 
2157     return ret;
2158 }
2159 
2160 static bool symbol__match_regex(struct symbol *sym, regex_t *regex)
2161 {
2162     if (!regexec(regex, sym->name, 0, NULL, 0))
2163         return true;
2164     return false;
2165 }
2166 
2167 static void ip__resolve_ams(struct thread *thread,
2168                 struct addr_map_symbol *ams,
2169                 u64 ip)
2170 {
2171     struct addr_location al;
2172 
2173     memset(&al, 0, sizeof(al));
2174     /*
2175      * We cannot use the header.misc hint to determine whether a
2176      * branch stack address is user, kernel, guest, hypervisor.
2177      * Branches may straddle the kernel/user/hypervisor boundaries.
2178      * Thus, we have to try consecutively until we find a match
2179      * or else, the symbol is unknown
2180      */
2181     thread__find_cpumode_addr_location(thread, ip, &al);
2182 
2183     ams->addr = ip;
2184     ams->al_addr = al.addr;
2185     ams->al_level = al.level;
2186     ams->ms.maps = al.maps;
2187     ams->ms.sym = al.sym;
2188     ams->ms.map = al.map;
2189     ams->phys_addr = 0;
2190     ams->data_page_size = 0;
2191 }
2192 
2193 static void ip__resolve_data(struct thread *thread,
2194                  u8 m, struct addr_map_symbol *ams,
2195                  u64 addr, u64 phys_addr, u64 daddr_page_size)
2196 {
2197     struct addr_location al;
2198 
2199     memset(&al, 0, sizeof(al));
2200 
2201     thread__find_symbol(thread, m, addr, &al);
2202 
2203     ams->addr = addr;
2204     ams->al_addr = al.addr;
2205     ams->al_level = al.level;
2206     ams->ms.maps = al.maps;
2207     ams->ms.sym = al.sym;
2208     ams->ms.map = al.map;
2209     ams->phys_addr = phys_addr;
2210     ams->data_page_size = daddr_page_size;
2211 }
2212 
2213 struct mem_info *sample__resolve_mem(struct perf_sample *sample,
2214                      struct addr_location *al)
2215 {
2216     struct mem_info *mi = mem_info__new();
2217 
2218     if (!mi)
2219         return NULL;
2220 
2221     ip__resolve_ams(al->thread, &mi->iaddr, sample->ip);
2222     ip__resolve_data(al->thread, al->cpumode, &mi->daddr,
2223              sample->addr, sample->phys_addr,
2224              sample->data_page_size);
2225     mi->data_src.val = sample->data_src;
2226 
2227     return mi;
2228 }
2229 
2230 static char *callchain_srcline(struct map_symbol *ms, u64 ip)
2231 {
2232     struct map *map = ms->map;
2233     char *srcline = NULL;
2234 
2235     if (!map || callchain_param.key == CCKEY_FUNCTION)
2236         return srcline;
2237 
2238     srcline = srcline__tree_find(&map->dso->srclines, ip);
2239     if (!srcline) {
2240         bool show_sym = false;
2241         bool show_addr = callchain_param.key == CCKEY_ADDRESS;
2242 
2243         srcline = get_srcline(map->dso, map__rip_2objdump(map, ip),
2244                       ms->sym, show_sym, show_addr, ip);
2245         srcline__tree_insert(&map->dso->srclines, ip, srcline);
2246     }
2247 
2248     return srcline;
2249 }
2250 
2251 struct iterations {
2252     int nr_loop_iter;
2253     u64 cycles;
2254 };
2255 
2256 static int add_callchain_ip(struct thread *thread,
2257                 struct callchain_cursor *cursor,
2258                 struct symbol **parent,
2259                 struct addr_location *root_al,
2260                 u8 *cpumode,
2261                 u64 ip,
2262                 bool branch,
2263                 struct branch_flags *flags,
2264                 struct iterations *iter,
2265                 u64 branch_from)
2266 {
2267     struct map_symbol ms;
2268     struct addr_location al;
2269     int nr_loop_iter = 0;
2270     u64 iter_cycles = 0;
2271     const char *srcline = NULL;
2272 
2273     al.filtered = 0;
2274     al.sym = NULL;
2275     al.srcline = NULL;
2276     if (!cpumode) {
2277         thread__find_cpumode_addr_location(thread, ip, &al);
2278     } else {
2279         if (ip >= PERF_CONTEXT_MAX) {
2280             switch (ip) {
2281             case PERF_CONTEXT_HV:
2282                 *cpumode = PERF_RECORD_MISC_HYPERVISOR;
2283                 break;
2284             case PERF_CONTEXT_KERNEL:
2285                 *cpumode = PERF_RECORD_MISC_KERNEL;
2286                 break;
2287             case PERF_CONTEXT_USER:
2288                 *cpumode = PERF_RECORD_MISC_USER;
2289                 break;
2290             default:
2291                 pr_debug("invalid callchain context: "
2292                      "%"PRId64"\n", (s64) ip);
2293                 /*
2294                  * It seems the callchain is corrupted.
2295                  * Discard all.
2296                  */
2297                 callchain_cursor_reset(cursor);
2298                 return 1;
2299             }
2300             return 0;
2301         }
2302         thread__find_symbol(thread, *cpumode, ip, &al);
2303     }
2304 
2305     if (al.sym != NULL) {
2306         if (perf_hpp_list.parent && !*parent &&
2307             symbol__match_regex(al.sym, &parent_regex))
2308             *parent = al.sym;
2309         else if (have_ignore_callees && root_al &&
2310           symbol__match_regex(al.sym, &ignore_callees_regex)) {
2311             /* Treat this symbol as the root,
2312                forgetting its callees. */
2313             *root_al = al;
2314             callchain_cursor_reset(cursor);
2315         }
2316     }
2317 
2318     if (symbol_conf.hide_unresolved && al.sym == NULL)
2319         return 0;
2320 
2321     if (iter) {
2322         nr_loop_iter = iter->nr_loop_iter;
2323         iter_cycles = iter->cycles;
2324     }
2325 
2326     ms.maps = al.maps;
2327     ms.map = al.map;
2328     ms.sym = al.sym;
2329     srcline = callchain_srcline(&ms, al.addr);
2330     return callchain_cursor_append(cursor, ip, &ms,
2331                        branch, flags, nr_loop_iter,
2332                        iter_cycles, branch_from, srcline);
2333 }
2334 
2335 struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
2336                        struct addr_location *al)
2337 {
2338     unsigned int i;
2339     const struct branch_stack *bs = sample->branch_stack;
2340     struct branch_entry *entries = perf_sample__branch_entries(sample);
2341     struct branch_info *bi = calloc(bs->nr, sizeof(struct branch_info));
2342 
2343     if (!bi)
2344         return NULL;
2345 
2346     for (i = 0; i < bs->nr; i++) {
2347         ip__resolve_ams(al->thread, &bi[i].to, entries[i].to);
2348         ip__resolve_ams(al->thread, &bi[i].from, entries[i].from);
2349         bi[i].flags = entries[i].flags;
2350     }
2351     return bi;
2352 }
2353 
2354 static void save_iterations(struct iterations *iter,
2355                 struct branch_entry *be, int nr)
2356 {
2357     int i;
2358 
2359     iter->nr_loop_iter++;
2360     iter->cycles = 0;
2361 
2362     for (i = 0; i < nr; i++)
2363         iter->cycles += be[i].flags.cycles;
2364 }
2365 
2366 #define CHASHSZ 127
2367 #define CHASHBITS 7
2368 #define NO_ENTRY 0xff
2369 
2370 #define PERF_MAX_BRANCH_DEPTH 127
2371 
2372 /* Remove loops. */
2373 static int remove_loops(struct branch_entry *l, int nr,
2374             struct iterations *iter)
2375 {
2376     int i, j, off;
2377     unsigned char chash[CHASHSZ];
2378 
2379     memset(chash, NO_ENTRY, sizeof(chash));
2380 
2381     BUG_ON(PERF_MAX_BRANCH_DEPTH > 255);
2382 
2383     for (i = 0; i < nr; i++) {
2384         int h = hash_64(l[i].from, CHASHBITS) % CHASHSZ;
2385 
2386         /* no collision handling for now */
2387         if (chash[h] == NO_ENTRY) {
2388             chash[h] = i;
2389         } else if (l[chash[h]].from == l[i].from) {
2390             bool is_loop = true;
2391             /* check if it is a real loop */
2392             off = 0;
2393             for (j = chash[h]; j < i && i + off < nr; j++, off++)
2394                 if (l[j].from != l[i + off].from) {
2395                     is_loop = false;
2396                     break;
2397                 }
2398             if (is_loop) {
2399                 j = nr - (i + off);
2400                 if (j > 0) {
2401                     save_iterations(iter + i + off,
2402                         l + i, off);
2403 
2404                     memmove(iter + i, iter + i + off,
2405                         j * sizeof(*iter));
2406 
2407                     memmove(l + i, l + i + off,
2408                         j * sizeof(*l));
2409                 }
2410 
2411                 nr -= off;
2412             }
2413         }
2414     }
2415     return nr;
2416 }
2417 
2418 static int lbr_callchain_add_kernel_ip(struct thread *thread,
2419                        struct callchain_cursor *cursor,
2420                        struct perf_sample *sample,
2421                        struct symbol **parent,
2422                        struct addr_location *root_al,
2423                        u64 branch_from,
2424                        bool callee, int end)
2425 {
2426     struct ip_callchain *chain = sample->callchain;
2427     u8 cpumode = PERF_RECORD_MISC_USER;
2428     int err, i;
2429 
2430     if (callee) {
2431         for (i = 0; i < end + 1; i++) {
2432             err = add_callchain_ip(thread, cursor, parent,
2433                            root_al, &cpumode, chain->ips[i],
2434                            false, NULL, NULL, branch_from);
2435             if (err)
2436                 return err;
2437         }
2438         return 0;
2439     }
2440 
2441     for (i = end; i >= 0; i--) {
2442         err = add_callchain_ip(thread, cursor, parent,
2443                        root_al, &cpumode, chain->ips[i],
2444                        false, NULL, NULL, branch_from);
2445         if (err)
2446             return err;
2447     }
2448 
2449     return 0;
2450 }
2451 
2452 static void save_lbr_cursor_node(struct thread *thread,
2453                  struct callchain_cursor *cursor,
2454                  int idx)
2455 {
2456     struct lbr_stitch *lbr_stitch = thread->lbr_stitch;
2457 
2458     if (!lbr_stitch)
2459         return;
2460 
2461     if (cursor->pos == cursor->nr) {
2462         lbr_stitch->prev_lbr_cursor[idx].valid = false;
2463         return;
2464     }
2465 
2466     if (!cursor->curr)
2467         cursor->curr = cursor->first;
2468     else
2469         cursor->curr = cursor->curr->next;
2470     memcpy(&lbr_stitch->prev_lbr_cursor[idx], cursor->curr,
2471            sizeof(struct callchain_cursor_node));
2472 
2473     lbr_stitch->prev_lbr_cursor[idx].valid = true;
2474     cursor->pos++;
2475 }
2476 
2477 static int lbr_callchain_add_lbr_ip(struct thread *thread,
2478                     struct callchain_cursor *cursor,
2479                     struct perf_sample *sample,
2480                     struct symbol **parent,
2481                     struct addr_location *root_al,
2482                     u64 *branch_from,
2483                     bool callee)
2484 {
2485     struct branch_stack *lbr_stack = sample->branch_stack;
2486     struct branch_entry *entries = perf_sample__branch_entries(sample);
2487     u8 cpumode = PERF_RECORD_MISC_USER;
2488     int lbr_nr = lbr_stack->nr;
2489     struct branch_flags *flags;
2490     int err, i;
2491     u64 ip;
2492 
2493     /*
2494      * The curr and pos are not used in writing session. They are cleared
2495      * in callchain_cursor_commit() when the writing session is closed.
2496      * Using curr and pos to track the current cursor node.
2497      */
2498     if (thread->lbr_stitch) {
2499         cursor->curr = NULL;
2500         cursor->pos = cursor->nr;
2501         if (cursor->nr) {
2502             cursor->curr = cursor->first;
2503             for (i = 0; i < (int)(cursor->nr - 1); i++)
2504                 cursor->curr = cursor->curr->next;
2505         }
2506     }
2507 
2508     if (callee) {
2509         /* Add LBR ip from first entries.to */
2510         ip = entries[0].to;
2511         flags = &entries[0].flags;
2512         *branch_from = entries[0].from;
2513         err = add_callchain_ip(thread, cursor, parent,
2514                        root_al, &cpumode, ip,
2515                        true, flags, NULL,
2516                        *branch_from);
2517         if (err)
2518             return err;
2519 
2520         /*
2521          * The number of cursor node increases.
2522          * Move the current cursor node.
2523          * But does not need to save current cursor node for entry 0.
2524          * It's impossible to stitch the whole LBRs of previous sample.
2525          */
2526         if (thread->lbr_stitch && (cursor->pos != cursor->nr)) {
2527             if (!cursor->curr)
2528                 cursor->curr = cursor->first;
2529             else
2530                 cursor->curr = cursor->curr->next;
2531             cursor->pos++;
2532         }
2533 
2534         /* Add LBR ip from entries.from one by one. */
2535         for (i = 0; i < lbr_nr; i++) {
2536             ip = entries[i].from;
2537             flags = &entries[i].flags;
2538             err = add_callchain_ip(thread, cursor, parent,
2539                            root_al, &cpumode, ip,
2540                            true, flags, NULL,
2541                            *branch_from);
2542             if (err)
2543                 return err;
2544             save_lbr_cursor_node(thread, cursor, i);
2545         }
2546         return 0;
2547     }
2548 
2549     /* Add LBR ip from entries.from one by one. */
2550     for (i = lbr_nr - 1; i >= 0; i--) {
2551         ip = entries[i].from;
2552         flags = &entries[i].flags;
2553         err = add_callchain_ip(thread, cursor, parent,
2554                        root_al, &cpumode, ip,
2555                        true, flags, NULL,
2556                        *branch_from);
2557         if (err)
2558             return err;
2559         save_lbr_cursor_node(thread, cursor, i);
2560     }
2561 
2562     /* Add LBR ip from first entries.to */
2563     ip = entries[0].to;
2564     flags = &entries[0].flags;
2565     *branch_from = entries[0].from;
2566     err = add_callchain_ip(thread, cursor, parent,
2567                    root_al, &cpumode, ip,
2568                    true, flags, NULL,
2569                    *branch_from);
2570     if (err)
2571         return err;
2572 
2573     return 0;
2574 }
2575 
2576 static int lbr_callchain_add_stitched_lbr_ip(struct thread *thread,
2577                          struct callchain_cursor *cursor)
2578 {
2579     struct lbr_stitch *lbr_stitch = thread->lbr_stitch;
2580     struct callchain_cursor_node *cnode;
2581     struct stitch_list *stitch_node;
2582     int err;
2583 
2584     list_for_each_entry(stitch_node, &lbr_stitch->lists, node) {
2585         cnode = &stitch_node->cursor;
2586 
2587         err = callchain_cursor_append(cursor, cnode->ip,
2588                           &cnode->ms,
2589                           cnode->branch,
2590                           &cnode->branch_flags,
2591                           cnode->nr_loop_iter,
2592                           cnode->iter_cycles,
2593                           cnode->branch_from,
2594                           cnode->srcline);
2595         if (err)
2596             return err;
2597     }
2598     return 0;
2599 }
2600 
2601 static struct stitch_list *get_stitch_node(struct thread *thread)
2602 {
2603     struct lbr_stitch *lbr_stitch = thread->lbr_stitch;
2604     struct stitch_list *stitch_node;
2605 
2606     if (!list_empty(&lbr_stitch->free_lists)) {
2607         stitch_node = list_first_entry(&lbr_stitch->free_lists,
2608                            struct stitch_list, node);
2609         list_del(&stitch_node->node);
2610 
2611         return stitch_node;
2612     }
2613 
2614     return malloc(sizeof(struct stitch_list));
2615 }
2616 
2617 static bool has_stitched_lbr(struct thread *thread,
2618                  struct perf_sample *cur,
2619                  struct perf_sample *prev,
2620                  unsigned int max_lbr,
2621                  bool callee)
2622 {
2623     struct branch_stack *cur_stack = cur->branch_stack;
2624     struct branch_entry *cur_entries = perf_sample__branch_entries(cur);
2625     struct branch_stack *prev_stack = prev->branch_stack;
2626     struct branch_entry *prev_entries = perf_sample__branch_entries(prev);
2627     struct lbr_stitch *lbr_stitch = thread->lbr_stitch;
2628     int i, j, nr_identical_branches = 0;
2629     struct stitch_list *stitch_node;
2630     u64 cur_base, distance;
2631 
2632     if (!cur_stack || !prev_stack)
2633         return false;
2634 
2635     /* Find the physical index of the base-of-stack for current sample. */
2636     cur_base = max_lbr - cur_stack->nr + cur_stack->hw_idx + 1;
2637 
2638     distance = (prev_stack->hw_idx > cur_base) ? (prev_stack->hw_idx - cur_base) :
2639                              (max_lbr + prev_stack->hw_idx - cur_base);
2640     /* Previous sample has shorter stack. Nothing can be stitched. */
2641     if (distance + 1 > prev_stack->nr)
2642         return false;
2643 
2644     /*
2645      * Check if there are identical LBRs between two samples.
2646      * Identical LBRs must have same from, to and flags values. Also,
2647      * they have to be saved in the same LBR registers (same physical
2648      * index).
2649      *
2650      * Starts from the base-of-stack of current sample.
2651      */
2652     for (i = distance, j = cur_stack->nr - 1; (i >= 0) && (j >= 0); i--, j--) {
2653         if ((prev_entries[i].from != cur_entries[j].from) ||
2654             (prev_entries[i].to != cur_entries[j].to) ||
2655             (prev_entries[i].flags.value != cur_entries[j].flags.value))
2656             break;
2657         nr_identical_branches++;
2658     }
2659 
2660     if (!nr_identical_branches)
2661         return false;
2662 
2663     /*
2664      * Save the LBRs between the base-of-stack of previous sample
2665      * and the base-of-stack of current sample into lbr_stitch->lists.
2666      * These LBRs will be stitched later.
2667      */
2668     for (i = prev_stack->nr - 1; i > (int)distance; i--) {
2669 
2670         if (!lbr_stitch->prev_lbr_cursor[i].valid)
2671             continue;
2672 
2673         stitch_node = get_stitch_node(thread);
2674         if (!stitch_node)
2675             return false;
2676 
2677         memcpy(&stitch_node->cursor, &lbr_stitch->prev_lbr_cursor[i],
2678                sizeof(struct callchain_cursor_node));
2679 
2680         if (callee)
2681             list_add(&stitch_node->node, &lbr_stitch->lists);
2682         else
2683             list_add_tail(&stitch_node->node, &lbr_stitch->lists);
2684     }
2685 
2686     return true;
2687 }
2688 
2689 static bool alloc_lbr_stitch(struct thread *thread, unsigned int max_lbr)
2690 {
2691     if (thread->lbr_stitch)
2692         return true;
2693 
2694     thread->lbr_stitch = zalloc(sizeof(*thread->lbr_stitch));
2695     if (!thread->lbr_stitch)
2696         goto err;
2697 
2698     thread->lbr_stitch->prev_lbr_cursor = calloc(max_lbr + 1, sizeof(struct callchain_cursor_node));
2699     if (!thread->lbr_stitch->prev_lbr_cursor)
2700         goto free_lbr_stitch;
2701 
2702     INIT_LIST_HEAD(&thread->lbr_stitch->lists);
2703     INIT_LIST_HEAD(&thread->lbr_stitch->free_lists);
2704 
2705     return true;
2706 
2707 free_lbr_stitch:
2708     zfree(&thread->lbr_stitch);
2709 err:
2710     pr_warning("Failed to allocate space for stitched LBRs. Disable LBR stitch\n");
2711     thread->lbr_stitch_enable = false;
2712     return false;
2713 }
2714 
2715 /*
2716  * Resolve LBR callstack chain sample
2717  * Return:
2718  * 1 on success get LBR callchain information
2719  * 0 no available LBR callchain information, should try fp
2720  * negative error code on other errors.
2721  */
2722 static int resolve_lbr_callchain_sample(struct thread *thread,
2723                     struct callchain_cursor *cursor,
2724                     struct perf_sample *sample,
2725                     struct symbol **parent,
2726                     struct addr_location *root_al,
2727                     int max_stack,
2728                     unsigned int max_lbr)
2729 {
2730     bool callee = (callchain_param.order == ORDER_CALLEE);
2731     struct ip_callchain *chain = sample->callchain;
2732     int chain_nr = min(max_stack, (int)chain->nr), i;
2733     struct lbr_stitch *lbr_stitch;
2734     bool stitched_lbr = false;
2735     u64 branch_from = 0;
2736     int err;
2737 
2738     for (i = 0; i < chain_nr; i++) {
2739         if (chain->ips[i] == PERF_CONTEXT_USER)
2740             break;
2741     }
2742 
2743     /* LBR only affects the user callchain */
2744     if (i == chain_nr)
2745         return 0;
2746 
2747     if (thread->lbr_stitch_enable && !sample->no_hw_idx &&
2748         (max_lbr > 0) && alloc_lbr_stitch(thread, max_lbr)) {
2749         lbr_stitch = thread->lbr_stitch;
2750 
2751         stitched_lbr = has_stitched_lbr(thread, sample,
2752                         &lbr_stitch->prev_sample,
2753                         max_lbr, callee);
2754 
2755         if (!stitched_lbr && !list_empty(&lbr_stitch->lists)) {
2756             list_replace_init(&lbr_stitch->lists,
2757                       &lbr_stitch->free_lists);
2758         }
2759         memcpy(&lbr_stitch->prev_sample, sample, sizeof(*sample));
2760     }
2761 
2762     if (callee) {
2763         /* Add kernel ip */
2764         err = lbr_callchain_add_kernel_ip(thread, cursor, sample,
2765                           parent, root_al, branch_from,
2766                           true, i);
2767         if (err)
2768             goto error;
2769 
2770         err = lbr_callchain_add_lbr_ip(thread, cursor, sample, parent,
2771                            root_al, &branch_from, true);
2772         if (err)
2773             goto error;
2774 
2775         if (stitched_lbr) {
2776             err = lbr_callchain_add_stitched_lbr_ip(thread, cursor);
2777             if (err)
2778                 goto error;
2779         }
2780 
2781     } else {
2782         if (stitched_lbr) {
2783             err = lbr_callchain_add_stitched_lbr_ip(thread, cursor);
2784             if (err)
2785                 goto error;
2786         }
2787         err = lbr_callchain_add_lbr_ip(thread, cursor, sample, parent,
2788                            root_al, &branch_from, false);
2789         if (err)
2790             goto error;
2791 
2792         /* Add kernel ip */
2793         err = lbr_callchain_add_kernel_ip(thread, cursor, sample,
2794                           parent, root_al, branch_from,
2795                           false, i);
2796         if (err)
2797             goto error;
2798     }
2799     return 1;
2800 
2801 error:
2802     return (err < 0) ? err : 0;
2803 }
2804 
2805 static int find_prev_cpumode(struct ip_callchain *chain, struct thread *thread,
2806                  struct callchain_cursor *cursor,
2807                  struct symbol **parent,
2808                  struct addr_location *root_al,
2809                  u8 *cpumode, int ent)
2810 {
2811     int err = 0;
2812 
2813     while (--ent >= 0) {
2814         u64 ip = chain->ips[ent];
2815 
2816         if (ip >= PERF_CONTEXT_MAX) {
2817             err = add_callchain_ip(thread, cursor, parent,
2818                            root_al, cpumode, ip,
2819                            false, NULL, NULL, 0);
2820             break;
2821         }
2822     }
2823     return err;
2824 }
2825 
2826 static u64 get_leaf_frame_caller(struct perf_sample *sample,
2827         struct thread *thread, int usr_idx)
2828 {
2829     if (machine__normalized_is(thread->maps->machine, "arm64"))
2830         return get_leaf_frame_caller_aarch64(sample, thread, usr_idx);
2831     else
2832         return 0;
2833 }
2834 
2835 static int thread__resolve_callchain_sample(struct thread *thread,
2836                         struct callchain_cursor *cursor,
2837                         struct evsel *evsel,
2838                         struct perf_sample *sample,
2839                         struct symbol **parent,
2840                         struct addr_location *root_al,
2841                         int max_stack)
2842 {
2843     struct branch_stack *branch = sample->branch_stack;
2844     struct branch_entry *entries = perf_sample__branch_entries(sample);
2845     struct ip_callchain *chain = sample->callchain;
2846     int chain_nr = 0;
2847     u8 cpumode = PERF_RECORD_MISC_USER;
2848     int i, j, err, nr_entries, usr_idx;
2849     int skip_idx = -1;
2850     int first_call = 0;
2851     u64 leaf_frame_caller;
2852 
2853     if (chain)
2854         chain_nr = chain->nr;
2855 
2856     if (evsel__has_branch_callstack(evsel)) {
2857         struct perf_env *env = evsel__env(evsel);
2858 
2859         err = resolve_lbr_callchain_sample(thread, cursor, sample, parent,
2860                            root_al, max_stack,
2861                            !env ? 0 : env->max_branches);
2862         if (err)
2863             return (err < 0) ? err : 0;
2864     }
2865 
2866     /*
2867      * Based on DWARF debug information, some architectures skip
2868      * a callchain entry saved by the kernel.
2869      */
2870     skip_idx = arch_skip_callchain_idx(thread, chain);
2871 
2872     /*
2873      * Add branches to call stack for easier browsing. This gives
2874      * more context for a sample than just the callers.
2875      *
2876      * This uses individual histograms of paths compared to the
2877      * aggregated histograms the normal LBR mode uses.
2878      *
2879      * Limitations for now:
2880      * - No extra filters
2881      * - No annotations (should annotate somehow)
2882      */
2883 
2884     if (branch && callchain_param.branch_callstack) {
2885         int nr = min(max_stack, (int)branch->nr);
2886         struct branch_entry be[nr];
2887         struct iterations iter[nr];
2888 
2889         if (branch->nr > PERF_MAX_BRANCH_DEPTH) {
2890             pr_warning("corrupted branch chain. skipping...\n");
2891             goto check_calls;
2892         }
2893 
2894         for (i = 0; i < nr; i++) {
2895             if (callchain_param.order == ORDER_CALLEE) {
2896                 be[i] = entries[i];
2897 
2898                 if (chain == NULL)
2899                     continue;
2900 
2901                 /*
2902                  * Check for overlap into the callchain.
2903                  * The return address is one off compared to
2904                  * the branch entry. To adjust for this
2905                  * assume the calling instruction is not longer
2906                  * than 8 bytes.
2907                  */
2908                 if (i == skip_idx ||
2909                     chain->ips[first_call] >= PERF_CONTEXT_MAX)
2910                     first_call++;
2911                 else if (be[i].from < chain->ips[first_call] &&
2912                     be[i].from >= chain->ips[first_call] - 8)
2913                     first_call++;
2914             } else
2915                 be[i] = entries[branch->nr - i - 1];
2916         }
2917 
2918         memset(iter, 0, sizeof(struct iterations) * nr);
2919         nr = remove_loops(be, nr, iter);
2920 
2921         for (i = 0; i < nr; i++) {
2922             err = add_callchain_ip(thread, cursor, parent,
2923                            root_al,
2924                            NULL, be[i].to,
2925                            true, &be[i].flags,
2926                            NULL, be[i].from);
2927 
2928             if (!err)
2929                 err = add_callchain_ip(thread, cursor, parent, root_al,
2930                                NULL, be[i].from,
2931                                true, &be[i].flags,
2932                                &iter[i], 0);
2933             if (err == -EINVAL)
2934                 break;
2935             if (err)
2936                 return err;
2937         }
2938 
2939         if (chain_nr == 0)
2940             return 0;
2941 
2942         chain_nr -= nr;
2943     }
2944 
2945 check_calls:
2946     if (chain && callchain_param.order != ORDER_CALLEE) {
2947         err = find_prev_cpumode(chain, thread, cursor, parent, root_al,
2948                     &cpumode, chain->nr - first_call);
2949         if (err)
2950             return (err < 0) ? err : 0;
2951     }
2952     for (i = first_call, nr_entries = 0;
2953          i < chain_nr && nr_entries < max_stack; i++) {
2954         u64 ip;
2955 
2956         if (callchain_param.order == ORDER_CALLEE)
2957             j = i;
2958         else
2959             j = chain->nr - i - 1;
2960 
2961 #ifdef HAVE_SKIP_CALLCHAIN_IDX
2962         if (j == skip_idx)
2963             continue;
2964 #endif
2965         ip = chain->ips[j];
2966         if (ip < PERF_CONTEXT_MAX)
2967                        ++nr_entries;
2968         else if (callchain_param.order != ORDER_CALLEE) {
2969             err = find_prev_cpumode(chain, thread, cursor, parent,
2970                         root_al, &cpumode, j);
2971             if (err)
2972                 return (err < 0) ? err : 0;
2973             continue;
2974         }
2975 
2976         /*
2977          * PERF_CONTEXT_USER allows us to locate where the user stack ends.
2978          * Depending on callchain_param.order and the position of PERF_CONTEXT_USER,
2979          * the index will be different in order to add the missing frame
2980          * at the right place.
2981          */
2982 
2983         usr_idx = callchain_param.order == ORDER_CALLEE ? j-2 : j-1;
2984 
2985         if (usr_idx >= 0 && chain->ips[usr_idx] == PERF_CONTEXT_USER) {
2986 
2987             leaf_frame_caller = get_leaf_frame_caller(sample, thread, usr_idx);
2988 
2989             /*
2990              * check if leaf_frame_Caller != ip to not add the same
2991              * value twice.
2992              */
2993 
2994             if (leaf_frame_caller && leaf_frame_caller != ip) {
2995 
2996                 err = add_callchain_ip(thread, cursor, parent,
2997                            root_al, &cpumode, leaf_frame_caller,
2998                            false, NULL, NULL, 0);
2999                 if (err)
3000                     return (err < 0) ? err : 0;
3001             }
3002         }
3003 
3004         err = add_callchain_ip(thread, cursor, parent,
3005                        root_al, &cpumode, ip,
3006                        false, NULL, NULL, 0);
3007 
3008         if (err)
3009             return (err < 0) ? err : 0;
3010     }
3011 
3012     return 0;
3013 }
3014 
3015 static int append_inlines(struct callchain_cursor *cursor, struct map_symbol *ms, u64 ip)
3016 {
3017     struct symbol *sym = ms->sym;
3018     struct map *map = ms->map;
3019     struct inline_node *inline_node;
3020     struct inline_list *ilist;
3021     u64 addr;
3022     int ret = 1;
3023 
3024     if (!symbol_conf.inline_name || !map || !sym)
3025         return ret;
3026 
3027     addr = map__map_ip(map, ip);
3028     addr = map__rip_2objdump(map, addr);
3029 
3030     inline_node = inlines__tree_find(&map->dso->inlined_nodes, addr);
3031     if (!inline_node) {
3032         inline_node = dso__parse_addr_inlines(map->dso, addr, sym);
3033         if (!inline_node)
3034             return ret;
3035         inlines__tree_insert(&map->dso->inlined_nodes, inline_node);
3036     }
3037 
3038     list_for_each_entry(ilist, &inline_node->val, list) {
3039         struct map_symbol ilist_ms = {
3040             .maps = ms->maps,
3041             .map = map,
3042             .sym = ilist->symbol,
3043         };
3044         ret = callchain_cursor_append(cursor, ip, &ilist_ms, false,
3045                           NULL, 0, 0, 0, ilist->srcline);
3046 
3047         if (ret != 0)
3048             return ret;
3049     }
3050 
3051     return ret;
3052 }
3053 
3054 static int unwind_entry(struct unwind_entry *entry, void *arg)
3055 {
3056     struct callchain_cursor *cursor = arg;
3057     const char *srcline = NULL;
3058     u64 addr = entry->ip;
3059 
3060     if (symbol_conf.hide_unresolved && entry->ms.sym == NULL)
3061         return 0;
3062 
3063     if (append_inlines(cursor, &entry->ms, entry->ip) == 0)
3064         return 0;
3065 
3066     /*
3067      * Convert entry->ip from a virtual address to an offset in
3068      * its corresponding binary.
3069      */
3070     if (entry->ms.map)
3071         addr = map__map_ip(entry->ms.map, entry->ip);
3072 
3073     srcline = callchain_srcline(&entry->ms, addr);
3074     return callchain_cursor_append(cursor, entry->ip, &entry->ms,
3075                        false, NULL, 0, 0, 0, srcline);
3076 }
3077 
3078 static int thread__resolve_callchain_unwind(struct thread *thread,
3079                         struct callchain_cursor *cursor,
3080                         struct evsel *evsel,
3081                         struct perf_sample *sample,
3082                         int max_stack)
3083 {
3084     /* Can we do dwarf post unwind? */
3085     if (!((evsel->core.attr.sample_type & PERF_SAMPLE_REGS_USER) &&
3086           (evsel->core.attr.sample_type & PERF_SAMPLE_STACK_USER)))
3087         return 0;
3088 
3089     /* Bail out if nothing was captured. */
3090     if ((!sample->user_regs.regs) ||
3091         (!sample->user_stack.size))
3092         return 0;
3093 
3094     return unwind__get_entries(unwind_entry, cursor,
3095                    thread, sample, max_stack, false);
3096 }
3097 
3098 int thread__resolve_callchain(struct thread *thread,
3099                   struct callchain_cursor *cursor,
3100                   struct evsel *evsel,
3101                   struct perf_sample *sample,
3102                   struct symbol **parent,
3103                   struct addr_location *root_al,
3104                   int max_stack)
3105 {
3106     int ret = 0;
3107 
3108     callchain_cursor_reset(cursor);
3109 
3110     if (callchain_param.order == ORDER_CALLEE) {
3111         ret = thread__resolve_callchain_sample(thread, cursor,
3112                                evsel, sample,
3113                                parent, root_al,
3114                                max_stack);
3115         if (ret)
3116             return ret;
3117         ret = thread__resolve_callchain_unwind(thread, cursor,
3118                                evsel, sample,
3119                                max_stack);
3120     } else {
3121         ret = thread__resolve_callchain_unwind(thread, cursor,
3122                                evsel, sample,
3123                                max_stack);
3124         if (ret)
3125             return ret;
3126         ret = thread__resolve_callchain_sample(thread, cursor,
3127                                evsel, sample,
3128                                parent, root_al,
3129                                max_stack);
3130     }
3131 
3132     return ret;
3133 }
3134 
3135 int machine__for_each_thread(struct machine *machine,
3136                  int (*fn)(struct thread *thread, void *p),
3137                  void *priv)
3138 {
3139     struct threads *threads;
3140     struct rb_node *nd;
3141     struct thread *thread;
3142     int rc = 0;
3143     int i;
3144 
3145     for (i = 0; i < THREADS__TABLE_SIZE; i++) {
3146         threads = &machine->threads[i];
3147         for (nd = rb_first_cached(&threads->entries); nd;
3148              nd = rb_next(nd)) {
3149             thread = rb_entry(nd, struct thread, rb_node);
3150             rc = fn(thread, priv);
3151             if (rc != 0)
3152                 return rc;
3153         }
3154 
3155         list_for_each_entry(thread, &threads->dead, node) {
3156             rc = fn(thread, priv);
3157             if (rc != 0)
3158                 return rc;
3159         }
3160     }
3161     return rc;
3162 }
3163 
3164 int machines__for_each_thread(struct machines *machines,
3165                   int (*fn)(struct thread *thread, void *p),
3166                   void *priv)
3167 {
3168     struct rb_node *nd;
3169     int rc = 0;
3170 
3171     rc = machine__for_each_thread(&machines->host, fn, priv);
3172     if (rc != 0)
3173         return rc;
3174 
3175     for (nd = rb_first_cached(&machines->guests); nd; nd = rb_next(nd)) {
3176         struct machine *machine = rb_entry(nd, struct machine, rb_node);
3177 
3178         rc = machine__for_each_thread(machine, fn, priv);
3179         if (rc != 0)
3180             return rc;
3181     }
3182     return rc;
3183 }
3184 
3185 pid_t machine__get_current_tid(struct machine *machine, int cpu)
3186 {
3187     if (cpu < 0 || (size_t)cpu >= machine->current_tid_sz)
3188         return -1;
3189 
3190     return machine->current_tid[cpu];
3191 }
3192 
3193 int machine__set_current_tid(struct machine *machine, int cpu, pid_t pid,
3194                  pid_t tid)
3195 {
3196     struct thread *thread;
3197     const pid_t init_val = -1;
3198 
3199     if (cpu < 0)
3200         return -EINVAL;
3201 
3202     if (realloc_array_as_needed(machine->current_tid,
3203                     machine->current_tid_sz,
3204                     (unsigned int)cpu,
3205                     &init_val))
3206         return -ENOMEM;
3207 
3208     machine->current_tid[cpu] = tid;
3209 
3210     thread = machine__findnew_thread(machine, pid, tid);
3211     if (!thread)
3212         return -ENOMEM;
3213 
3214     thread->cpu = cpu;
3215     thread__put(thread);
3216 
3217     return 0;
3218 }
3219 
3220 /*
3221  * Compares the raw arch string. N.B. see instead perf_env__arch() or
3222  * machine__normalized_is() if a normalized arch is needed.
3223  */
3224 bool machine__is(struct machine *machine, const char *arch)
3225 {
3226     return machine && !strcmp(perf_env__raw_arch(machine->env), arch);
3227 }
3228 
3229 bool machine__normalized_is(struct machine *machine, const char *arch)
3230 {
3231     return machine && !strcmp(perf_env__arch(machine->env), arch);
3232 }
3233 
3234 int machine__nr_cpus_avail(struct machine *machine)
3235 {
3236     return machine ? perf_env__nr_cpus_avail(machine->env) : 0;
3237 }
3238 
3239 int machine__get_kernel_start(struct machine *machine)
3240 {
3241     struct map *map = machine__kernel_map(machine);
3242     int err = 0;
3243 
3244     /*
3245      * The only addresses above 2^63 are kernel addresses of a 64-bit
3246      * kernel.  Note that addresses are unsigned so that on a 32-bit system
3247      * all addresses including kernel addresses are less than 2^32.  In
3248      * that case (32-bit system), if the kernel mapping is unknown, all
3249      * addresses will be assumed to be in user space - see
3250      * machine__kernel_ip().
3251      */
3252     machine->kernel_start = 1ULL << 63;
3253     if (map) {
3254         err = map__load(map);
3255         /*
3256          * On x86_64, PTI entry trampolines are less than the
3257          * start of kernel text, but still above 2^63. So leave
3258          * kernel_start = 1ULL << 63 for x86_64.
3259          */
3260         if (!err && !machine__is(machine, "x86_64"))
3261             machine->kernel_start = map->start;
3262     }
3263     return err;
3264 }
3265 
3266 u8 machine__addr_cpumode(struct machine *machine, u8 cpumode, u64 addr)
3267 {
3268     u8 addr_cpumode = cpumode;
3269     bool kernel_ip;
3270 
3271     if (!machine->single_address_space)
3272         goto out;
3273 
3274     kernel_ip = machine__kernel_ip(machine, addr);
3275     switch (cpumode) {
3276     case PERF_RECORD_MISC_KERNEL:
3277     case PERF_RECORD_MISC_USER:
3278         addr_cpumode = kernel_ip ? PERF_RECORD_MISC_KERNEL :
3279                        PERF_RECORD_MISC_USER;
3280         break;
3281     case PERF_RECORD_MISC_GUEST_KERNEL:
3282     case PERF_RECORD_MISC_GUEST_USER:
3283         addr_cpumode = kernel_ip ? PERF_RECORD_MISC_GUEST_KERNEL :
3284                        PERF_RECORD_MISC_GUEST_USER;
3285         break;
3286     default:
3287         break;
3288     }
3289 out:
3290     return addr_cpumode;
3291 }
3292 
3293 struct dso *machine__findnew_dso_id(struct machine *machine, const char *filename, struct dso_id *id)
3294 {
3295     return dsos__findnew_id(&machine->dsos, filename, id);
3296 }
3297 
3298 struct dso *machine__findnew_dso(struct machine *machine, const char *filename)
3299 {
3300     return machine__findnew_dso_id(machine, filename, NULL);
3301 }
3302 
3303 char *machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp)
3304 {
3305     struct machine *machine = vmachine;
3306     struct map *map;
3307     struct symbol *sym = machine__find_kernel_symbol(machine, *addrp, &map);
3308 
3309     if (sym == NULL)
3310         return NULL;
3311 
3312     *modp = __map__is_kmodule(map) ? (char *)map->dso->short_name : NULL;
3313     *addrp = map->unmap_ip(map, sym->start);
3314     return sym->name;
3315 }
3316 
3317 int machine__for_each_dso(struct machine *machine, machine__dso_t fn, void *priv)
3318 {
3319     struct dso *pos;
3320     int err = 0;
3321 
3322     list_for_each_entry(pos, &machine->dsos.head, node) {
3323         if (fn(pos, machine, priv))
3324             err = -1;
3325     }
3326     return err;
3327 }
3328 
3329 int machine__for_each_kernel_map(struct machine *machine, machine__map_t fn, void *priv)
3330 {
3331     struct maps *maps = machine__kernel_maps(machine);
3332     struct map *map;
3333     int err = 0;
3334 
3335     for (map = maps__first(maps); map != NULL; map = map__next(map)) {
3336         err = fn(map, priv);
3337         if (err != 0) {
3338             break;
3339         }
3340     }
3341     return err;
3342 }