diff options
Diffstat (limited to 'tools/perf/arch/x86/util/unwind.c')
| -rw-r--r-- | tools/perf/arch/x86/util/unwind.c | 111 | 
1 files changed, 111 insertions, 0 deletions
diff --git a/tools/perf/arch/x86/util/unwind.c b/tools/perf/arch/x86/util/unwind.c new file mode 100644 index 00000000000..78d956eff96 --- /dev/null +++ b/tools/perf/arch/x86/util/unwind.c @@ -0,0 +1,111 @@ + +#include <errno.h> +#include <libunwind.h> +#include "perf_regs.h" +#include "../../util/unwind.h" + +#ifdef ARCH_X86_64 +int unwind__arch_reg_id(int regnum) +{ +	int id; + +	switch (regnum) { +	case UNW_X86_64_RAX: +		id = PERF_REG_X86_AX; +		break; +	case UNW_X86_64_RDX: +		id = PERF_REG_X86_DX; +		break; +	case UNW_X86_64_RCX: +		id = PERF_REG_X86_CX; +		break; +	case UNW_X86_64_RBX: +		id = PERF_REG_X86_BX; +		break; +	case UNW_X86_64_RSI: +		id = PERF_REG_X86_SI; +		break; +	case UNW_X86_64_RDI: +		id = PERF_REG_X86_DI; +		break; +	case UNW_X86_64_RBP: +		id = PERF_REG_X86_BP; +		break; +	case UNW_X86_64_RSP: +		id = PERF_REG_X86_SP; +		break; +	case UNW_X86_64_R8: +		id = PERF_REG_X86_R8; +		break; +	case UNW_X86_64_R9: +		id = PERF_REG_X86_R9; +		break; +	case UNW_X86_64_R10: +		id = PERF_REG_X86_R10; +		break; +	case UNW_X86_64_R11: +		id = PERF_REG_X86_R11; +		break; +	case UNW_X86_64_R12: +		id = PERF_REG_X86_R12; +		break; +	case UNW_X86_64_R13: +		id = PERF_REG_X86_R13; +		break; +	case UNW_X86_64_R14: +		id = PERF_REG_X86_R14; +		break; +	case UNW_X86_64_R15: +		id = PERF_REG_X86_R15; +		break; +	case UNW_X86_64_RIP: +		id = PERF_REG_X86_IP; +		break; +	default: +		pr_err("unwind: invalid reg id %d\n", regnum); +		return -EINVAL; +	} + +	return id; +} +#else +int unwind__arch_reg_id(int regnum) +{ +	int id; + +	switch (regnum) { +	case UNW_X86_EAX: +		id = PERF_REG_X86_AX; +		break; +	case UNW_X86_EDX: +		id = PERF_REG_X86_DX; +		break; +	case UNW_X86_ECX: +		id = PERF_REG_X86_CX; +		break; +	case UNW_X86_EBX: +		id = PERF_REG_X86_BX; +		break; +	case UNW_X86_ESI: +		id = PERF_REG_X86_SI; +		break; +	case UNW_X86_EDI: +		id = PERF_REG_X86_DI; +		break; +	case UNW_X86_EBP: +		id = PERF_REG_X86_BP; +		break; +	case UNW_X86_ESP: +		id = PERF_REG_X86_SP; +		break; +	case UNW_X86_EIP: +		id = PERF_REG_X86_IP; +		break; +	default: +		pr_err("unwind: invalid reg id %d\n", regnum); +		return -EINVAL; +	} + +	return id; +} +#endif /* ARCH_X86_64 */  |