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