GNU Linux-libre 4.19.211-gnu1
[releases.git] / tools / perf / arch / arm64 / tests / dwarf-unwind.c
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
12 static 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_ARM64_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
44 int 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 }