]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
objtool: Support Clang RAX DRAP sequence
authorJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 17 Mar 2026 00:47:56 +0000 (17:47 -0700)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 18 Mar 2026 08:38:52 +0000 (09:38 +0100)
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
arch/x86/kernel/unwind_orc.c
tools/arch/x86/include/asm/orc_types.h
tools/objtool/arch/x86/decode.c
tools/objtool/arch/x86/orc.c

index e0125afa53fb9d731effcb755edf3902a325a91a..b3cc7970fa548f39c8c4c4702a8b20b028d3cba2 100644 (file)
@@ -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
index f610fde2d5c4b21b53a5bb3c3ed2a3fe4f1b7f0c..32f7e918d3d9f9013284ab3fa31161501e20edf6 100644 (file)
@@ -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);
index e0125afa53fb9d731effcb755edf3902a325a91a..b3cc7970fa548f39c8c4c4702a8b20b028d3cba2 100644 (file)
@@ -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
index 73bfea220d1bf613ea94048158e6336ba88523fb..c3a10f3c72d996daf00a111d45dee7dc464f2748 100644 (file)
@@ -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;
        }
index 735e150ca6b73da7292bcc7dfe28b0160cfe174d..5494bb450ab552d048e357c61f47667df5131bc6 100644 (file)
@@ -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 "?";
        }