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