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