1aa16b81fSJiri Olsa #include <string.h> 2aa16b81fSJiri Olsa #include "perf_regs.h" 3aa16b81fSJiri Olsa #include "thread.h" 4aa16b81fSJiri Olsa #include "map.h" 5aa16b81fSJiri Olsa #include "event.h" 6aa16b81fSJiri Olsa #include "tests/tests.h" 7aa16b81fSJiri Olsa 8aa16b81fSJiri Olsa #define STACK_SIZE 8192 9aa16b81fSJiri Olsa 10aa16b81fSJiri Olsa static int sample_ustack(struct perf_sample *sample, 11aa16b81fSJiri Olsa struct thread *thread, u64 *regs) 12aa16b81fSJiri Olsa { 13aa16b81fSJiri Olsa struct stack_dump *stack = &sample->user_stack; 14aa16b81fSJiri Olsa struct map *map; 15aa16b81fSJiri Olsa unsigned long sp; 16aa16b81fSJiri Olsa u64 stack_size, *buf; 17aa16b81fSJiri Olsa 18aa16b81fSJiri Olsa buf = malloc(STACK_SIZE); 19aa16b81fSJiri Olsa if (!buf) { 20aa16b81fSJiri Olsa pr_debug("failed to allocate sample uregs data\n"); 21aa16b81fSJiri Olsa return -1; 22aa16b81fSJiri Olsa } 23aa16b81fSJiri Olsa 24aa16b81fSJiri Olsa sp = (unsigned long) regs[PERF_REG_X86_SP]; 25aa16b81fSJiri Olsa 26*aeffe2abSIngo Molnar map = map_groups__find(thread->mg, MAP__VARIABLE, (u64) sp); 27aa16b81fSJiri Olsa if (!map) { 28aa16b81fSJiri Olsa pr_debug("failed to get stack map\n"); 29763d7f5fSMasanari Iida free(buf); 30aa16b81fSJiri Olsa return -1; 31aa16b81fSJiri Olsa } 32aa16b81fSJiri Olsa 33aa16b81fSJiri Olsa stack_size = map->end - sp; 34aa16b81fSJiri Olsa stack_size = stack_size > STACK_SIZE ? STACK_SIZE : stack_size; 35aa16b81fSJiri Olsa 36aa16b81fSJiri Olsa memcpy(buf, (void *) sp, stack_size); 37aa16b81fSJiri Olsa stack->data = (char *) buf; 38aa16b81fSJiri Olsa stack->size = stack_size; 39aa16b81fSJiri Olsa return 0; 40aa16b81fSJiri Olsa } 41aa16b81fSJiri Olsa 42aa16b81fSJiri Olsa int test__arch_unwind_sample(struct perf_sample *sample, 43aa16b81fSJiri Olsa struct thread *thread) 44aa16b81fSJiri Olsa { 45aa16b81fSJiri Olsa struct regs_dump *regs = &sample->user_regs; 46aa16b81fSJiri Olsa u64 *buf; 47aa16b81fSJiri Olsa 48aa16b81fSJiri Olsa buf = malloc(sizeof(u64) * PERF_REGS_MAX); 49aa16b81fSJiri Olsa if (!buf) { 50aa16b81fSJiri Olsa pr_debug("failed to allocate sample uregs data\n"); 51aa16b81fSJiri Olsa return -1; 52aa16b81fSJiri Olsa } 53aa16b81fSJiri Olsa 54aa16b81fSJiri Olsa perf_regs_load(buf); 55aa16b81fSJiri Olsa regs->abi = PERF_SAMPLE_REGS_ABI; 56aa16b81fSJiri Olsa regs->regs = buf; 57352ea45aSJiri Olsa regs->mask = PERF_REGS_MASK; 58aa16b81fSJiri Olsa 59aa16b81fSJiri Olsa return sample_ustack(sample, thread, buf); 60aa16b81fSJiri Olsa } 61