#include <elfutils/libdwfl.h>
#include "../../util/unwind-libdw.h"
#include "../../util/perf_regs.h"

bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
{
	struct unwind_info *ui = arg;
	struct regs_dump *user_regs = &ui->sample->user_regs;
	Dwarf_Word dwarf_regs[17];
	unsigned nregs;

#define REG(r) ({						\
	Dwarf_Word val = 0;					\
	perf_reg_value(&val, user_regs, PERF_REG_X86_##r);	\
	val;							\
})

	if (user_regs->abi == PERF_SAMPLE_REGS_ABI_32) {
		dwarf_regs[0] = REG(AX);
		dwarf_regs[1] = REG(CX);
		dwarf_regs[2] = REG(DX);
		dwarf_regs[3] = REG(BX);
		dwarf_regs[4] = REG(SP);
		dwarf_regs[5] = REG(BP);
		dwarf_regs[6] = REG(SI);
		dwarf_regs[7] = REG(DI);
		dwarf_regs[8] = REG(IP);
		nregs = 9;
	} else {
		dwarf_regs[0]  = REG(AX);
		dwarf_regs[1]  = REG(DX);
		dwarf_regs[2]  = REG(CX);
		dwarf_regs[3]  = REG(BX);
		dwarf_regs[4]  = REG(SI);
		dwarf_regs[5]  = REG(DI);
		dwarf_regs[6]  = REG(BP);
		dwarf_regs[7]  = REG(SP);
		dwarf_regs[8]  = REG(R8);
		dwarf_regs[9]  = REG(R9);
		dwarf_regs[10] = REG(R10);
		dwarf_regs[11] = REG(R11);
		dwarf_regs[12] = REG(R12);
		dwarf_regs[13] = REG(R13);
		dwarf_regs[14] = REG(R14);
		dwarf_regs[15] = REG(R15);
		dwarf_regs[16] = REG(IP);
		nregs = 17;
	}

	return dwfl_thread_state_registers(thread, 0, nregs, dwarf_regs);
}
n>
</select> <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=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>refs</a><a class='active' href='/cgit.cgi/linux/net-next.git/log/sound/soc/codecs/adau1373.h?h=nds-private-remove'>log</a><a href='/cgit.cgi/linux/net-next.git/tree/sound/soc/codecs/adau1373.h?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>tree</a><a href='/cgit.cgi/linux/net-next.git/commit/sound/soc/codecs/adau1373.h?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>commit</a><a href='/cgit.cgi/linux/net-next.git/diff/sound/soc/codecs/adau1373.h?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/linux/net-next.git/log/sound/soc/codecs/adau1373.h'>
<input type='hidden' name='h' value='nds-private-remove'/><input type='hidden' name='id' value='f5f7bebc91ab378dea5aad5277c4d283e46472d9'/><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=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>root</a>/<a href='/cgit.cgi/linux/net-next.git/log/sound?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>sound</a>/<a href='/cgit.cgi/linux/net-next.git/log/sound/soc?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>soc</a>/<a href='/cgit.cgi/linux/net-next.git/log/sound/soc/codecs?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>codecs</a>/<a href='/cgit.cgi/linux/net-next.git/log/sound/soc/codecs/adau1373.h?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9'>adau1373.h</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/sound/soc/codecs/adau1373.h?h=nds-private-remove&amp;id=f5f7bebc91ab378dea5aad5277c4d283e46472d9&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Files</th><th class='left'>Lines</th></tr>