linux/tools/perf/arch/x86/tests/dwarf-unwind.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <string.h>
   3#include "perf_regs.h"
   4#include "thread.h"
   5#include "map.h"
   6#include "map_groups.h"
   7#include "event.h"
   8#include "debug.h"
   9#include "tests/tests.h"
  10#include "arch-tests.h"
  11
  12#define STACK_SIZE 8192
  13
  14static int sample_ustack(struct perf_sample *sample,
  15                         struct thread *thread, u64 *regs)
  16{
  17        struct stack_dump *stack = &sample->user_stack;
  18        struct map *map;
  19        unsigned long sp;
  20        u64 stack_size, *buf;
  21
  22        buf = malloc(STACK_SIZE);
  23        if (!buf) {
  24                pr_debug("failed to allocate sample uregs data\n");
  25                return -1;
  26        }
  27
  28        sp = (unsigned long) regs[PERF_REG_X86_SP];
  29
  30        map = map_groups__find(thread->mg, (u64)sp);
  31        if (!map) {
  32                pr_debug("failed to get stack map\n");
  33                free(buf);
  34                return -1;
  35        }
  36
  37        stack_size = map->end - sp;
  38        stack_size = stack_size > STACK_SIZE ? STACK_SIZE : stack_size;
  39
  40        memcpy(buf, (void *) sp, stack_size);
  41        stack->data = (char *) buf;
  42        stack->size = stack_size;
  43        return 0;
  44}
  45
  46int test__arch_unwind_sample(struct perf_sample *sample,
  47                             struct thread *thread)
  48{
  49        struct regs_dump *regs = &sample->user_regs;
  50        u64 *buf;
  51
  52        buf = malloc(sizeof(u64) * PERF_REGS_MAX);
  53        if (!buf) {
  54                pr_debug("failed to allocate sample uregs data\n");
  55                return -1;
  56        }
  57
  58        perf_regs_load(buf);
  59        regs->abi  = PERF_SAMPLE_REGS_ABI;
  60        regs->regs = buf;
  61        regs->mask = PERF_REGS_MASK;
  62
  63        return sample_ustack(sample, thread, buf);
  64}
  65