#include <string.h>
#include "perf_regs.h"
#include "thread.h"
#include "map.h"
#include "event.h"
#include "debug.h"
#include "tests/tests.h"
#include "arch-tests.h"

#define STACK_SIZE 8192

static int sample_ustack(struct perf_sample *sample,
			 struct thread *thread, u64 *regs)
{
	struct stack_dump *stack = &sample->user_stack;
	struct map *map;
	unsigned long sp;
	u64 stack_size, *buf;

	buf = malloc(STACK_SIZE);
	if (!buf) {
		pr_debug("failed to allocate sample uregs data\n");
		return -1;
	}

	sp = (unsigned long) regs[PERF_REG_X86_SP];

	map = map_groups__find(thread->mg, MAP__VARIABLE, (u64) sp);
	if (!map) {
		pr_debug("failed to get stack map\n");
		free(buf);
		return -1;
	}

	stack_size = map->end - sp;
	stack_size = stack_size > STACK_SIZE ? STACK_SIZE : stack_size;

	memcpy(buf, (void *) sp, stack_size);
	stack->data = (char *) buf;
	stack->size = stack_size;
	return 0;
}

int test__arch_unwind_sample(struct perf_sample *sample,
			     struct thread *thread)
{
	struct regs_dump *regs = &sample->user_regs;
	u64 *buf;

	buf = malloc(sizeof(u64) * PERF_REGS_MAX);
	if (!buf) {
		pr_debug("failed to allocate sample uregs data\n");
		return -1;
	}

	perf_regs_load(buf);
	regs->abi  = PERF_SAMPLE_REGS_ABI;
	regs->regs = buf;
	regs->mask = PERF_REGS_MASK;

	return sample_ustack(sample, thread, buf);
}
ect> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>net-next plumbings</td><td class='sub right'>Tobias Klauser</td></tr></table>
<table class='tabs'><tr><td>
<a href='/cgit.cgi/linux/net-next.git/?h=nds-private-remove'>summary</a><a href='/cgit.cgi/linux/net-next.git/refs/?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>refs</a><a class='active' href='/cgit.cgi/linux/net-next.git/log/tools/testing/selftests/Makefile?h=nds-private-remove'>log</a><a href='/cgit.cgi/linux/net-next.git/tree/tools/testing/selftests/Makefile?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>tree</a><a href='/cgit.cgi/linux/net-next.git/commit/tools/testing/selftests/Makefile?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>commit</a><a href='/cgit.cgi/linux/net-next.git/diff/tools/testing/selftests/Makefile?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/linux/net-next.git/log/tools/testing/selftests/Makefile'>
<input type='hidden' name='h' value='nds-private-remove'/><input type='hidden' name='id' value='0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/log/?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>root</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>tools</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/testing?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>testing</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/testing/selftests?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>selftests</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/testing/selftests/Makefile?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c'>Makefile</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th class='left'>Age</th><th class='left'>Commit message (<a href='/cgit.cgi/linux/net-next.git/log/tools/testing/selftests/Makefile?h=nds-private-remove&amp;id=0de9b5db9fbf70e8d9a98eae8cbdf33f7c04252c&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Files</th><th class='left'>Lines</th></tr>