Commit 1735858c authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Peter Zijlstra
Browse files

objtool/x86: Reorder ORC register numbering



Reorder the ORC register values so their ordering matches the x86
instruction set register encodings.

No functional change intended.

Suggested-by: default avatarPeter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
parent 96f3b16a
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -28,16 +28,16 @@
 * and GCC realigned stacks.
 */
#define ORC_REG_UNDEFINED		0
#define ORC_REG_PREV_SP			1
#define ORC_REG_AX			1
#define ORC_REG_DX			2
#define ORC_REG_DI			3
#define ORC_REG_SP			3
#define ORC_REG_BP			4
#define ORC_REG_SP			5
#define ORC_REG_DI			5
#define ORC_REG_R10			6
#define ORC_REG_R13			7
#define ORC_REG_BP_INDIRECT		8
#define ORC_REG_PREV_SP			8
#define ORC_REG_SP_INDIRECT		9
#define ORC_REG_AX			10
#define ORC_REG_BP_INDIRECT		10
#define ORC_REG_MAX			15

#define ORC_TYPE_UNDEFINED		0
+18 −12
Original line number Diff line number Diff line
@@ -546,17 +546,23 @@ bool unwind_next_frame(struct unwind_state *state)
		indirect = true;
		break;

	case ORC_REG_R10:
		if (!get_reg(state, offsetof(struct pt_regs, r10), &sp)) {
			orc_warn_current("missing R10 value at %pB\n",
	/*
	 * Any of the below registers may temporarily hold the stack pointer,
	 * typically during a DRAP stack realignment sequence or some other
	 * stack swizzle.
	 */

	case ORC_REG_AX:
		if (!get_reg(state, offsetof(struct pt_regs, ax), &sp)) {
			orc_warn_current("missing AX value at %pB\n",
					 (void *)state->ip);
			goto err;
		}
		break;

	case ORC_REG_R13:
		if (!get_reg(state, offsetof(struct pt_regs, r13), &sp)) {
			orc_warn_current("missing R13 value at %pB\n",
	case ORC_REG_DX:
		if (!get_reg(state, offsetof(struct pt_regs, dx), &sp)) {
			orc_warn_current("missing DX value at %pB\n",
					 (void *)state->ip);
			goto err;
		}
@@ -570,17 +576,17 @@ bool unwind_next_frame(struct unwind_state *state)
		}
		break;

	case ORC_REG_DX:
		if (!get_reg(state, offsetof(struct pt_regs, dx), &sp)) {
			orc_warn_current("missing DX value at %pB\n",
	case ORC_REG_R10:
		if (!get_reg(state, offsetof(struct pt_regs, r10), &sp)) {
			orc_warn_current("missing R10 value at %pB\n",
					 (void *)state->ip);
			goto err;
		}
		break;

	case ORC_REG_AX:
		if (!get_reg(state, offsetof(struct pt_regs, ax), &sp)) {
			orc_warn_current("missing AX value at %pB\n",
	case ORC_REG_R13:
		if (!get_reg(state, offsetof(struct pt_regs, r13), &sp)) {
			orc_warn_current("missing R13 value at %pB\n",
					 (void *)state->ip);
			goto err;
		}
+5 −5
Original line number Diff line number Diff line
@@ -28,16 +28,16 @@
 * and GCC realigned stacks.
 */
#define ORC_REG_UNDEFINED		0
#define ORC_REG_PREV_SP			1
#define ORC_REG_AX			1
#define ORC_REG_DX			2
#define ORC_REG_DI			3
#define ORC_REG_SP			3
#define ORC_REG_BP			4
#define ORC_REG_SP			5
#define ORC_REG_DI			5
#define ORC_REG_R10			6
#define ORC_REG_R13			7
#define ORC_REG_BP_INDIRECT		8
#define ORC_REG_PREV_SP			8
#define ORC_REG_SP_INDIRECT		9
#define ORC_REG_AX			10
#define ORC_REG_BP_INDIRECT		10
#define ORC_REG_MAX			15

#define ORC_TYPE_UNDEFINED		0
+12 −9
Original line number Diff line number Diff line
@@ -891,14 +891,20 @@ int arch_decode_hint_reg(u8 sp_reg, int *base)
	case ORC_REG_UNDEFINED:
		*base = CFI_UNDEFINED;
		break;
	case ORC_REG_AX:
		*base = CFI_AX;
		break;
	case ORC_REG_DX:
		*base = CFI_DX;
		break;
	case ORC_REG_SP:
		*base = CFI_SP;
		break;
	case ORC_REG_BP:
		*base = CFI_BP;
		break;
	case ORC_REG_SP_INDIRECT:
		*base = CFI_SP_INDIRECT;
	case ORC_REG_DI:
		*base = CFI_DI;
		break;
	case ORC_REG_R10:
		*base = CFI_R10;
@@ -906,14 +912,11 @@ int arch_decode_hint_reg(u8 sp_reg, int *base)
	case ORC_REG_R13:
		*base = CFI_R13;
		break;
	case ORC_REG_DI:
		*base = CFI_DI;
		break;
	case ORC_REG_DX:
		*base = CFI_DX;
	case ORC_REG_SP_INDIRECT:
		*base = CFI_SP_INDIRECT;
		break;
	case ORC_REG_AX:
		*base = CFI_AX;
	case ORC_REG_BP_INDIRECT:
		*base = CFI_BP_INDIRECT;
		break;
	default:
		return -1;
+18 −18
Original line number Diff line number Diff line
@@ -46,17 +46,20 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_state *cfi, struct instruct
	orc->signal = cfi->signal;

	switch (cfi->cfa.base) {
	case CFI_AX:
		orc->sp_reg = ORC_REG_AX;
		break;
	case CFI_DX:
		orc->sp_reg = ORC_REG_DX;
		break;
	case CFI_SP:
		orc->sp_reg = ORC_REG_SP;
		break;
	case CFI_SP_INDIRECT:
		orc->sp_reg = ORC_REG_SP_INDIRECT;
		break;
	case CFI_BP:
		orc->sp_reg = ORC_REG_BP;
		break;
	case CFI_BP_INDIRECT:
		orc->sp_reg = ORC_REG_BP_INDIRECT;
	case CFI_DI:
		orc->sp_reg = ORC_REG_DI;
		break;
	case CFI_R10:
		orc->sp_reg = ORC_REG_R10;
@@ -64,14 +67,11 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_state *cfi, struct instruct
	case CFI_R13:
		orc->sp_reg = ORC_REG_R13;
		break;
	case CFI_DI:
		orc->sp_reg = ORC_REG_DI;
		break;
	case CFI_DX:
		orc->sp_reg = ORC_REG_DX;
	case CFI_SP_INDIRECT:
		orc->sp_reg = ORC_REG_SP_INDIRECT;
		break;
	case CFI_AX:
		orc->sp_reg = ORC_REG_AX;
	case CFI_BP_INDIRECT:
		orc->sp_reg = ORC_REG_BP_INDIRECT;
		break;
	default:
		ERROR_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base);
@@ -125,24 +125,24 @@ static const char *reg_name(unsigned int reg)
	switch (reg) {
	case ORC_REG_PREV_SP:
		return "prevsp";
	case ORC_REG_AX:
		return "ax";
	case ORC_REG_DX:
		return "dx";
	case ORC_REG_DI:
		return "di";
	case ORC_REG_BP:
		return "bp";
	case ORC_REG_SP:
		return "sp";
	case ORC_REG_DI:
		return "di";
	case ORC_REG_R10:
		return "r10";
	case ORC_REG_R13:
		return "r13";
	case ORC_REG_BP_INDIRECT:
		return "bp(ind)";
	case ORC_REG_SP_INDIRECT:
		return "sp(ind)";
	case ORC_REG_AX:
		return "ax";
	case ORC_REG_BP_INDIRECT:
		return "bp(ind)";
	default:
		return "?";
	}