* [PATCH] objtool: Support Clang RAX DRAP sequence
@ 2026-03-17 0:47 Josh Poimboeuf
2026-03-17 8:18 ` Peter Zijlstra
2026-03-18 8:41 ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
0 siblings, 2 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2026-03-17 0:47 UTC (permalink / raw)
To: x86; +Cc: linux-kernel, Arnd Bergmann, Peter Zijlstra
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
Reported-by: Arnd Bergmann <arnd@arndb.de>
Closes: https://lore.kernel.org/cefefdd1-7b82-406d-8ff4-e4b167e45ee6@app.fastmail.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
arch/x86/include/asm/orc_types.h | 1 +
arch/x86/kernel/unwind_orc.c | 8 ++++++++
tools/arch/x86/include/asm/orc_types.h | 1 +
tools/objtool/arch/x86/decode.c | 3 +++
tools/objtool/arch/x86/orc.c | 5 +++++
5 files changed, 18 insertions(+)
diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
index e0125afa53fb..b3cc7970fa54 100644
--- a/arch/x86/include/asm/orc_types.h
+++ b/arch/x86/include/asm/orc_types.h
@@ -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
diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c
index f610fde2d5c4..32f7e918d3d9 100644
--- a/arch/x86/kernel/unwind_orc.c
+++ b/arch/x86/kernel/unwind_orc.c
@@ -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);
diff --git a/tools/arch/x86/include/asm/orc_types.h b/tools/arch/x86/include/asm/orc_types.h
index e0125afa53fb..b3cc7970fa54 100644
--- a/tools/arch/x86/include/asm/orc_types.h
+++ b/tools/arch/x86/include/asm/orc_types.h
@@ -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
diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c
index c5817829cdfa..5931b2393bd8 100644
--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -896,6 +896,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;
}
diff --git a/tools/objtool/arch/x86/orc.c b/tools/objtool/arch/x86/orc.c
index 735e150ca6b7..5494bb450ab5 100644
--- a/tools/objtool/arch/x86/orc.c
+++ b/tools/objtool/arch/x86/orc.c
@@ -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 "?";
}
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] objtool: Support Clang RAX DRAP sequence
2026-03-17 0:47 [PATCH] objtool: Support Clang RAX DRAP sequence Josh Poimboeuf
@ 2026-03-17 8:18 ` Peter Zijlstra
2026-03-17 15:30 ` Josh Poimboeuf
2026-03-18 8:41 ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
1 sibling, 1 reply; 7+ messages in thread
From: Peter Zijlstra @ 2026-03-17 8:18 UTC (permalink / raw)
To: Josh Poimboeuf; +Cc: x86, linux-kernel, Arnd Bergmann
On Mon, Mar 16, 2026 at 05:47:56PM -0700, Josh Poimboeuf wrote:
> 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
>
> Reported-by: Arnd Bergmann <arnd@arndb.de>
> Closes: https://lore.kernel.org/cefefdd1-7b82-406d-8ff4-e4b167e45ee6@app.fastmail.com
> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
> ---
> arch/x86/include/asm/orc_types.h | 1 +
> arch/x86/kernel/unwind_orc.c | 8 ++++++++
> tools/arch/x86/include/asm/orc_types.h | 1 +
> tools/objtool/arch/x86/decode.c | 3 +++
> tools/objtool/arch/x86/orc.c | 5 +++++
> 5 files changed, 18 insertions(+)
>
> diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
> index e0125afa53fb..b3cc7970fa54 100644
> --- a/arch/x86/include/asm/orc_types.h
> +++ b/arch/x86/include/asm/orc_types.h
> @@ -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
I'm 'annoyed' at the placement of that register. I know its not
important, but I can't silence my OCD saying that AX should come before
DX.
Also, SP comes before BP and both before DI.
Something like so perhaps?
---
diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
index e0125afa53fb..5df398761c70 100644
--- a/arch/x86/include/asm/orc_types.h
+++ b/arch/x86/include/asm/orc_types.h
@@ -28,15 +28,19 @@
* 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_BP_INDIRECT 10
+
#define ORC_REG_MAX 15
#define ORC_TYPE_UNDEFINED 0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] objtool: Support Clang RAX DRAP sequence
2026-03-17 8:18 ` Peter Zijlstra
@ 2026-03-17 15:30 ` Josh Poimboeuf
2026-03-17 20:35 ` Peter Zijlstra
0 siblings, 1 reply; 7+ messages in thread
From: Josh Poimboeuf @ 2026-03-17 15:30 UTC (permalink / raw)
To: Peter Zijlstra; +Cc: x86, linux-kernel, Arnd Bergmann
On Tue, Mar 17, 2026 at 09:18:25AM +0100, Peter Zijlstra wrote:
> On Mon, Mar 16, 2026 at 05:47:56PM -0700, Josh Poimboeuf wrote:
> > 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
> >
> > Reported-by: Arnd Bergmann <arnd@arndb.de>
> > Closes: https://lore.kernel.org/cefefdd1-7b82-406d-8ff4-e4b167e45ee6@app.fastmail.com
> > Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
> > ---
> > arch/x86/include/asm/orc_types.h | 1 +
> > arch/x86/kernel/unwind_orc.c | 8 ++++++++
> > tools/arch/x86/include/asm/orc_types.h | 1 +
> > tools/objtool/arch/x86/decode.c | 3 +++
> > tools/objtool/arch/x86/orc.c | 5 +++++
> > 5 files changed, 18 insertions(+)
> >
> > diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
> > index e0125afa53fb..b3cc7970fa54 100644
> > --- a/arch/x86/include/asm/orc_types.h
> > +++ b/arch/x86/include/asm/orc_types.h
> > @@ -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
>
> I'm 'annoyed' at the placement of that register. I know its not
> important, but I can't silence my OCD saying that AX should come before
> DX.
>
> Also, SP comes before BP and both before DI.
>
> Something like so perhaps?
That bothered me too, but I was trying to keep the diffstat down. But
sure, why not...
What about the switch statements? Should we reorder them too while at
it? If so, starting to feel like a separate patch.
--
Josh
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] objtool: Support Clang RAX DRAP sequence
2026-03-17 15:30 ` Josh Poimboeuf
@ 2026-03-17 20:35 ` Peter Zijlstra
2026-03-17 22:44 ` Josh Poimboeuf
0 siblings, 1 reply; 7+ messages in thread
From: Peter Zijlstra @ 2026-03-17 20:35 UTC (permalink / raw)
To: Josh Poimboeuf; +Cc: x86, linux-kernel, Arnd Bergmann
On Tue, Mar 17, 2026 at 08:30:59AM -0700, Josh Poimboeuf wrote:
> On Tue, Mar 17, 2026 at 09:18:25AM +0100, Peter Zijlstra wrote:
> > On Mon, Mar 16, 2026 at 05:47:56PM -0700, Josh Poimboeuf wrote:
> > > 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
> > >
> > > Reported-by: Arnd Bergmann <arnd@arndb.de>
> > > Closes: https://lore.kernel.org/cefefdd1-7b82-406d-8ff4-e4b167e45ee6@app.fastmail.com
> > > Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
> > > ---
> > > arch/x86/include/asm/orc_types.h | 1 +
> > > arch/x86/kernel/unwind_orc.c | 8 ++++++++
> > > tools/arch/x86/include/asm/orc_types.h | 1 +
> > > tools/objtool/arch/x86/decode.c | 3 +++
> > > tools/objtool/arch/x86/orc.c | 5 +++++
> > > 5 files changed, 18 insertions(+)
> > >
> > > diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
> > > index e0125afa53fb..b3cc7970fa54 100644
> > > --- a/arch/x86/include/asm/orc_types.h
> > > +++ b/arch/x86/include/asm/orc_types.h
> > > @@ -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
> >
> > I'm 'annoyed' at the placement of that register. I know its not
> > important, but I can't silence my OCD saying that AX should come before
> > DX.
> >
> > Also, SP comes before BP and both before DI.
> >
> > Something like so perhaps?
>
> That bothered me too, but I was trying to keep the diffstat down. But
> sure, why not...
>
> What about the switch statements? Should we reorder them too while at
> it? If so, starting to feel like a separate patch.
Agreed, switch statement order should match the definition order. And
yes separate patch is fine.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] objtool: Support Clang RAX DRAP sequence
2026-03-17 20:35 ` Peter Zijlstra
@ 2026-03-17 22:44 ` Josh Poimboeuf
2026-03-18 8:28 ` Peter Zijlstra
0 siblings, 1 reply; 7+ messages in thread
From: Josh Poimboeuf @ 2026-03-17 22:44 UTC (permalink / raw)
To: Peter Zijlstra; +Cc: x86, linux-kernel, Arnd Bergmann
On Tue, Mar 17, 2026 at 09:35:02PM +0100, Peter Zijlstra wrote:
> On Tue, Mar 17, 2026 at 08:30:59AM -0700, Josh Poimboeuf wrote:
> > On Tue, Mar 17, 2026 at 09:18:25AM +0100, Peter Zijlstra wrote:
> > > On Mon, Mar 16, 2026 at 05:47:56PM -0700, Josh Poimboeuf wrote:
> > > > 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
> > > >
> > > > Reported-by: Arnd Bergmann <arnd@arndb.de>
> > > > Closes: https://lore.kernel.org/cefefdd1-7b82-406d-8ff4-e4b167e45ee6@app.fastmail.com
> > > > Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
> > > > ---
> > > > arch/x86/include/asm/orc_types.h | 1 +
> > > > arch/x86/kernel/unwind_orc.c | 8 ++++++++
> > > > tools/arch/x86/include/asm/orc_types.h | 1 +
> > > > tools/objtool/arch/x86/decode.c | 3 +++
> > > > tools/objtool/arch/x86/orc.c | 5 +++++
> > > > 5 files changed, 18 insertions(+)
> > > >
> > > > diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
> > > > index e0125afa53fb..b3cc7970fa54 100644
> > > > --- a/arch/x86/include/asm/orc_types.h
> > > > +++ b/arch/x86/include/asm/orc_types.h
> > > > @@ -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
> > >
> > > I'm 'annoyed' at the placement of that register. I know its not
> > > important, but I can't silence my OCD saying that AX should come before
> > > DX.
> > >
> > > Also, SP comes before BP and both before DI.
> > >
> > > Something like so perhaps?
> >
> > That bothered me too, but I was trying to keep the diffstat down. But
> > sure, why not...
> >
> > What about the switch statements? Should we reorder them too while at
> > it? If so, starting to feel like a separate patch.
>
> Agreed, switch statement order should match the definition order. And
> yes separate patch is fine.
Ok, we can add the following on top:
---8<---
From: Josh Poimboeuf <jpoimboe@kernel.org>
Subject: [PATCH] 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: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
arch/x86/include/asm/orc_types.h | 10 +++---
arch/x86/kernel/unwind_orc.c | 48 +++++++++++++++-----------
tools/arch/x86/include/asm/orc_types.h | 10 +++---
tools/objtool/arch/x86/decode.c | 21 ++++++-----
tools/objtool/arch/x86/orc.c | 36 +++++++++----------
5 files changed, 67 insertions(+), 58 deletions(-)
diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
index b3cc7970fa54..5837c2bb277f 100644
--- a/arch/x86/include/asm/orc_types.h
+++ b/arch/x86/include/asm/orc_types.h
@@ -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
diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c
index 32f7e918d3d9..6407bc9256bf 100644
--- a/arch/x86/kernel/unwind_orc.c
+++ b/arch/x86/kernel/unwind_orc.c
@@ -546,25 +546,15 @@ 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",
- (void *)state->ip);
- goto err;
- }
- break;
+ /*
+ * 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_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;
- }
- break;
-
- case ORC_REG_DI:
- if (!get_reg(state, offsetof(struct pt_regs, di), &sp)) {
- orc_warn_current("missing RDI value at %pB\n",
+ 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;
}
@@ -578,9 +568,25 @@ 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",
+ case ORC_REG_DI:
+ if (!get_reg(state, offsetof(struct pt_regs, di), &sp)) {
+ orc_warn_current("missing RDI value at %pB\n",
+ (void *)state->ip);
+ goto err;
+ }
+ break;
+
+ 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_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;
}
diff --git a/tools/arch/x86/include/asm/orc_types.h b/tools/arch/x86/include/asm/orc_types.h
index b3cc7970fa54..5837c2bb277f 100644
--- a/tools/arch/x86/include/asm/orc_types.h
+++ b/tools/arch/x86/include/asm/orc_types.h
@@ -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
diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c
index 5931b2393bd8..350b8ee6e776 100644
--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -875,14 +875,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;
@@ -890,14 +896,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;
+ case ORC_REG_SP_INDIRECT:
+ *base = CFI_SP_INDIRECT;
break;
- case ORC_REG_DX:
- *base = CFI_DX;
- break;
- case ORC_REG_AX:
- *base = CFI_AX;
+ case ORC_REG_BP_INDIRECT:
+ *base = CFI_BP_INDIRECT;
break;
default:
return -1;
diff --git a/tools/objtool/arch/x86/orc.c b/tools/objtool/arch/x86/orc.c
index 5494bb450ab5..eff078ecc945 100644
--- a/tools/objtool/arch/x86/orc.c
+++ b/tools/objtool/arch/x86/orc.c
@@ -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;
+ case CFI_SP_INDIRECT:
+ orc->sp_reg = ORC_REG_SP_INDIRECT;
break;
- case CFI_DX:
- orc->sp_reg = ORC_REG_DX;
- 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 "?";
}
--
2.53.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] objtool: Support Clang RAX DRAP sequence
2026-03-17 22:44 ` Josh Poimboeuf
@ 2026-03-18 8:28 ` Peter Zijlstra
0 siblings, 0 replies; 7+ messages in thread
From: Peter Zijlstra @ 2026-03-18 8:28 UTC (permalink / raw)
To: Josh Poimboeuf; +Cc: x86, linux-kernel, Arnd Bergmann
On Tue, Mar 17, 2026 at 03:44:47PM -0700, Josh Poimboeuf wrote:
> Ok, we can add the following on top:
>
> ---8<---
>
> From: Josh Poimboeuf <jpoimboe@kernel.org>
> Subject: [PATCH] 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: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Excellent, thanks!
^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip: objtool/core] objtool: Support Clang RAX DRAP sequence
2026-03-17 0:47 [PATCH] objtool: Support Clang RAX DRAP sequence Josh Poimboeuf
2026-03-17 8:18 ` Peter Zijlstra
@ 2026-03-18 8:41 ` tip-bot2 for Josh Poimboeuf
1 sibling, 0 replies; 7+ messages in thread
From: tip-bot2 for Josh Poimboeuf @ 2026-03-18 8:41 UTC (permalink / raw)
To: linux-tip-commits
Cc: Arnd Bergmann, Josh Poimboeuf, Peter Zijlstra (Intel), x86,
linux-kernel
The following commit has been merged into the objtool/core branch of tip:
Commit-ID: 96f3b16a9de552538b810f773645d43f3b661b50
Gitweb: https://git.kernel.org/tip/96f3b16a9de552538b810f773645d43f3b661b50
Author: Josh Poimboeuf <jpoimboe@kernel.org>
AuthorDate: Mon, 16 Mar 2026 17:47:56 -07:00
Committer: Peter Zijlstra <peterz@infradead.org>
CommitterDate: Wed, 18 Mar 2026 09:38:52 +01:00
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: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/3f33dc720b83dc6d3a2b7094f75a5c90a0b1cbc5.1773708458.git.jpoimboe@kernel.org
---
arch/x86/include/asm/orc_types.h | 1 +
arch/x86/kernel/unwind_orc.c | 8 ++++++++
tools/arch/x86/include/asm/orc_types.h | 1 +
tools/objtool/arch/x86/decode.c | 3 +++
tools/objtool/arch/x86/orc.c | 5 +++++
5 files changed, 18 insertions(+)
diff --git a/arch/x86/include/asm/orc_types.h b/arch/x86/include/asm/orc_types.h
index e0125af..b3cc797 100644
--- a/arch/x86/include/asm/orc_types.h
+++ b/arch/x86/include/asm/orc_types.h
@@ -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
diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c
index f610fde..32f7e91 100644
--- a/arch/x86/kernel/unwind_orc.c
+++ b/arch/x86/kernel/unwind_orc.c
@@ -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);
diff --git a/tools/arch/x86/include/asm/orc_types.h b/tools/arch/x86/include/asm/orc_types.h
index e0125af..b3cc797 100644
--- a/tools/arch/x86/include/asm/orc_types.h
+++ b/tools/arch/x86/include/asm/orc_types.h
@@ -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
diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c
index 73bfea2..c3a10f3 100644
--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -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;
}
diff --git a/tools/objtool/arch/x86/orc.c b/tools/objtool/arch/x86/orc.c
index 735e150..5494bb4 100644
--- a/tools/objtool/arch/x86/orc.c
+++ b/tools/objtool/arch/x86/orc.c
@@ -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 "?";
}
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-03-18 8:41 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-17 0:47 [PATCH] objtool: Support Clang RAX DRAP sequence Josh Poimboeuf
2026-03-17 8:18 ` Peter Zijlstra
2026-03-17 15:30 ` Josh Poimboeuf
2026-03-17 20:35 ` Peter Zijlstra
2026-03-17 22:44 ` Josh Poimboeuf
2026-03-18 8:28 ` Peter Zijlstra
2026-03-18 8:41 ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox