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 11 static 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_ARM64_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 43 int 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