Commit 96f3b16a authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Peter Zijlstra
Browse files

objtool: Support Clang RAX DRAP sequence

Recent Clang can use RAX as a temporary register for the DRAP stack
alignment sequence.  Add support for that.

Fixes the following warning:

  vmlinux.o: error: objtool: vmw_host_printf+0xd: unknown CFA base reg 0

Closes: https://lore.kernel.org/cefefdd1-7b82-406d-8ff4-e4b167e45ee6@app.fastmail.com


Reported-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/3f33dc720b83dc6d3a2b7094f75a5c90a0b1cbc5.1773708458.git.jpoimboe@kernel.org
parent 51a0b7c4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#define ORC_REG_R13			7
#define ORC_REG_BP_INDIRECT		8
#define ORC_REG_SP_INDIRECT		9
#define ORC_REG_AX			10
#define ORC_REG_MAX			15

#define ORC_TYPE_UNDEFINED		0
+8 −0
Original line number Diff line number Diff line
@@ -578,6 +578,14 @@ bool unwind_next_frame(struct unwind_state *state)
		}
		break;

	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;

	default:
		orc_warn("unknown SP base reg %d at %pB\n",
			 orc->sp_reg, (void *)state->ip);
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#define ORC_REG_R13			7
#define ORC_REG_BP_INDIRECT		8
#define ORC_REG_SP_INDIRECT		9
#define ORC_REG_AX			10
#define ORC_REG_MAX			15

#define ORC_TYPE_UNDEFINED		0
+3 −0
Original line number Diff line number Diff line
@@ -912,6 +912,9 @@ int arch_decode_hint_reg(u8 sp_reg, int *base)
	case ORC_REG_DX:
		*base = CFI_DX;
		break;
	case ORC_REG_AX:
		*base = CFI_AX;
		break;
	default:
		return -1;
	}
+5 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ int init_orc_entry(struct orc_entry *orc, struct cfi_state *cfi, struct instruct
	case CFI_DX:
		orc->sp_reg = ORC_REG_DX;
		break;
	case CFI_AX:
		orc->sp_reg = ORC_REG_AX;
		break;
	default:
		ERROR_INSN(insn, "unknown CFA base reg %d", cfi->cfa.base);
		return -1;
@@ -138,6 +141,8 @@ static const char *reg_name(unsigned int reg)
		return "bp(ind)";
	case ORC_REG_SP_INDIRECT:
		return "sp(ind)";
	case ORC_REG_AX:
		return "ax";
	default:
		return "?";
	}