From nobody Thu Apr 9 16:34:36 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE7953EFD14 for ; Fri, 6 Mar 2026 17:35:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772818516; cv=none; b=mA+HJwMFhcgbbtRGJqpDAAFmtiwIN/CoTBgDpyFSVeiowW+Z9mDjxlr8q9ZuhH1QeJwEPH6Z1C5yR1JJzAacLChPNPW4naZYgn9LX90ZvBhnS4rQWHvQSxJ5sRYA6DxErm/0IK2pjOBEav5iS34tDo04Sr8P7RV6c1iwwubfHNw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772818516; c=relaxed/simple; bh=akvhMR4zhDKIZVW9T6Q6RLgXnlYIwoG7rDH3jC3b8LI=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=jmrh1XmQPomVbfbN1uyccO7Ez+aROIn1GwCOyoBTXGR0U0Xo7Qd5Fim/8z0xa1F6hhDkUrjCjiaR2NJ9txkwOtd2uP5ZXfabubi3KX/7JLjuqgttq8j2+iSF/6FpZTAyI491+30G016AUmEHEK74WF1xGP2EmjdFlJ5b2ObSvaQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oyqUtE/X; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oyqUtE/X" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 578DCC4CEF7; Fri, 6 Mar 2026 17:35:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772818516; bh=akvhMR4zhDKIZVW9T6Q6RLgXnlYIwoG7rDH3jC3b8LI=; h=From:To:Cc:Subject:Date:From; b=oyqUtE/XH6xfo9brktJpJ2wN32adH/miqzkEbNMEcaCzLTjqi0ohE5bIHCslBwTdr K0aWbpB78YVkzdv4VduzNS6cpvqKc8nXZVfxPEXArfmQdQ2pfXDYanmookGzAL+BRB Hrg1hRaeHFH76uGWLKznabHqWj1meDiuDifrN4NyblwC+oymI9/JTKe0ELhP/Fau2I 2O6RY7dnkdAL7CwS9J89EMSEZQlWMt0jGyktxTCj5P/BhWFa/0AjCjJYP3eU+QhAWD OhqGohRBX6vFpj+5og5t19t/F5WkeqlAdGW1/OuChsrnNJHVIp1NZpH3NN0Emu7MM+ wTKhp19e6IdaQ== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Arnd Bergmann Subject: [PATCH] objtool: Handle Clang RSP musical chairs Date: Fri, 6 Mar 2026 09:35:06 -0800 Message-ID: <240e6a172cc73292499334a3724d02ccb3247fc7.1772818491.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For no apparent reason (possibly related to CONFIG_KMSAN), Clang can randomly pass the value of RSP to other registers and then back again to RSP. Handle that accordingly. Fixes the following warnings: drivers/input/misc/uinput.o: warning: objtool: uinput_str_to_user+0x165: = undefined stack state drivers/input/misc/uinput.o: warning: objtool: uinput_str_to_user+0x165: = unknown CFA base reg -1 Reported-by: Arnd Bergmann Closes: https://lore.kernel.org/90956545-2066-46e3-b547-10c884582eb0@app.fa= stmail.com Signed-off-by: Josh Poimboeuf --- tools/objtool/arch/x86/decode.c | 68 +++++++++++++-------------------- tools/objtool/check.c | 14 +++++++ 2 files changed, 40 insertions(+), 42 deletions(-) diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decod= e.c index 73bfea220d1b..c5817829cdfa 100644 --- a/tools/objtool/arch/x86/decode.c +++ b/tools/objtool/arch/x86/decode.c @@ -395,52 +395,36 @@ int arch_decode_instruction(struct objtool_file *file= , const struct section *sec if (!rex_w) break; =20 - if (modrm_reg =3D=3D CFI_SP) { - - if (mod_is_reg()) { - /* mov %rsp, reg */ - ADD_OP(op) { - op->src.type =3D OP_SRC_REG; - op->src.reg =3D CFI_SP; - op->dest.type =3D OP_DEST_REG; - op->dest.reg =3D modrm_rm; - } - break; - - } else { - /* skip RIP relative displacement */ - if (is_RIP()) - break; - - /* skip nontrivial SIB */ - if (have_SIB()) { - modrm_rm =3D sib_base; - if (sib_index !=3D CFI_SP) - break; - } - - /* mov %rsp, disp(%reg) */ - ADD_OP(op) { - op->src.type =3D OP_SRC_REG; - op->src.reg =3D CFI_SP; - op->dest.type =3D OP_DEST_REG_INDIRECT; - op->dest.reg =3D modrm_rm; - op->dest.offset =3D ins.displacement.value; - } - break; - } - - break; - } - - if (rm_is_reg(CFI_SP)) { - - /* mov reg, %rsp */ + if (mod_is_reg()) { + /* mov reg, reg */ ADD_OP(op) { op->src.type =3D OP_SRC_REG; op->src.reg =3D modrm_reg; op->dest.type =3D OP_DEST_REG; - op->dest.reg =3D CFI_SP; + op->dest.reg =3D modrm_rm; + } + break; + } + + /* skip RIP relative displacement */ + if (is_RIP()) + break; + + /* skip nontrivial SIB */ + if (have_SIB()) { + modrm_rm =3D sib_base; + if (sib_index !=3D CFI_SP) + break; + } + + /* mov %rsp, disp(%reg) */ + if (modrm_reg =3D=3D CFI_SP) { + ADD_OP(op) { + op->src.type =3D OP_SRC_REG; + op->src.reg =3D CFI_SP; + op->dest.type =3D OP_DEST_REG_INDIRECT; + op->dest.reg =3D modrm_rm; + op->dest.offset =3D ins.displacement.value; } break; } diff --git a/tools/objtool/check.c b/tools/objtool/check.c index a30379e4ff97..786b2f2adbab 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -3000,6 +3000,20 @@ static int update_cfi_state(struct instruction *insn, cfi->stack_size +=3D 8; } =20 + else if (cfi->vals[op->src.reg].base =3D=3D CFI_CFA) { + /* + * Clang RSP musical chairs: + * + * mov %rsp, %rdx [handled above] + * ... + * mov %rdx, %rbx [handled here] + * ... + * mov %rbx, %rsp [handled above] + */ + cfi->vals[op->dest.reg].base =3D CFI_CFA; + cfi->vals[op->dest.reg].offset =3D cfi->vals[op->src.reg].offset; + } + =20 break; =20 --=20 2.53.0