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