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_X86_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 = malloc(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