From nobody Wed Jun 10 09:21:54 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 20FFB3A7F50; Wed, 13 May 2026 03:34:45 +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=1778643285; cv=none; b=ERXRIY7rLCEkY2VQMkh20w9Ft7Bpmo9o8tgRPE2r6AvQ4wV7k+gh4npLSbBK1C8BhZ8zHS57NIG4nHwj/96iVZ34ePH4/H/6FWWpVLWWBeGbuBj4DYUPv83pjZC+9355HqWjGQD2XE3NWUrTtcrawBXeIOWKnkIjnoTwOVFA6kU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643285; c=relaxed/simple; bh=E5kQ00UQ2Ef71S/+LIcd2TddRuEa4D5lUI9w03xK5Hs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=drk2eyQFl5Z8+njjOpvynS3azmzS6S96nqt5bpEH5XXRRGLanWA/au8diw1HtS3f8Xm8qcd6v/n6O4D/ql+hKD1oGQdXtsBDcZ2pht4qzl9afhm7/cv67UCOWhzNFwcqe258gGQ56+Y3qMjiin/GOwtITj4MXvcFw2FsqXXq3nI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LEvEM9lp; 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="LEvEM9lp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 736F2C4AF15; Wed, 13 May 2026 03:34:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643285; bh=E5kQ00UQ2Ef71S/+LIcd2TddRuEa4D5lUI9w03xK5Hs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LEvEM9lpAyNZOj1YJaY8R0CkMDWr0K6JsWqRGdXyGYF7QgGzischLDs79PKxdLeBU BoENZDTVug+uDHJBYgM2J64TiNzyuokjyqpSSrlFeQjEPWcREDOlNv2olNyJbVZsbg hS4vj8Q6y7UMTNU5XgP6bbRjDwOJ6d5Rv81YnssaHKAUzltD3qwCh4MtyZtfxCHeki cu75wQw6cyaPkAOrmAauk1TKa+xgLAB4qwbgmZCndrArp4fAxpKl0JC/SBd826v+p1 N/dy0mSPSsCG/W6DvE7GOu6ACmfNQLJL3u9tjL0PAPWKFbm6au6R/YppInMWlRW9SD KnorWSwo8nSSg== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 01/21] klp-build: Reject patches to init/*.c Date: Tue, 12 May 2026 20:33:57 -0700 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033357.ypxHvU6nY3gMiQ_n9snp-o3YDN5uaLc7oMV_UEvDxZE@z> Content-Type: text/plain; charset="utf-8" init/Makefile hard-codes -fno-function-sections and -fno-data-sections, overriding the klp-build flags needed for patch generation. Don't allow any changes to those files; being init code they aren't really patchable anyway. Signed-off-by: Josh Poimboeuf Acked-by: Song Liu --- scripts/livepatch/klp-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/livepatch/klp-build b/scripts/livepatch/klp-build index c4a7acf8edc3f..911ada05673c2 100755 --- a/scripts/livepatch/klp-build +++ b/scripts/livepatch/klp-build @@ -362,7 +362,7 @@ check_unsupported_patches() { =20 for file in "${files[@]}"; do case "$file" in - lib/*|*/vdso/*|*/realmode/rm/*|*.S) + lib/*|*/vdso/*|*/realmode/rm/*|init/*|*.S) die "${patch}: unsupported patch to $file" ;; esac --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 1A51E3AA1BD; Wed, 13 May 2026 03:34:45 +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=1778643290; cv=none; b=KV5FirGoBImcymrlTYtUfdlcRISzUeZ3SdScCJEFuv3UXRArEriZL471DLEfKXmyLJO5QkVykwUlwZrhc2iafTf0C8HbVvhydBSSJ+yohn81+nEeVZYqgXlWQcEYIlvng9FcjUirq4V63NF3fib5HeSuJgyIf/hzHvAvlSmEoAw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643290; c=relaxed/simple; bh=/D2z4LhluhXqyHCGUz6p/RDiGmFitxBUbjhr8ydpie0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B9P/8oL6tUr18bN01wNZCGJxM9sCSriNUfsxrGxA4TyU9IUEtPMRlwADsU3Y6I9C/Mmxu8+8mMteURagFoeNjIvpIP5eJ2wU+YIj/8PqrVWEo0/i0Q1pTWkskBzL1gcjfPz1TlhuvMrTAkm3NbF42xr5dRZvvooV6SHcnBxF33c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=n4wFO7Ny; 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="n4wFO7Ny" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 213AAC4AF16; Wed, 13 May 2026 03:34:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643285; bh=/D2z4LhluhXqyHCGUz6p/RDiGmFitxBUbjhr8ydpie0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n4wFO7NyEYV/0+gNSdpO5s6iBrXisy37EVMZ7XBcBafOcltAlXO8aNqvC66gwtukA BpAC8LbYsQ83PGTqi+BVIzjsHKleUaDINXj+X40ksQjhqfhKihbK2EMAUEE1CN7Z2O 2VxRe0WmYAIYRhBeOkV23VTmSMiKwFnkptoN0E9+gsURWFFm9BWuOlNsGxdlIJOdKL HKe/rTqC3sN/Kk/T09iqfq1Tx2kMx/M5PlnfC1rVP6e99977xU8Czo5Dn+iBzn6dXB 5WOSu4exmVjZxnfcBgO/MXRSObGNVub56XoGBSugxwKrYmMp/FMo46gA/gWv1UVicG 7v9P0wAMQPUnw== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 02/21] arm64: Annotate intra-function calls Date: Tue, 12 May 2026 20:33:58 -0700 Message-ID: <16bdb04ed6653809514d9f060702248b8e587f05.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033358.flWYgJMtVIxDJUGwhP53789a-LNZRaqtRwrwn1_fG5o@z> Content-Type: text/plain; charset="utf-8" In preparation for enabling objtool on arm64, annotate intra-function calls. Acked-by: Song Liu Signed-off-by: Josh Poimboeuf --- arch/arm64/kernel/entry.S | 2 ++ arch/arm64/kernel/proton-pack.c | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index e0db14e9c843a..d4cbdfb23d733 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -10,6 +10,7 @@ #include #include #include +#include =20 #include #include @@ -705,6 +706,7 @@ alternative_else_nop_endif * entry onto the return stack and using a RET instruction to * enter the full-fat kernel vectors. */ + ANNOTATE_INTRA_FUNCTION_CALL bl 2f b . 2: diff --git a/arch/arm64/kernel/proton-pack.c b/arch/arm64/kernel/proton-pac= k.c index b3801f532b10b..b63887a1b8234 100644 --- a/arch/arm64/kernel/proton-pack.c +++ b/arch/arm64/kernel/proton-pack.c @@ -24,6 +24,7 @@ #include #include #include +#include =20 #include #include @@ -245,11 +246,12 @@ static noinstr void qcom_link_stack_sanitisation(void) { u64 tmp; =20 - asm volatile("mov %0, x30 \n" - ".rept 16 \n" - "bl . + 4 \n" - ".endr \n" - "mov x30, %0 \n" + asm volatile("mov %0, x30 \n" + ".rept 16 \n" + ANNOTATE_INTRA_FUNCTION_CALL " \n" + "bl . + 4 \n" + ".endr \n" + "mov x30, %0 \n" : "=3D&r" (tmp)); } =20 --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 7062A39E9D5; Wed, 13 May 2026 03:34:46 +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=1778643286; cv=none; b=oGtJk0eG3KQ7gD+vyyxkGtXtESx8KiFia1K+gmqVcP6rwkzqg3d4WF/xqvpj4AQ85aW5oJpgmLJ4zYFeqfuR9N3YPs1xjsqspJeQcUuYCpCHYjPNBT2HtmYBBEu3tv2SbE++uv1c5eKxPGCNU/IOIwfh/BVsL+iOq4Y201+tnU0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643286; c=relaxed/simple; bh=LhHK0lCryH3GfUbhtNycvw/+YpO/Fwf9dWZJEbuG8Pg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OY8vK6G6CUZPp0lbak7mhHH1Jvr4fqUZGEwMDLkoqGB295X2pcwqzHwpYGkfhqOU2hLxIXFnMa+dEry+3SkfEJp/Vb1myb/DcyKBOtoFw3Q7ixKIGFszr4Q6EEGzVojk8I5yUfIzMk4onvSA5CgjZ+un0ifMq8ZKMcDn/BEhVwg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=M/tFvFrV; 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="M/tFvFrV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C161CC2BCFD; Wed, 13 May 2026 03:34:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643286; bh=LhHK0lCryH3GfUbhtNycvw/+YpO/Fwf9dWZJEbuG8Pg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M/tFvFrVE+31co7ylVIDjWOjNmaX8vCCQR0LCINPUs94sw2kTz+0254maUpshUOiT CA/CSQQ6oueSY7HQM6mcKh/KNy8rQdZbJPed6mVRc1IAfbmTmO2RZm/xDr6IKIn9lX pWc0sBZitrG/CGX7Ef+pHC/326riD58wC/iUhpmmpQiSkXD7L6lj6Z4AyPa38p9qS1 zPrGWzpH1DrmHMXu1iLaMHi2QxZCHpCl5VlZ6mR3PzTJLjI0MFZqT1PfSnSBZhHVWy dr0GrxE7veL4PN6l5Cf8veHf+hecA1TR4kvEfMzgpcLpu7SyLslABQeq/MVyM5qB9m /BQ4EyP76bCqg== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 03/21] arm64: Fix EFI linking with -fdata-sections Date: Tue, 12 May 2026 20:33:59 -0700 Message-ID: <1e5281cfb9a7daec8283e46e2879be8ec468713c.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033359.6RWTsX6oZ_7h6oMMlkq7hvXqrnoMqmJ53-Vz5SKgCqk@z> Content-Type: text/plain; charset="utf-8" When building with -fdata-sections, the .init.bss section gets split up into a bunch of .init.bss. sections. Make sure they get linked into .init.data. Acked-by: Song Liu Signed-off-by: Josh Poimboeuf --- arch/arm64/kernel/vmlinux.lds.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.ld= s.S index e1ac876200a3d..1ad7e3dba460a 100644 --- a/arch/arm64/kernel/vmlinux.lds.S +++ b/arch/arm64/kernel/vmlinux.lds.S @@ -281,7 +281,7 @@ SECTIONS INIT_CALLS CON_INITCALL INIT_RAM_FS - *(.init.altinstructions .init.bss) /* from the EFI stub */ + *(.init.altinstructions .init.bss .init.bss.*) /* from the EFI stub */ } .exit.data : { EXIT_DATA --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 1A5DD3AA1BF; Wed, 13 May 2026 03:34:47 +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=1778643290; cv=none; b=qgEdF+IuFaDHdJFy1QzNhi616JhsbEkG/OKh8DwXf8ISYUyoXq3ZvQoUhh5RTWoxMBzOFIzpnGxcrJtA/u4Kzpkor9wVg5q39daJwn/PJ//g2n1mLGcyF65gx/OOMFqkMWTygLOYmFf//R05RaiT41xO77BtV+g5Y/pFLXPqv6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643290; c=relaxed/simple; bh=Ab2hQoImpnCesBxD7mSC6H2W3UbT0AZPaZqbzGazFII=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jVOM3KSh/KgW4jQgpIT581YOPjmLiQ8vNV9YAu7oDpF/u4JL5tp1HKlTq3EY96GcZtkEYLvRg8sjI2E/u3EXXKepVV3LIxH5Rhx918i1hQuykg1TxG+ALK/OYzZw+QI0L1b5iyXaQ06CqQHovK7M0XG64+Dr3Kb3g8b5/VflCI4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Uaar01VR; 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="Uaar01VR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7A93AC2BD00; Wed, 13 May 2026 03:34:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643287; bh=Ab2hQoImpnCesBxD7mSC6H2W3UbT0AZPaZqbzGazFII=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Uaar01VRPhzPW7I9Vozg8jeKcfsAFt8wRSqBPzw78SyygwgjeTCvl950D2h6zTdxx kaLOWUSG78ufJ371BYz5dSSWfZ6LQnDAp6ADcxjbhbP5W4tZ5fZkR/nngA8KcLlKzN ncuy532crT9ydBLhRZExVn9KgP2arQWkKBlIh4vcBeCq3D5+O9EiIP6ONlPyGx66jy mJp51MTZ8at+2BItmKJijuL+fyOG2hp2xfYlxQ7yHi/PrihmokCBDVmZpD+HsjB+ef onsKVP8WaRa4kAWciJ0ya/03wQjSIqmpBgoS/rSZSr7CXXhOa5tnMz0Su5WiZ8Rc5J 6W64T5XWnZlIg== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 04/21] arm64: Rename TRAMP_VALIAS -> TRAMP_VALIAS_ASM in asm-offsets Date: Tue, 12 May 2026 20:34:00 -0700 Message-ID: <74623fad8c45d26a3da6c5420b00156d8f7c2150.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033400.12dhIQkNXHzsGXTBW_GXF0V-1x3frE3SLi-1XGEcVmo@z> Content-Type: text/plain; charset="utf-8" Rename the asm-offsets TRAMP_VALIAS macro to TRAMP_VALIAS_ASM, following the naming convention already used by PIE_E0_ASM and PIE_E1_ASM. This disambiguates the asm-offsets-generated constant from the C macro of the same name defined in fixmap.h and vectors.h. This is needed by a later patch which adds new includes to asm-offsets.c that would otherwise conflict with the C version. Signed-off-by: Josh Poimboeuf Acked-by: Song Liu --- arch/arm64/kernel/asm-offsets.c | 2 +- arch/arm64/kernel/entry.S | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offset= s.c index b6367ff3a49ca..44b92f582c127 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -153,7 +153,7 @@ int main(void) DEFINE(ARM64_FTR_SYSVAL, offsetof(struct arm64_ftr_reg, sys_val)); BLANK(); #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 - DEFINE(TRAMP_VALIAS, TRAMP_VALIAS); + DEFINE(TRAMP_VALIAS_ASM, TRAMP_VALIAS); #endif #ifdef CONFIG_ARM_SDE_INTERFACE DEFINE(SDEI_EVENT_INTREGS, offsetof(struct sdei_registered_event, interr= upted_regs)); diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index d4cbdfb23d733..85f6305c1f568 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -102,7 +102,7 @@ .endm =20 .macro tramp_alias, dst, sym - .set .Lalias\@, TRAMP_VALIAS + \sym - .entry.tramp.text + .set .Lalias\@, TRAMP_VALIAS_ASM + \sym - .entry.tramp.text movz \dst, :abs_g2_s:.Lalias\@ movk \dst, :abs_g1_nc:.Lalias\@ movk \dst, :abs_g0_nc:.Lalias\@ @@ -626,10 +626,10 @@ SYM_CODE_END(ret_to_user) #ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003 alternative_if ARM64_WORKAROUND_QCOM_FALKOR_E1003 /* ASID already in \tmp[63:48] */ - movk \tmp, #:abs_g2_nc:(TRAMP_VALIAS >> 12) - movk \tmp, #:abs_g1_nc:(TRAMP_VALIAS >> 12) + movk \tmp, #:abs_g2_nc:(TRAMP_VALIAS_ASM >> 12) + movk \tmp, #:abs_g1_nc:(TRAMP_VALIAS_ASM >> 12) /* 2MB boundary containing the vectors, so we nobble the walk cache */ - movk \tmp, #:abs_g0_nc:((TRAMP_VALIAS & ~(SZ_2M - 1)) >> 12) + movk \tmp, #:abs_g0_nc:((TRAMP_VALIAS_ASM & ~(SZ_2M - 1)) >> 12) isb tlbi vae1, \tmp dsb nsh --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 1A6D43AA4E0; Wed, 13 May 2026 03:34:47 +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=1778643290; cv=none; b=lk2JJkOtew9RfcI0A0AajVCT9z7GenclvYp8OTZ275qTpVzBVGefSoL+2j7kF+J8cotZAVIN4d1FuPE6rMXuOXheRjMeNW/9crBy9PcH5tUEcBzJ8zjpCSSbU68jT1rqXvDontLDWroLPv9u+GrMIuW0m1fv2qMB2FJ/H/r1OXY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643290; c=relaxed/simple; bh=n0zIE5QeG6gMOvBsdlMrDubUOuT5GRIBXLzLQUDUXac=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ITwumW8/YvqzM4aw/ao/4alWSBGaVMQwPGhVrTBQS8Ydf+n8ku3Q2MWkS5qKsY+dASfAFMOZnnCPioJLxy7uaNqVXkTE/7mvoauYPw/LPJv+MVFGPQRRoTdNUGqjJC3nAF8qlSY4OfhwaYMJYIES9t59gcyWX8RSWx6tR5oSaGg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=a8hdIHrT; 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="a8hdIHrT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2FA04C2BCC7; Wed, 13 May 2026 03:34:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643287; bh=n0zIE5QeG6gMOvBsdlMrDubUOuT5GRIBXLzLQUDUXac=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a8hdIHrTWDu0YaYDs2Z5CBvbdW+bWitNDdUfJ5nc9Xn1AQUgx3LQYnPbXwkcy6nLl LVBcQM+HUK0uXO1vPwUyZpqwVo6IkIxTL0RvLRNtnV0I00nCR4gNAa5IUz/LDAgzxW RTbdfAASG6K5VPvxaD1pL/RZuuUPwOSMSchZ2XSO/ajEbnpWh0Z8MU2ZZA6AbU5w4/ owoc7kBxF/YjZW4CNNRJ5Vm6JzJFe1B8WbRA8DXdz2ae40gFW5FK9WFSSKlZYybJw/ q8wgBbkT3kr+ncYmriogNmaitJkZoMwjCvXCuuiqP2DqgYVldLvBBkE8Z8Tdq/6Ti0 sqiXm5yyb0Umw== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 05/21] arm64: vdso: Discard .discard.* sections Date: Tue, 12 May 2026 20:34:01 -0700 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033401.8lkCBPBF7mdJXo4BMnMNLB1XzrJ53jPX9kwBT0fc9bE@z> Content-Type: text/plain; charset="utf-8" In preparation for enabling objtool on arm64, add .discard.* to the vDSO's /DISCARD/ section so objtool annotations don't cause orphan section warnings or leak into the final vDSO binary. Signed-off-by: Josh Poimboeuf --- arch/arm64/kernel/vdso/vdso.lds.S | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/vds= o.lds.S index 52314be291912..d5f96fa17e605 100644 --- a/arch/arm64/kernel/vdso/vdso.lds.S +++ b/arch/arm64/kernel/vdso/vdso.lds.S @@ -39,6 +39,7 @@ SECTIONS /DISCARD/ : { *(.note.GNU-stack .note.gnu.property) *(.ARM.attributes) + *(.discard.*) } .note : { *(.note.*) } :text :note =20 --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 95851397B12; Wed, 13 May 2026 03:34:48 +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=1778643288; cv=none; b=rTB4braYFEsUOWD8qP7swfVlOFE1hchFH6D0YYQ/f2tZqk5ZmsmLVIjjLjpvYOH3WoTPP/tgvfK0F0Xye+QQXkoMfNagdf9xUiUzCDm5wOKuObUuiOIlk5y82Q1nda6/v+gWzXPbSBrD9AI/Va/7xhO5RzPJ0qdt3liPUptHEd8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643288; c=relaxed/simple; bh=BK3CifmQ1WkuFt4dX+U2VS/JvmYP9M9pIr3ObHQa0Jc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AMo6vllm9dnIMk5l27PX804jxzNqNpMULKUTZwyWYL05bKZ2iyL3f/2/Zz3tTcV7n6LItewLzx9DchK4rKNdOBXBN6OpNUe40SmFMVABS9MkFzPqC+lK/tvw+3jg64xtqzgEM18Bkcca00u2qiBfGeoFFjGsI3T4W1/J65aoVWQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S4fZnhjF; 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="S4fZnhjF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D7547C2BCC9; Wed, 13 May 2026 03:34:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643288; bh=BK3CifmQ1WkuFt4dX+U2VS/JvmYP9M9pIr3ObHQa0Jc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S4fZnhjF0N6Amk2zVz/YiGkQ5GqXpfuhvyGPMkEdX9BlpKq+dzvXvM1bBovfL4Tvg Z3dFMzLTUXvT1dL26M8Q/QfDu9qlBXvvwunDEwaiPp9VH4+dW6L7U3/6sJvLH3Aarx N1RGtOpVGnniXdIY56nYdR1rlFLpLSOOr6j1jz0FTGmz3FgYZEasVpKerjeambxeKj skGrbeQE1RJRSlHQm3lYjx+/88ESFX2w9m5xSdWpcb1gw88pPzAb5tKP0USbHzu4nb N100PcFe3VbUYXWhhue+cGRh4+kJlBuoR79Tsqo5/zixkR2KduGf5VjCrRirHMAg1p dkwvVSVHI5BSA== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 06/21] arm64: Annotate special section entries Date: Tue, 12 May 2026 20:34:02 -0700 Message-ID: <460a87108015a5afd9e0963e0d64525ebfa27401.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033402.Tr5dMIEaMtR5vziSiY_i7Ul2Y9hh0mO70DW6zLrcFVk@z> Content-Type: text/plain; charset="utf-8" In preparation for adding arm64 support for "objtool klp checksum/diff" to enable livepatch module generation, annotate special section entries. This will allow objtool to determine the size and location of the entries and to extract them when needed. A new ANNOTATE_DATA_SPECIAL_END annotation is added to mark the end of special data blocks, which is needed because arm64's replacement instructions are emitted in .text rather than .altinstr_replacement, so there's otherwise no way to determine where the last replacement block ends. Signed-off-by: Josh Poimboeuf --- arch/arm64/include/asm/alternative-macros.h | 27 ++++++++++++++++----- arch/arm64/include/asm/asm-bug.h | 2 ++ arch/arm64/include/asm/asm-extable.h | 21 ++++++++++------ arch/arm64/include/asm/jump_label.h | 2 ++ arch/arm64/kernel/asm-offsets.c | 5 ++++ include/linux/annotate.h | 14 ++++++++++- include/linux/objtool_types.h | 1 + tools/include/linux/objtool_types.h | 1 + tools/objtool/klp-diff.c | 5 +++- 9 files changed, 62 insertions(+), 16 deletions(-) diff --git a/arch/arm64/include/asm/alternative-macros.h b/arch/arm64/inclu= de/asm/alternative-macros.h index 8624166248528..ba86d655af1d7 100644 --- a/arch/arm64/include/asm/alternative-macros.h +++ b/arch/arm64/include/asm/alternative-macros.h @@ -3,11 +3,16 @@ #define __ASM_ALTERNATIVE_MACROS_H =20 #include +#include #include =20 #include #include =20 +#ifndef COMPILE_OFFSETS +#include +#endif + /* * Binutils 2.27.0 can't handle a 'UL' suffix on constants, so for the ass= embly * macros below we must use we must use `(1 << ARM64_CB_SHIFT)`. @@ -58,15 +63,18 @@ "661:\n\t" \ oldinstr "\n" \ "662:\n" \ - ".pushsection .altinstructions,\"a\"\n" \ + ".pushsection .altinstructions,\"aM\", @progbits, " \ + __stringify(ALT_INSTR_SIZE) "\n" \ ALTINSTR_ENTRY(cpucap) \ ".popsection\n" \ ".subsection 1\n" \ + ANNOTATE_DATA_SPECIAL "\n" \ "663:\n\t" \ newinstr "\n" \ "664:\n\t" \ ".org . - (664b-663b) + (662b-661b)\n\t" \ ".org . - (662b-661b) + (664b-663b)\n\t" \ + ANNOTATE_DATA_SPECIAL_END "\n\t" \ ".previous\n" \ ".endif\n" =20 @@ -75,7 +83,8 @@ "661:\n\t" \ oldinstr "\n" \ "662:\n" \ - ".pushsection .altinstructions,\"a\"\n" \ + ".pushsection .altinstructions,\"aM\", @progbits, " \ + __stringify(ALT_INSTR_SIZE) "\n" \ ALTINSTR_ENTRY_CB(cpucap, cb) \ ".popsection\n" \ "663:\n\t" \ @@ -102,13 +111,15 @@ .macro alternative_insn insn1, insn2, cap, enable =3D 1 .if \enable 661: \insn1 -662: .pushsection .altinstructions, "a" +662: .pushsection .altinstructions, "aM", @progbits, ALT_INSTR_SIZE altinstruction_entry 661b, 663f, \cap, 662b-661b, 664f-663f .popsection .subsection 1 + ANNOTATE_DATA_SPECIAL 663: \insn2 664: .org . - (664b-663b) + (662b-661b) .org . - (662b-661b) + (664b-663b) + ANNOTATE_DATA_SPECIAL_END .previous .endif .endm @@ -137,7 +148,7 @@ */ .macro alternative_if_not cap .set .Lasm_alt_mode, 0 - .pushsection .altinstructions, "a" + .pushsection .altinstructions, "aM", @progbits, ALT_INSTR_SIZE altinstruction_entry 661f, 663f, \cap, 662f-661f, 664f-663f .popsection 661: @@ -145,17 +156,18 @@ =20 .macro alternative_if cap .set .Lasm_alt_mode, 1 - .pushsection .altinstructions, "a" + .pushsection .altinstructions, "aM", @progbits, ALT_INSTR_SIZE altinstruction_entry 663f, 661f, \cap, 664f-663f, 662f-661f .popsection .subsection 1 .align 2 /* So GAS knows label 661 is suitably aligned */ + ANNOTATE_DATA_SPECIAL 661: .endm =20 .macro alternative_cb cap, cb .set .Lasm_alt_mode, 0 - .pushsection .altinstructions, "a" + .pushsection .altinstructions, "aM", @progbits, ALT_INSTR_SIZE altinstruction_entry 661f, \cb, (1 << ARM64_CB_SHIFT) | \cap, 662f-661f, 0 .popsection 661: @@ -168,7 +180,9 @@ 662: .if .Lasm_alt_mode=3D=3D0 .subsection 1 + ANNOTATE_DATA_SPECIAL .else + ANNOTATE_DATA_SPECIAL_END .previous .endif 663: @@ -182,6 +196,7 @@ .org . - (664b-663b) + (662b-661b) .org . - (662b-661b) + (664b-663b) .if .Lasm_alt_mode=3D=3D0 + ANNOTATE_DATA_SPECIAL_END .previous .endif .endm diff --git a/arch/arm64/include/asm/asm-bug.h b/arch/arm64/include/asm/asm-= bug.h index a5f13801b7840..22e1a9df9851d 100644 --- a/arch/arm64/include/asm/asm-bug.h +++ b/arch/arm64/include/asm/asm-bug.h @@ -5,6 +5,7 @@ */ #define __ASM_ASM_BUG_H =20 +#include #include =20 #ifdef CONFIG_DEBUG_BUGVERBOSE @@ -24,6 +25,7 @@ #define __BUG_ENTRY_START \ .pushsection __bug_table,"aw"; \ .align 2; \ + __ANNOTATE_DATA_SPECIAL; \ 14470: .long 14471f - .; \ =20 #define __BUG_ENTRY_END \ diff --git a/arch/arm64/include/asm/asm-extable.h b/arch/arm64/include/asm/= asm-extable.h index d67e2fdd1aee5..e81700edbb936 100644 --- a/arch/arm64/include/asm/asm-extable.h +++ b/arch/arm64/include/asm/asm-extable.h @@ -5,6 +5,10 @@ #include #include =20 +#ifndef COMPILE_OFFSETS +#include +#endif + #define EX_TYPE_NONE 0 #define EX_TYPE_BPF 1 #define EX_TYPE_UACCESS_ERR_ZERO 2 @@ -29,13 +33,13 @@ =20 #ifdef __ASSEMBLER__ =20 -#define __ASM_EXTABLE_RAW(insn, fixup, type, data) \ - .pushsection __ex_table, "a"; \ - .align 2; \ - .long ((insn) - .); \ - .long ((fixup) - .); \ - .short (type); \ - .short (data); \ +#define __ASM_EXTABLE_RAW(insn, fixup, type, data) \ + .pushsection __ex_table, "aM", @progbits, EXTABLE_SIZE; \ + .align 2; \ + .long ((insn) - .); \ + .long ((fixup) - .); \ + .short (type); \ + .short (data); \ .popsection; =20 #define EX_DATA_REG(reg, gpr) \ @@ -82,7 +86,8 @@ #include =20 #define __ASM_EXTABLE_RAW(insn, fixup, type, data) \ - ".pushsection __ex_table, \"a\"\n" \ + ".pushsection __ex_table, \"aM\", @progbits, "\ + __stringify(EXTABLE_SIZE) "\n" \ ".align 2\n" \ ".long ((" insn ") - .)\n" \ ".long ((" fixup ") - .)\n" \ diff --git a/arch/arm64/include/asm/jump_label.h b/arch/arm64/include/asm/j= ump_label.h index 0cb211d3607d3..4dacb28641d72 100644 --- a/arch/arm64/include/asm/jump_label.h +++ b/arch/arm64/include/asm/jump_label.h @@ -11,6 +11,7 @@ #ifndef __ASSEMBLER__ =20 #include +#include #include =20 #define HAVE_JUMP_LABEL_BATCH @@ -19,6 +20,7 @@ #define JUMP_TABLE_ENTRY(key, label) \ ".pushsection __jump_table, \"aw\"\n\t" \ ".align 3\n\t" \ + ANNOTATE_DATA_SPECIAL "\n\t" \ ".long 1b - ., " label " - .\n\t" \ ".quad " key " - .\n\t" \ ".popsection\n\t" diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offset= s.c index 44b92f582c127..76251586e31c7 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include =20 int main(void) { @@ -185,5 +187,8 @@ int main(void) #endif DEFINE(PIE_E0_ASM, PIE_E0); DEFINE(PIE_E1_ASM, PIE_E1); + BLANK(); + DEFINE(ALT_INSTR_SIZE, sizeof(struct alt_instr)); + DEFINE(EXTABLE_SIZE, sizeof(struct exception_table_entry)); return 0; } diff --git a/include/linux/annotate.h b/include/linux/annotate.h index 2f1599c9e5732..7f5aa15f353d6 100644 --- a/include/linux/annotate.h +++ b/include/linux/annotate.h @@ -3,6 +3,7 @@ #define _LINUX_ANNOTATE_H =20 #include +#include =20 #ifdef CONFIG_OBJTOOL =20 @@ -11,6 +12,10 @@ .long label - ., type; \ .popsection =20 +#define __ASM_ANNOTATE_DATA(type) \ +912: \ + __ASM_ANNOTATE(.discard.annotate_data, 912b, type) + #ifndef __ASSEMBLY__ =20 #define ASM_ANNOTATE_LABEL(label, type) \ @@ -39,6 +44,9 @@ #endif /* __ASSEMBLY__ */ =20 #else /* !CONFIG_OBJTOOL */ + +#define __ASM_ANNOTATE_DATA(type) + #ifndef __ASSEMBLY__ #define ASM_ANNOTATE_LABEL(label, type) "" #define ASM_ANNOTATE(type) @@ -106,10 +114,12 @@ #define ANNOTATE_NOCFI_SYM(sym) asm(ASM_ANNOTATE_LABEL(sym, ANNOTYPE_NOCF= I)) =20 /* - * Annotate a special section entry. This emables livepatch module genera= tion + * Annotate a special section entry. This enables livepatch module genera= tion * to find and extract individual special section entries as needed. */ #define ANNOTATE_DATA_SPECIAL ASM_ANNOTATE_DATA(ANNOTYPE_DATA_SPECIAL) +#define __ANNOTATE_DATA_SPECIAL __ASM_ANNOTATE_DATA(ANNOTYPE_DATA_SPECIAL) +#define ANNOTATE_DATA_SPECIAL_END ASM_ANNOTATE_DATA(ANNOTYPE_DATA_SPECIAL_= END) =20 #else /* __ASSEMBLY__ */ #define ANNOTATE_NOENDBR ANNOTATE type=3DANNOTYPE_NOENDBR @@ -122,6 +132,8 @@ #define ANNOTATE_REACHABLE ANNOTATE type=3DANNOTYPE_REACHABLE #define ANNOTATE_NOCFI_SYM ANNOTATE type=3DANNOTYPE_NOCFI #define ANNOTATE_DATA_SPECIAL ANNOTATE_DATA type=3DANNOTYPE_DATA_SPECIAL +#define __ANNOTATE_DATA_SPECIAL __ASM_ANNOTATE_DATA(ANNOTYPE_DATA_SPECIAL) +#define ANNOTATE_DATA_SPECIAL_END ANNOTATE_DATA type=3DANNOTYPE_DATA_SPECI= AL_END #endif /* __ASSEMBLY__ */ =20 #endif /* _LINUX_ANNOTATE_H */ diff --git a/include/linux/objtool_types.h b/include/linux/objtool_types.h index c6def4049b1ae..744118ffd025f 100644 --- a/include/linux/objtool_types.h +++ b/include/linux/objtool_types.h @@ -68,5 +68,6 @@ struct unwind_hint { #define ANNOTYPE_NOCFI 9 =20 #define ANNOTYPE_DATA_SPECIAL 1 +#define ANNOTYPE_DATA_SPECIAL_END 2 =20 #endif /* _LINUX_OBJTOOL_TYPES_H */ diff --git a/tools/include/linux/objtool_types.h b/tools/include/linux/objt= ool_types.h index c6def4049b1ae..744118ffd025f 100644 --- a/tools/include/linux/objtool_types.h +++ b/tools/include/linux/objtool_types.h @@ -68,5 +68,6 @@ struct unwind_hint { #define ANNOTYPE_NOCFI 9 =20 #define ANNOTYPE_DATA_SPECIAL 1 +#define ANNOTYPE_DATA_SPECIAL_END 2 =20 #endif /* _LINUX_OBJTOOL_TYPES_H */ diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c index f8787d7d14547..6a1cec57dc6a3 100644 --- a/tools/objtool/klp-diff.c +++ b/tools/objtool/klp-diff.c @@ -1667,7 +1667,10 @@ static int create_fake_symbols(struct elf *elf) size =3D 0; next_reloc =3D reloc; for_each_reloc_continue(sec->rsec, next_reloc) { - if (annotype(elf, sec, next_reloc) !=3D ANNOTYPE_DATA_SPECIAL || + unsigned int next_type =3D annotype(elf, sec, next_reloc); + + if ((next_type !=3D ANNOTYPE_DATA_SPECIAL && + next_type !=3D ANNOTYPE_DATA_SPECIAL_END) || next_reloc->sym->sec !=3D reloc->sym->sec) continue; =20 --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 4BB9E3A2574; Wed, 13 May 2026 03:34:49 +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=1778643289; cv=none; b=B/ft+D5XC7/X1SrSTMLLtwGzmVExAMqLNFHdrjJgohFsgOUy1UcRuSPkQoJV9AsGcJVPv8E/ChMaRBinNQg+yRgksfpgV83TxcgTJgI+mOWYTlWhV1D+DhhgOCeWYAPMICFju/xmHtA4q/m+chtmwdwQnMtwoITA3XveLfjjscQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643289; c=relaxed/simple; bh=l/Ci/bQZJNfrCn5KEXNZpm9m+7qL/TrCFKOnkDayqLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q8qNMPaCMPKk+4es7kMeyH2ePNVTvAIESBBvYXcvKbjZpjx/ijEdaZXXF5BIrZqhhJMs68vvFOzGj6ojcSDEyGvAJD2bwNNs/5Y6SeqNLjM8JBTOKeZ19gQSyUpzawXO1pGt6eES8KPEexfRTeWvMuzWkoA5569jp5DA5qhGsR4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JHHaf4Ki; 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="JHHaf4Ki" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 990B9C4AF14; Wed, 13 May 2026 03:34:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643289; bh=l/Ci/bQZJNfrCn5KEXNZpm9m+7qL/TrCFKOnkDayqLg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JHHaf4KifiCn7gsZ/v6tnA9ThRgf6FXUHYae/zN0FlPiV0p+/eNzuvYZUY0hSgrQ3 dVZqhdk31gKcUbQovsEaNS9BCvP9pXQZArFg3cSnHnHl1u+LlQJlaGerIU2jKZ0Fma 2u4pBufV0L325JWuV8wkSoSv1+O+lpPRJOHMEVAZy2eJYjEuXgpBETj/5TIuV8d8vH Z3eTWgwfBqVUdPp1AGa+CoIKjUyHb7TKDRsMf9gajTlmm2dQslVmI383hyUBAu1obt VXDz901f+DFp0h1SK/Y7BVMH10a1Tnmzy3aKomVVyoWPn+qxaRTnK2QP/rd8L+iOQw mGwE6y6yQG/Lw== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 07/21] crypto: arm64: Move data to .rodata Date: Tue, 12 May 2026 20:34:03 -0700 Message-ID: <3757f0bdb8117c875c2085dc42b6becd28b4285b.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033403.TrxfGxSUDWCLjJFCSUuSjlWPUkQMXGCbgF1cWLHUqi0@z> Content-Type: text/plain; charset="utf-8" Data embedded in .text pollutes i-cache and confuses objtool and other tools that try to disassemble it. Move it to .rodata. Signed-off-by: Josh Poimboeuf --- lib/crypto/arm64/sha2-armv8.pl | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/crypto/arm64/sha2-armv8.pl b/lib/crypto/arm64/sha2-armv8.pl index 35ec9ae99fe16..e0ee2d5367e72 100644 --- a/lib/crypto/arm64/sha2-armv8.pl +++ b/lib/crypto/arm64/sha2-armv8.pl @@ -207,12 +207,13 @@ $func: ___ $code.=3D<<___ if ($SZ=3D=3D4); #ifndef __KERNEL__ + adrp x17,.LOPENSSL_armcap_P + add x17,x17,:lo12:.LOPENSSL_armcap_P # ifdef __ILP32__ - ldrsw x16,.LOPENSSL_armcap_P + ldrsw x16,[x17] # else - ldr x16,.LOPENSSL_armcap_P + ldr x16,[x17] # endif - adr x17,.LOPENSSL_armcap_P add x16,x16,x17 ldr w16,[x16] tst w16,#ARMV8_SHA256 @@ -237,7 +238,8 @@ $code.=3D<<___; ldp $E,$F,[$ctx,#4*$SZ] add $num,$inp,$num,lsl#`log(16*$SZ)/log(2)` // end of input ldp $G,$H,[$ctx,#6*$SZ] - adr $Ktbl,.LK$BITS + adrp $Ktbl,.LK$BITS + add $Ktbl,$Ktbl,:lo12:.LK$BITS stp $ctx,$num,[x29,#96] =20 .Loop: @@ -286,6 +288,7 @@ $code.=3D<<___; ret .size $func,.-$func =20 +.pushsection .rodata .align 6 .type .LK$BITS,%object .LK$BITS: @@ -365,6 +368,7 @@ $code.=3D<<___; #endif .asciz "SHA$BITS block transform for ARMv8, CRYPTOGAMS by " .align 2 +.popsection ___ =20 if ($SZ=3D=3D4) { @@ -385,7 +389,8 @@ sha256_block_armv8: add x29,sp,#0 =20 ld1.32 {$ABCD,$EFGH},[$ctx] - adr $Ktbl,.LK256 + adrp $Ktbl,.LK256 + add $Ktbl,$Ktbl,:lo12:.LK256 =20 .Loop_hw: ld1 {@MSG[0]-@MSG[3]},[$inp],#64 @@ -648,7 +653,8 @@ sha256_block_neon: mov x29, sp sub sp,sp,#16*4 =20 - adr $Ktbl,.LK256 + adrp $Ktbl,.LK256 + add $Ktbl,$Ktbl,:lo12:.LK256 add $num,$inp,$num,lsl#6 // len to point at the end of inp =20 ld1.8 {@X[0]},[$inp], #16 --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 E82DB3A381A; Wed, 13 May 2026 03:34:49 +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=1778643290; cv=none; b=TYeIsvwyF5YW96Z+17nMZTNiw5N/Ga4d8VYcE2yqhO4ePzXja5tv9rT+015BHGjHUMfYhURhE6rpPiCfJk+4xT3zQpOqdhDq4BL8VMnzk4AwnvxzLTUEyrFRS0/3dgeS4zqEawpxZQ5FKRvNopp25vLvP0hMvXZitHbrhtADqac= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643290; c=relaxed/simple; bh=G1VVkFA+yVRTPwxqst2UM5oq5D62mSukpDgUevX4w2g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CLbCab2KySRrMTM7mCn2gpGNPWE3BIelVTcBHC43z5MwXqNipM+I9rctcTKObBZQrDCwtTzyCnv1YoBDZo/Igi8NCDKdKg+MaOLtgsRmFpxU+rpCvVwhjiogXGvNDpO7gj5Lf323K4gWRjz6IF+t5nSgRJg4abQBDLIlP2gQVrM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qFK55v94; 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="qFK55v94" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5710FC4AF1B; Wed, 13 May 2026 03:34:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643289; bh=G1VVkFA+yVRTPwxqst2UM5oq5D62mSukpDgUevX4w2g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qFK55v94+q/TgZ04oKyJ60qsdMKAZLWUmcuBlNhyXyN2mhUyeFJv30vLfN4RHe8xs rvS6G5L8Ladtg+NNWyqBLjtdWk8kNTWV+8jkhqKR6L8hWULPG9q/smyw5VvYTloS/H Q9em+hdiu/MuBOyOTvhY23o3BAHJ4hkXISHsm9dkOUZ7g1HiItJP2+zgwc9KUuInFj 8aNoQPcLW1KQqcsaT8LuzqVbQKapDdOqCvQfy7FiPMUJF8FYJ8orYN+8pnVMTuNMiF LYokG8FW5X/PKZhcVv8195naNHfdsffqAoefoKz1Ghd8S93ciZ8vruRrULq7l5sUxc OBio90LEomidA== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 08/21] objtool: Allow setting --mnop without --mcount Date: Tue, 12 May 2026 20:34:04 -0700 Message-ID: <87e956a4b3c8081c6ce0b75c043c15babf2a7f7e.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033404.4U9Ig6V7wNIZNO-yeYAvguOq23oM1U9PrzNrWNKQ-Uc@z> Content-Type: text/plain; charset="utf-8" Instead of returning an error for --mnop without --mcount, just silently ignore it. This will help simplify kbuild's handling of objtool args. Acked-by: Song Liu Signed-off-by: Josh Poimboeuf --- tools/objtool/builtin-check.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c index 118c3de2f293e..bd84f5b7c9ee9 100644 --- a/tools/objtool/builtin-check.c +++ b/tools/objtool/builtin-check.c @@ -144,11 +144,6 @@ int cmd_parse_options(int argc, const char **argv, con= st char * const usage[]) =20 static bool opts_valid(void) { - if (opts.mnop && !opts.mcount) { - ERROR("--mnop requires --mcount"); - return false; - } - if (opts.noinstr && !opts.link) { ERROR("--noinstr requires --link"); return false; --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 A28613AC0CE; Wed, 13 May 2026 03:34:50 +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=1778643291; cv=none; b=itFv/PA3atS5fx/i2Jn/6qet8a0+jbKY2T5ssnn1EahA+JlPpWt1hdXiRGI/S7gFHPZ1pNkuznj6aWu9ZsnYRY8wL1afSUGDmFsROOgkEJ3xSHk9auERfI+jn1YWnSJpOwilDz3pylnLJRzCY+is44rgii8GJomUWHbzRXFDUzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643291; c=relaxed/simple; bh=6qM6eS73y/2HGC/l7RWciS6d5w9G1tF/qeUGxjijkEE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CalKfVATFlC+GPj3p184heTNXv3INgaKkMAcT43ZmqqSgNwWBVpJkWZOOk7VDr/cwhR4/qqbKYE8I0QK1SFV089DzRdJPaLBKteKHJBKv18zAmzrXO/RM2AJk73kTo/s0s/RA+XBezHik2edpT0pUiwxjaIQVd24hIgpHv9xQF8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ohMOmZv+; 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="ohMOmZv+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09837C2BCC9; Wed, 13 May 2026 03:34:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643290; bh=6qM6eS73y/2HGC/l7RWciS6d5w9G1tF/qeUGxjijkEE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ohMOmZv+7PioVmwuGWUJEydizZIPCjZOmiUg7Bx08ndx/aDUunDHXY1eOxD1eEjvc tO6+d2dZ93dMtA58RXZlBIQjT6/t8eIUkPnwLnAX7A5ly0DuEygwp4h8hEHmThhkjx oXxc94HReQGW27VAaSyHdq6PWmJTgVCmW8sMuG39AFvUReJavru9JDhy0rN4MzhKmf qLxo3F3plA6FbesptXmdaxyAFiLRyp5TpcKiKLyYZmUD0BMM5NHRcFgRPejtvoqFhr PmByC1BETVjCC54xh1dXgPnd1Qrq8NqS7N4YOHmjvo64qWgKsyhpwYLN+LHw9yxN8C 2LW/LPxlPKszQ== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek , Nathan Chancellor , Nicolas Schier Subject: [PATCH v3 09/21] kbuild: Only run objtool if there is at least one command Date: Tue, 12 May 2026 20:34:05 -0700 Message-ID: <8699672b82fef17e73a5f2e5528478778dbdab31.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033405.ylH_1D7BVLE81Xlb9tygz0lD2ijxrRQilAWeGh8BtkU@z> Content-Type: text/plain; charset="utf-8" Split the objtool args into commands and options, such that if no commands have been enabled, objtool doesn't run. This is in preparation for enabling objtool and klp-build for arm64. Reviewed-by: Nathan Chancellor Reviewed-by: Nicolas Schier Tested-by: Nathan Chancellor Signed-off-by: Josh Poimboeuf --- arch/x86/boot/startup/Makefile | 2 +- scripts/Makefile.build | 4 +-- scripts/Makefile.lib | 52 ++++++++++++++++++---------------- scripts/Makefile.vmlinux_o | 15 ++++------ 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/arch/x86/boot/startup/Makefile b/arch/x86/boot/startup/Makefile index 5e499cfb29b5c..a08297829fc63 100644 --- a/arch/x86/boot/startup/Makefile +++ b/arch/x86/boot/startup/Makefile @@ -36,7 +36,7 @@ $(patsubst %.o,$(obj)/%.o,$(lib-y)): OBJECT_FILES_NON_STA= NDARD :=3D y # relocations, even if other objtool actions are being deferred. # $(pi-objs): objtool-enabled =3D 1 -$(pi-objs): objtool-args =3D $(if $(delay-objtool),--dry-run,$(objtool-arg= s-y)) --noabs +$(pi-objs): objtool-args =3D $(if $(delay-objtool),--dry-run,$(objtool-cmd= s-y) $(objtool-opts-y)) --noabs =20 # # Confine the startup code by prefixing all symbols with __pi_ (for positi= on diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 3498d25b15e85..c4accfcd177d4 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -277,7 +277,7 @@ endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT is-standard-object =3D $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$= (target-stem).o)$(OBJECT_FILES_NON_STANDARD)n),$(is-kernel-object)) =20 ifdef CONFIG_OBJTOOL -$(obj)/%.o: private objtool-enabled =3D $(if $(is-standard-object),$(if $(= delay-objtool),$(is-single-obj-m),y)) +$(obj)/%.o: private objtool-enabled =3D $(and $(is-standard-object),$(objt= ool-cmds-y),$(if $(delay-objtool),$(is-single-obj-m),y)) endif =20 ifneq ($(findstring 1, $(KBUILD_EXTRA_WARN)),) @@ -501,7 +501,7 @@ define rule_ld_multi_m $(call cmd,gen_objtooldep) endef =20 -$(multi-obj-m): private objtool-enabled :=3D $(delay-objtool) +$(multi-obj-m): private objtool-enabled :=3D $(if $(objtool-cmds-y),$(dela= y-objtool)) $(multi-obj-m): private part-of-module :=3D y $(multi-obj-m): %.o: %.mod FORCE $(call if_changed_rule,ld_multi_m) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 7e216d82e9887..7f803796d20cf 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -183,30 +183,34 @@ ifdef CONFIG_OBJTOOL =20 objtool :=3D $(objtree)/tools/objtool/objtool =20 -objtool-args-$(CONFIG_HAVE_JUMP_LABEL_HACK) +=3D --hacks=3Djump_label -objtool-args-$(CONFIG_HAVE_NOINSTR_HACK) +=3D --hacks=3Dnoinstr -objtool-args-$(CONFIG_MITIGATION_CALL_DEPTH_TRACKING) +=3D --hacks=3Dskyla= ke -objtool-args-$(CONFIG_X86_KERNEL_IBT) +=3D --ibt -objtool-args-$(CONFIG_CALL_PADDING) +=3D --prefix=3D$(CONFIG_FUNCTION_PA= DDING_BYTES) -ifdef CONFIG_CALL_PADDING -objtool-args-$(CONFIG_CFI) +=3D --cfi -objtool-args-$(CONFIG_FINEIBT) +=3D --fineibt -endif -objtool-args-$(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL) +=3D --mcount -ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL -objtool-args-$(CONFIG_HAVE_OBJTOOL_NOP_MCOUNT) +=3D --mnop -endif -objtool-args-$(CONFIG_UNWINDER_ORC) +=3D --orc -objtool-args-$(CONFIG_MITIGATION_RETPOLINE) +=3D --retpoline -objtool-args-$(CONFIG_MITIGATION_RETHUNK) +=3D --rethunk -objtool-args-$(CONFIG_MITIGATION_SLS) +=3D --sls -objtool-args-$(CONFIG_STACK_VALIDATION) +=3D --stackval -objtool-args-$(CONFIG_HAVE_STATIC_CALL_INLINE) +=3D --static-call -objtool-args-$(CONFIG_HAVE_UACCESS_VALIDATION) +=3D --uaccess -objtool-args-$(or $(CONFIG_GCOV_KERNEL),$(CONFIG_KCOV)) +=3D --no-unreacha= ble -objtool-args-$(CONFIG_OBJTOOL_WERROR) +=3D --werror +# objtool commands +objtool-cmds-$(CONFIG_HAVE_JUMP_LABEL_HACK) +=3D --hacks=3Djump_label +objtool-cmds-$(CONFIG_HAVE_NOINSTR_HACK) +=3D --hacks=3Dnoinstr +objtool-cmds-$(CONFIG_MITIGATION_CALL_DEPTH_TRACKING) +=3D --hacks=3Dskyla= ke +objtool-cmds-$(CONFIG_X86_KERNEL_IBT) +=3D --ibt +objtool-cmds-$(CONFIG_CALL_PADDING) +=3D --prefix=3D$(CONFIG_FUNCTION_PA= DDING_BYTES) +objtool-cmds-$(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL) +=3D --mcount +objtool-cmds-$(CONFIG_UNWINDER_ORC) +=3D --orc +objtool-cmds-$(CONFIG_MITIGATION_RETPOLINE) +=3D --retpoline +objtool-cmds-$(CONFIG_MITIGATION_RETHUNK) +=3D --rethunk +objtool-cmds-$(CONFIG_MITIGATION_SLS) +=3D --sls +objtool-cmds-$(CONFIG_STACK_VALIDATION) +=3D --stackval +objtool-cmds-$(CONFIG_HAVE_STATIC_CALL_INLINE) +=3D --static-call +objtool-cmds-$(CONFIG_HAVE_UACCESS_VALIDATION) +=3D --uaccess +objtool-cmds-y +=3D $(OBJTOOL_ARGS) =20 -objtool-args =3D $(objtool-args-y) \ +# objtool options +ifdef CONFIG_CALL_PADDING +objtool-opts-$(CONFIG_CFI) +=3D --cfi +objtool-opts-$(CONFIG_FINEIBT) +=3D --fineibt +endif +ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL +objtool-opts-$(CONFIG_HAVE_OBJTOOL_NOP_MCOUNT) +=3D --mnop +endif +objtool-opts-$(or $(CONFIG_GCOV_KERNEL),$(CONFIG_KCOV)) +=3D --no-unreacha= ble +objtool-opts-$(CONFIG_OBJTOOL_WERROR) +=3D --werror + +objtool-args =3D $(objtool-cmds-y) $(objtool-opts-y) \ $(if $(delay-objtool), --link) \ $(if $(part-of-module), --module) =20 @@ -215,7 +219,7 @@ delay-objtool :=3D $(or $(CONFIG_LTO_CLANG),$(CONFIG_X8= 6_KERNEL_IBT),$(CONFIG_KLP_ cmd_objtool =3D $(if $(objtool-enabled), ; $(objtool) $(objtool-args) $@) cmd_gen_objtooldep =3D $(if $(objtool-enabled), { echo ; echo '$@: $$(wild= card $(objtool))' ; } >> $(dot-target).cmd) =20 -objtool-enabled :=3D y +objtool-enabled =3D $(if $(objtool-cmds-y),y) =20 endif # CONFIG_OBJTOOL =20 diff --git a/scripts/Makefile.vmlinux_o b/scripts/Makefile.vmlinux_o index 527352c222ff6..09af33203bd8d 100644 --- a/scripts/Makefile.vmlinux_o +++ b/scripts/Makefile.vmlinux_o @@ -36,18 +36,13 @@ endif # For !delay-objtool + CONFIG_NOINSTR_VALIDATION, it runs on both translat= ion # units and vmlinux.o, with the latter only used for noinstr/unret validat= ion. =20 -objtool-enabled :=3D $(or $(delay-objtool),$(CONFIG_NOINSTR_VALIDATION)) - -ifeq ($(delay-objtool),y) -vmlinux-objtool-args-y +=3D $(objtool-args-y) -else -vmlinux-objtool-args-$(CONFIG_OBJTOOL_WERROR) +=3D --werror +ifneq ($(delay-objtool),y) +objtool-cmds-y =3D +objtool-opts-y +=3D --link endif =20 -vmlinux-objtool-args-$(CONFIG_NOINSTR_VALIDATION) +=3D --noinstr \ - $(if $(or $(CONFIG_MITIGATION_UNRET_ENTRY),$(CONFIG_MITIGATION_S= RSO)), --unret) - -objtool-args =3D $(vmlinux-objtool-args-y) --link +objtool-cmds-$(CONFIG_NOINSTR_VALIDATION) +=3D --noinstr \ + $(if $(or $(CONFIG_MITIGATION_UNRET_ENTRY),$(CONFIG_MITIGATION_SR= SO)), --unret) =20 # Link of vmlinux.o used for section mismatch analysis # ------------------------------------------------------------------------= --- --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 7DC7E3A4257; Wed, 13 May 2026 03:34:51 +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=1778643291; cv=none; b=G+rILZlhkQGmItYezR67Fs4mUQuoaG9Zjr+2asMXSS+JWtdfyofqTZeZ62WmRkEqxSFXH7Wlbsoyp0HhptNfNwWmGUR8h6JnA3isHkyIdcX3cJupn0WsmRWYXdqAygLmRQYNe/MNIDZOFmf62/G/S88yS3Gb7tB7UGHXUfBz9rM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643291; c=relaxed/simple; bh=voedLEVhufD2EC2qnX2retheCvvJ6sgwG1j/M2rJ6o4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Inqwj1zXiWSCTW9C7y6j+/ywxZZKCNMprMV98kQKjpp/fXQRVp1t0JcknHyKSflw5kbB0OxSMb+y5JpQWUZHs5QoBvcttYQc5UNLrbKoubm0raT0/SE27Rh2H1NboiR3CejwHqv049Y43p4iy/tzTrXw7ijTe0sG5tUhpw1UR2M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hA06cJnD; 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="hA06cJnD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C3F3CC2BCFB; Wed, 13 May 2026 03:34:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643291; bh=voedLEVhufD2EC2qnX2retheCvvJ6sgwG1j/M2rJ6o4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hA06cJnDIUfmXB/3JBgPXTt/tPmcVQStNmHqYSgYdqyZK1z0fhnA5E1Wg+3OSwk4a l8+c9EEraTlHhcNn7ogPeQ/SxzRmhMbzbhv5S5t+feNsOaX+Kpu2J0K4LNjATTU4+X Hsv7TAQEP9qJYXyTOZnWW8Io2lS2QDF3YQ6h7tScpWhbeD2JBV8QITnFwehBfkuSYh p46H1xKZh9y+H9uzV/VPpcoRn3KpKS80XEnstUKE19kRTS2KmXnsYyDhAyzGzSAOn/ NxWt21EH45/0Jg707+N2zxMaWD/QGFatK5a9YDhSE1a5Fy/JXEp9CvMx/87hyCf7/R fKGB57IpVN9Bg== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 10/21] objtool: Ignore jumps to the end of the function for checksum runs Date: Tue, 12 May 2026 20:34:06 -0700 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033406.N0SRbRrzPYTcMKPQyhyIIz9RF_0Iusd4DO3vuXpFKJw@z> Content-Type: text/plain; charset="utf-8" Sometimes Clang arm64 code jumps to the end of the function for UB. No need to make that an error for checksum runs. Signed-off-by: Josh Poimboeuf --- tools/objtool/check.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 10b18cf9c3608..73451aef68029 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -37,6 +37,22 @@ struct disas_context *objtool_disas_ctx; =20 size_t sym_name_max_len; =20 +static bool validate_branch_enabled(void) +{ + return opts.stackval || + opts.orc || + opts.uaccess; +} + +static bool alts_needed(void) +{ + return validate_branch_enabled() || + opts.noinstr || + opts.hack_jump_label || + opts.disas || + opts.checksum; +} + struct instruction *find_insn(struct objtool_file *file, struct section *sec, unsigned long offset) { @@ -1593,10 +1609,14 @@ static int add_jump_destinations(struct objtool_fil= e *file) /* * GCOV/KCOV dead code can jump to the end of * the function/section. + * + * Clang on arm64 also does this sometimes for + * undefined behavior. */ - if (file->ignore_unreachables && func && - dest_sec =3D=3D insn->sec && - dest_off =3D=3D func->offset + func->len) + if (!validate_branch_enabled() || + (file->ignore_unreachables && func && + dest_sec =3D=3D insn->sec && + dest_off =3D=3D func->offset + func->len)) continue; =20 ERROR_INSN(insn, "can't find jump dest instruction at %s", @@ -2584,22 +2604,6 @@ static void mark_holes(struct objtool_file *file) } } =20 -static bool validate_branch_enabled(void) -{ - return opts.stackval || - opts.orc || - opts.uaccess; -} - -static bool alts_needed(void) -{ - return validate_branch_enabled() || - opts.noinstr || - opts.hack_jump_label || - opts.disas || - opts.checksum; -} - int decode_file(struct objtool_file *file) { arch_initial_func_cfi_state(&initial_func_cfi); --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 38AED3ACEE6; Wed, 13 May 2026 03:34:52 +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=1778643292; cv=none; b=KUVOsBTKOuGqaFI5Py3iL6n0dfYmOAMkeOdZORwl1+eCRe07h0qSdIjRcqiD7i65X2isKdEL5EzgoztbODXeFgQnGmLV4D/7sHbadDvtyAJNQlx5hhM/ZkEquXGeiAxgrnIdbXWHgftIwsZ+9cP+vAAiWJs7NTeOMEdQ2pp4kNE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643292; c=relaxed/simple; bh=ODGizz8YbR/8nDzbjCn/eHHTqaD5XRXQRwu11kVeY3w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z4VOohZPeV0bEloJPim2mFlluxcjN5sruqPu/mOUvjfYlUuCn91bEUa2+3a+u6RzpPPHfbxrsvzfq9w6zt+exfa6VkLSZFlyCcwn2HUmvP6UspfjW2a1V8XyvpiqlPK8rXIBmE2txXJFTjnCocGql2LBZyV4h1fxkFhwgs8R2Gc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NMiWyLW6; 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="NMiWyLW6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E053C4AF0D; Wed, 13 May 2026 03:34:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643292; bh=ODGizz8YbR/8nDzbjCn/eHHTqaD5XRXQRwu11kVeY3w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NMiWyLW60yMaQJRFMpFsG2x/tYVDBFTC+RFGW45F8KIzNe2h+qEU9EgK47Hgoa3Fw MfVnKXDYigAxRRB2T/b5/2dHIOwhc6wvf4gl2kPaBX7RUfnCUC+zTOOc24muOOYSIN NL4BK7F6laycDe1cjhVmqVINhc38hYamVZCmJ6Hr1evmtXLCQ0h7rJ0aK6jMuOyF6T 5VIz0vmzb/3Zx9X8/spdwfZCvzZOktZPjURrYf/1caKVzIvNmz7t1arPN9hNrq6YA1 9lTZjIDLbtoSMnz1wpzu388doH28MFD37/AqGU28ooyHktzTHMlw00tDUvZ518eWdl SEESt7o85No6Q== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 11/21] objtool: Allow empty alternatives Date: Tue, 12 May 2026 20:34:07 -0700 Message-ID: <3c474673ec5ddc9f27fbf5ddb1fd0f66ef6a779f.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033407.6YB5AJ2lICWuCiE-jV9IwV-kogo4tCGV03dzgYw8g0Q@z> Content-Type: text/plain; charset="utf-8" arm64 can have empty alternatives, which are effectively no-ops. Ignore them. While at it, fix a memory leak. Acked-by: Song Liu Signed-off-by: Josh Poimboeuf --- tools/objtool/check.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 73451aef68029..e05dc7a93dc1e 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -1953,6 +1953,9 @@ static int add_special_section_alts(struct objtool_fi= le *file) =20 list_for_each_entry_safe(special_alt, tmp, &special_alts, list) { =20 + if (special_alt->group && !special_alt->orig_len) + goto next; + orig_insn =3D find_insn(file, special_alt->orig_sec, special_alt->orig_off); if (!orig_insn) { @@ -1973,10 +1976,6 @@ static int add_special_section_alts(struct objtool_f= ile *file) } =20 if (special_alt->group) { - if (!special_alt->orig_len) { - ERROR_INSN(orig_insn, "empty alternative entry"); - continue; - } =20 if (handle_group_alt(file, special_alt, orig_insn, &new_insn)) return -1; @@ -2014,6 +2013,7 @@ static int add_special_section_alts(struct objtool_fi= le *file) a->next =3D alt; } =20 +next: list_del(&special_alt->list); free(special_alt); } --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 3B4AF3ADB92; Wed, 13 May 2026 03:34:52 +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=1778643293; cv=none; b=jmfx/StoPcFZbqB7d6H07SI6qw1iDhybfgxzpDRJYnskOSV1NVfa/b2fVu3caefmKgYyDGEqptHSnOfXPTSCx3hCt8TBNkW88esL/0fBzukPewVbeL1ZM0Gu4yqEkP/J3/5kbq/riC2NFaD7/SSPCHD6BdYEelfezaqFOM1NZkw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643293; c=relaxed/simple; bh=Ny02yZ3OX6brRIw4EOBZjdfKy5OscDww5EM574zM+io=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Lj/g4Jh/7nLi/9jd28fieEfJUkm4CWd0NrXIQ/NOVh/jHzu/LJ1oQX6cNSVu53ytZtt8aXlO8G12CqXgn4NkCHNru1BoUp5Ltb0ZeXuAx6j8ESZB8Jxn/+C/fg5dNWVgmt/VvKrlfy6AVzZT7Vg7mfd7adIhhPuVeiY8cJYdTiA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KfvG7GRW; 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="KfvG7GRW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3E36EC4AF11; Wed, 13 May 2026 03:34:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643292; bh=Ny02yZ3OX6brRIw4EOBZjdfKy5OscDww5EM574zM+io=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KfvG7GRW0rzfBjvlsV4CVsesK0XKMhPRDKL/c3WKAKJbs4n+BpSd2ktCjwZsMz4rm thGDPtFPu2w9MnWwug/qI5csNRFYEx5kj8OOGuh5UVXSqgnZyFPErEF7Q+CJM8nK1/ PBiidRGdljae2B8kFUa/eCEC1E2bvSp2ywLTQKU71xHJ8q1Dpvcye2OHnvtydGqGNM L69o1+Ox1CW0VLYSyWXEy1pHzli6r4BW2rznYdreIz0C8RZmVJE/PmJw8Crb1fyB7H gYiGCZPKrCpCQ+BEvpn1vrl1hPG4EK26vdCcJr2k4EFKRD7PWL2fJY0OktUmqRDpH9 TfiSrz6rdJVrA== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 12/21] objtool: Refactor elf_add_data() to use a growable data buffer Date: Tue, 12 May 2026 20:34:08 -0700 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033408.1ZFb2x8-oSTFMWeQJYaVS7d61vl60pmihmMFdLyLrG0@z> Content-Type: text/plain; charset="utf-8" Instead of calling elf_newdata() for each new piece of data with its own separate buffer, keep it all in the same growable buffer so the section's entire data can be accessed if needed. Signed-off-by: Josh Poimboeuf --- tools/objtool/elf.c | 123 ++++++++++++++-------------- tools/objtool/include/objtool/elf.h | 13 ++- 2 files changed, 71 insertions(+), 65 deletions(-) diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index 33c95a74a51bd..e09bb0a63be35 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -1134,9 +1134,6 @@ static int read_relocs(struct elf *elf) =20 rsec->base->rsec =3D rsec; =20 - /* nr_alloc_relocs=3D0: libelf owns d_buf */ - rsec->nr_alloc_relocs =3D 0; - rsec->relocs =3D calloc(sec_num_entries(rsec), sizeof(*reloc)); if (!rsec->relocs) { ERROR_GLIBC("calloc"); @@ -1395,7 +1392,7 @@ unsigned int elf_add_string(struct elf *elf, struct s= ection *strtab, const char =20 void *elf_add_data(struct elf *elf, struct section *sec, const void *data,= size_t size) { - unsigned long offset; + unsigned long offset, size_old, size_new, alloc_size_old, alloc_size_new; Elf_Scn *s; =20 if (!sec->sh.sh_addralign) { @@ -1409,30 +1406,55 @@ void *elf_add_data(struct elf *elf, struct section = *sec, const void *data, size_ return NULL; } =20 - sec->data =3D elf_newdata(s); if (!sec->data) { - ERROR_ELF("elf_newdata"); - return NULL; + sec->data =3D elf_newdata(s); + if (!sec->data) { + ERROR_ELF("elf_newdata"); + return NULL; + } + + sec->data->d_align =3D sec->sh.sh_addralign; } =20 - sec->data->d_buf =3D calloc(1, size); - if (!sec->data->d_buf) { - ERROR_GLIBC("calloc"); - return NULL; + size_old =3D sec->data->d_size; + offset =3D ALIGN(size_old, sec->sh.sh_addralign); + size_new =3D offset + size; + + if (!sec->data_overallocated) + alloc_size_old =3D size_old; + else + alloc_size_old =3D max(64UL, roundup_pow_of_two(size_old ? : 1)); + + alloc_size_new =3D max(64UL, roundup_pow_of_two(size_new ? : 1)); + + if (alloc_size_new > alloc_size_old) { + void *orig_buf =3D sec->data->d_buf; + + sec->data->d_buf =3D calloc(1, alloc_size_new); + if (!sec->data->d_buf) { + ERROR_GLIBC("calloc"); + return NULL; + } + + if (size_old) + memcpy(sec->data->d_buf, orig_buf, size_old); + + if (orig_buf && sec->data_owned) + free(orig_buf); + + sec->data_owned =3D 1; + sec->data_overallocated =3D 1; } =20 if (data) - memcpy(sec->data->d_buf, data, size); - - sec->data->d_size =3D size; - sec->data->d_align =3D sec->sh.sh_addralign; - - offset =3D ALIGN(sec_size(sec), sec->sh.sh_addralign); - sec->sh.sh_size =3D offset + size; + memcpy(sec->data->d_buf + offset, data, size); + else + memset(sec->data->d_buf + offset, 0, size); =20 + sec->data->d_size =3D size_new; + sec->sh.sh_size =3D size_new; mark_sec_changed(elf, sec, true); - - return sec->data->d_buf; + return sec->data->d_buf + offset; } =20 struct section *elf_create_section(struct elf *elf, const char *name, @@ -1483,6 +1505,8 @@ struct section *elf_create_section(struct elf *elf, c= onst char *name, ERROR_GLIBC("calloc"); return NULL; } + + sec->data_owned =3D 1; } =20 if (!gelf_getshdr(s, &sec->sh)) { @@ -1533,60 +1557,33 @@ static int elf_alloc_reloc(struct elf *elf, struct = section *rsec) struct reloc *old_relocs, *old_relocs_end, *new_relocs; unsigned int nr_relocs_old =3D sec_num_entries(rsec); unsigned int nr_relocs_new =3D nr_relocs_old + 1; - unsigned long nr_alloc; + unsigned long nr_alloc_old =3D 0, nr_alloc_new; struct symbol *sym; =20 - if (!rsec->data) { - rsec->data =3D elf_newdata(elf_getscn(elf->elf, rsec->idx)); - if (!rsec->data) { - ERROR_ELF("elf_newdata"); - return -1; - } + if (!elf_add_data(elf, rsec, NULL, elf_rela_size(elf))) + return -1; =20 - rsec->data->d_align =3D 1; - rsec->data->d_type =3D ELF_T_RELA; - rsec->data->d_buf =3D NULL; - } + rsec->data->d_type =3D ELF_T_RELA; =20 - rsec->data->d_size =3D nr_relocs_new * elf_rela_size(elf); - rsec->sh.sh_size =3D rsec->data->d_size; + if (rsec->relocs_overallocated) + nr_alloc_old =3D max(64UL, roundup_pow_of_two(nr_relocs_old ? : 1)); + else + nr_alloc_old =3D nr_relocs_old; =20 - nr_alloc =3D max(64UL, roundup_pow_of_two(nr_relocs_new)); - if (nr_alloc <=3D rsec->nr_alloc_relocs) + nr_alloc_new =3D max(64UL, roundup_pow_of_two(nr_relocs_new ? : 1)); + + if (nr_alloc_old =3D=3D nr_alloc_new) return 0; =20 - if (rsec->data->d_buf && !rsec->nr_alloc_relocs) { - void *orig_buf =3D rsec->data->d_buf; - - /* - * The original d_buf is owned by libelf so it can't be - * realloced. - */ - rsec->data->d_buf =3D malloc(nr_alloc * elf_rela_size(elf)); - if (!rsec->data->d_buf) { - ERROR_GLIBC("malloc"); - return -1; - } - memcpy(rsec->data->d_buf, orig_buf, - nr_relocs_old * elf_rela_size(elf)); - } else { - rsec->data->d_buf =3D realloc(rsec->data->d_buf, - nr_alloc * elf_rela_size(elf)); - if (!rsec->data->d_buf) { - ERROR_GLIBC("realloc"); - return -1; - } - } - - rsec->nr_alloc_relocs =3D nr_alloc; - - old_relocs =3D rsec->relocs; - new_relocs =3D calloc(nr_alloc, sizeof(struct reloc)); + new_relocs =3D calloc(nr_alloc_new, sizeof(struct reloc)); if (!new_relocs) { ERROR_GLIBC("calloc"); return -1; } =20 + rsec->relocs_overallocated =3D 1; + + old_relocs =3D rsec->relocs; if (!old_relocs) goto done; =20 @@ -1631,6 +1628,7 @@ static int elf_alloc_reloc(struct elf *elf, struct se= ction *rsec) } =20 free(old_relocs); + done: rsec->relocs =3D new_relocs; return 0; @@ -1660,7 +1658,6 @@ struct section *elf_create_rela_section(struct elf *e= lf, struct section *sec, if (nr_relocs) { rsec->data->d_type =3D ELF_T_RELA; =20 - rsec->nr_alloc_relocs =3D nr_relocs; rsec->relocs =3D calloc(nr_relocs, sizeof(struct reloc)); if (!rsec->relocs) { ERROR_GLIBC("calloc"); diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/ob= jtool/elf.h index d9c44df9cc76a..0801fcad516bb 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -58,9 +58,18 @@ struct section { Elf_Data *data; const char *name; int idx; - bool _changed, text, rodata, noinstr, init, truncate; + u32 _changed : 1, + text : 1, + rodata : 1, + noinstr : 1, + init : 1, + truncate : 1, + data_owned : 1, + data_overallocated : 1, + relocs_overallocated : 1; + /* 23 bit hole */ + struct reloc *relocs; - unsigned long nr_alloc_relocs; struct section *twin; }; =20 --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 A29973A4F33; Wed, 13 May 2026 03:34:53 +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=1778643293; cv=none; b=Y0HsA4sAnz2UWUNpAM0tgeeD+xbVllfFOjerOX3Ti/rwxsNVd5IzsP3BiwDYTuxMJRMRBB98ADtNNRQgr4/1kt5knueQe5a+5wHpfrknEtwMwcIxIcSD3hhRcNBgJyIqn4Co/1eafeQp8d32ab0JvyKCZ16Zq46fCvIiHCrFJvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643293; c=relaxed/simple; bh=lYQ1yov6GYXVE+5pFJSvbDLFJ5lLXCdGtVTWLqgmeuM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jkBd+w7yjYWPT8zDnz9dK5+rJn8GAU+5/4Dm/bZxInxYb081DkZAQ0YiSiIhsw2XvSbZvxKJemHZ95Y65aeqp9s45Ty8Jh23yYhIcPnYdKJfoTHt1mhBGEgzv1kAw19XbcWwUwpBPZgRD1FWPk0sC8zc6jQFk3MAR2IOvyvPz8w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PGYOhOsB; 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="PGYOhOsB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EAAC3C2BCFD; Wed, 13 May 2026 03:34:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643293; bh=lYQ1yov6GYXVE+5pFJSvbDLFJ5lLXCdGtVTWLqgmeuM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PGYOhOsB1l9PgfOcHexCpsxifLmrVATJQBGZNZHmdkwnC5oejNuu4vj5eWe0SMaG5 lRAZJjthUe+ZNkcKO/ZoRrG8yKxtUxuW1FuUbHJU2ljX0GVApSJ66YmpgceIFV9snr nDShSgveH1aRcIPaZVgFzmwiI6yamzf3v+fX477Q+3u0Ez7SvLPCsND3nnrGBr8hZO Q3xUDrtkn/3spXcF8+4roPjMM/icQ2GV9D6DgSK3O6RYTtortpyX3VA9iQgbnJhmO7 OkA4dxPzrkvFgAWYQCV5PfH4T30+EegvDKSY80d28fp7RlZVXYyFW5BeocLWS3xqyn PMWd6gm+hEJhw== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 13/21] objtool: Reuse string references Date: Tue, 12 May 2026 20:34:09 -0700 Message-ID: <8881010b54f07432929acb8e704cd6ffcc835318.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033409.3Deuzh-UhS9ep0WpZuuY3I8-fwRHB96_HAsFzlcEoNc@z> Content-Type: text/plain; charset="utf-8" For duplicate strings, elf_add_string() just blindly adds duplicates. That can be a problem for arm64 which often uses two consecutive instructions (and corresponding relocations) to put an address into a register, like: d8: 90000001 adrp x1, 0 d8: R_AARCH= 64_ADR_PREL_PG_HI21 .rodata.meminfo_proc_show.str1.8 dc: 91000021 add x1, x1, #0x0 dc: R_AARCH64_ADD_ABS_LO12_= NC .rodata.meminfo_proc_show.str1.8 Referencing two different addresses in the ADRP+ADD pair would corrupt the memory access. Avoid that by detecting and reusing duplicates when cloning string relocs. Signed-off-by: Josh Poimboeuf --- tools/objtool/elf.c | 29 +++++++++++++++++++++++------ tools/objtool/include/objtool/elf.h | 3 ++- tools/objtool/klp-diff.c | 4 +++- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index e09bb0a63be35..065ccfeb98288 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -1366,9 +1366,27 @@ struct elf *elf_create_file(GElf_Ehdr *ehdr, const c= har *name) return elf; } =20 -unsigned int elf_add_string(struct elf *elf, struct section *strtab, const= char *str) +int elf_find_string(struct elf *elf, struct section *strtab, const char *s= tr) { - unsigned int offset; + char *d_buf; + int i; + + if (!strtab->data) + return -1; + + d_buf =3D strtab->data->d_buf; + + for (i =3D 0; i < strtab->data->d_size; i +=3D strlen(d_buf + i) + 1) { + if (!strcmp(d_buf + i, str)) + return i; + } + + return -1; +} + +int elf_add_string(struct elf *elf, struct section *strtab, const char *st= r) +{ + void *data; =20 if (!strtab) strtab =3D find_section_by_name(elf, ".strtab"); @@ -1382,12 +1400,11 @@ unsigned int elf_add_string(struct elf *elf, struct= section *strtab, const char return -1; } =20 - offset =3D ALIGN(sec_size(strtab), strtab->sh.sh_addralign); - - if (!elf_add_data(elf, strtab, str, strlen(str) + 1)) + data =3D elf_add_data(elf, strtab, str, strlen(str) + 1); + if (!data) return -1; =20 - return offset; + return data - strtab->data->d_buf; } =20 void *elf_add_data(struct elf *elf, struct section *sec, const void *data,= size_t size) diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/ob= jtool/elf.h index 0801fcad516bb..d895023674673 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -187,7 +187,8 @@ struct symbol *elf_create_section_symbol(struct elf *el= f, struct section *sec); void *elf_add_data(struct elf *elf, struct section *sec, const void *data, size_t size); =20 -unsigned int elf_add_string(struct elf *elf, struct section *strtab, const= char *str); +int elf_find_string(struct elf *elf, struct section *strtab, const char *s= tr); +int elf_add_string(struct elf *elf, struct section *strtab, const char *st= r); =20 struct reloc *elf_create_reloc(struct elf *elf, struct section *sec, unsigned long offset, struct symbol *sym, diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c index 6a1cec57dc6a3..6957292e455e4 100644 --- a/tools/objtool/klp-diff.c +++ b/tools/objtool/klp-diff.c @@ -1509,7 +1509,9 @@ static int clone_reloc(struct elfs *e, struct reloc *= patched_reloc, =20 __dbg_clone("\"%s\"", escape_str(str)); =20 - addend =3D elf_add_string(e->out, out_sym->sec, str); + addend =3D elf_find_string(e->out, out_sym->sec, str); + if (addend =3D=3D -1) + addend =3D elf_add_string(e->out, out_sym->sec, str); if (addend =3D=3D -1) return -1; } --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 519603AF640; Wed, 13 May 2026 03:34:54 +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=1778643295; cv=none; b=ICuPZFmdVYflWnZtRHlBBH/0LhG5kJjCptD/DASrBpNs9CIxYVm3m+wwFST3VeBQI9dsjqB/62ErGENynstZsysa+29dgQJl0Cqzt4pPHrh1qCvAbd7OlB5r2cNVHWmdLJIPjgIf6Jqyw+RJs+ddDgvmLQ3f31FQywX7SL3YgWM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643295; c=relaxed/simple; bh=OGkHFIyLNKCb25myeDpCNSwUOYdeu6CUYnno4eQa9zw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CAjUdgg8RJY/eQlpicpD0tJjdhCfTpOOEBZUPGo1bBx/wc+ww1U+9hfUVmIoUexqeK/hvHWjEsYWb8EyA/M3MShKFY8H77ZonS400511ZLgn8I5VccoyW+5r/pnrhmvuusGLkZtjAbhKU8R+Awo5xreHZ1N/5h7AmAnfEMK/Qxo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B8LNs2H5; 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="B8LNs2H5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9B2C5C2BCFB; Wed, 13 May 2026 03:34:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643294; bh=OGkHFIyLNKCb25myeDpCNSwUOYdeu6CUYnno4eQa9zw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B8LNs2H5q9DoQh/gBLO6iq6c01v+CW3QYgvgdboI9yooOmjPi2YU3NBCqF8kwvloo y0CMhWJGa3HpAv1i8h2v0lZVqzSvHfZ8cjBJKoXKwBdIE52TCwUEdCqqLfto038AaG eY2b9PxciMUJ47Eke5ffmHvBIT366BLiHKG9n6QewEK8TvV3ZzctsGUFYp0LR6ntGN XS6HF6wrHR2OwYUJASqwpBcjiIQZdNDhjsu+ySUQcybaLfB2NZJLFTp8mb0CCysk2q nfkQomctMVj4q4vvFfVCEYDL1dy8mb73ukhMlq0xCS2Md76QV/miojoPcvuNRJMfzP iMto8EcNZXEKA== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 14/21] objtool: Prevent kCFI hashes from being decoded as instructions Date: Tue, 12 May 2026 20:34:10 -0700 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033410.kIjTilwQ-yN7wsi9BrSDBxGtTXii_WvjElCFnJb8AOY@z> Content-Type: text/plain; charset="utf-8" On arm64 with CONFIG_CFI=3Dy, Clang places a 4-byte kCFI type hash immediately before each address-taken function entry. Since these hashes are in the text section, objtool tries to decode them, leading to unpredictable results (e.g., "unannotated intra-function call"). arm64 uses mapping symbols to annotate where code ends and data begins (and vice versa). Use those to just mark such "instructions" as NOP so objtool will ignore them. Signed-off-by: Josh Poimboeuf --- tools/objtool/check.c | 15 +++++++++++++++ tools/objtool/include/objtool/elf.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index e05dc7a93dc1e..2b03a2d6fc952 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -25,6 +25,7 @@ #include #include #include +#include =20 static unsigned long nr_cfi, nr_cfi_reused, nr_cfi_cache; =20 @@ -428,6 +429,8 @@ static int decode_instructions(struct objtool_file *fil= e) =20 for_each_sec(file->elf, sec) { struct instruction *insns =3D NULL; + struct symbol *map_sym; + bool is_data =3D false; u8 prev_len =3D 0; u8 idx =3D 0; =20 @@ -454,6 +457,8 @@ static int decode_instructions(struct objtool_file *fil= e) if (!strcmp(sec->name, ".init.text") && !opts.module) sec->init =3D true; =20 + map_sym =3D list_first_entry(&sec->symbol_list, struct symbol, list); + for (offset =3D 0; offset < sec_size(sec); offset +=3D insn->len) { if (!insns || idx =3D=3D INSN_CHUNK_MAX) { insns =3D calloc(INSN_CHUNK_SIZE, sizeof(*insn)); @@ -478,6 +483,16 @@ static int decode_instructions(struct objtool_file *fi= le) =20 prev_len =3D insn->len; =20 + /* Use mapping symbols to skip data in text sections */ + sec_for_each_sym_from(sec, map_sym) { + if (map_sym->offset > offset) + break; + if (is_mapping_sym(map_sym)) + is_data =3D is_data_mapping_sym(map_sym); + } + if (is_data) + insn->type =3D INSN_NOP; + /* * By default, "ud2" is a dead end unless otherwise * annotated, because GCC 7 inserts it for certain diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/ob= jtool/elf.h index d895023674673..9d36b14f420e2 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -507,6 +507,9 @@ static inline void set_sym_next_reloc(struct reloc *rel= oc, struct reloc *next) #define sec_for_each_sym(sec, sym) \ list_for_each_entry(sym, &sec->symbol_list, list) =20 +#define sec_for_each_sym_from(sec, sym) \ + list_for_each_entry_from(sym, &sec->symbol_list, list) + #define sec_prev_sym(sym) \ sym->sec && sym->list.prev !=3D &sym->sec->symbol_list ? \ list_prev_entry(sym, list) : NULL --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 270843AEF4B; Wed, 13 May 2026 03:34:55 +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=1778643295; cv=none; b=pR1PY3oL9GfgYwow2nmdy6GAI3oGLVooIfF57oAjGqFZq80OH1lzV1MZcSy9cyYUPJqyTD+bIHAD4jJ6W8Ln8walKff7t1vk52dhjYWC25UFlcEBEe6aViwuXU01zei3UKn2ezdcjwshDGaCF3FodTfpG/uZS7Nes7khWrBakUI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643295; c=relaxed/simple; bh=jFDTETNcRZkO+WMEenMV2NobbCVqrkY8dx/Pz4H2Wk8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ay9//z3I/9PCaYLnXWSnGvJ/IqgpM6Be/Ea6MglGsztXlBbAmDMrHHSCCqnFRYSZyWXFsZIlgtHsQX7lnYdzw1HTkoUzWDCVhtlyM4D8guNz5GAAGeMt4vsTEJUxcvq4EVOrgOzS6efIUcfmwek66OoXpdbTaK3ee5mokZwtW3k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HhRMU5ny; 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="HhRMU5ny" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 622D9C32781; Wed, 13 May 2026 03:34:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643295; bh=jFDTETNcRZkO+WMEenMV2NobbCVqrkY8dx/Pz4H2Wk8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HhRMU5nyZGk0qmy6luwh9Bvni2CL50D5jbW+CbbcOACEdQ1UfseznLeg9Yz7KnvMT 107G49TNUCLyFbG2EKgKiqFDx9Vxly4+m5BxT9CQdf758mGug8mFvbRPaqP17XBFoq PLS+vmFt5l1KiJrLCaTp48N53ZwxYavANG6lGwk0e+DSrF8JQ8V4r2M73ecEa6lTlM 1++FRbkSuo92fEMFw6HoSvCdK46CpRD/Dowh8IOQaURB9YmZX/sJrckE6Mg3jwqSJ3 mJAxo+Syie2d2dM0MS+ev7Or6VWpKwAB0WfAPftfMvzRxewM3OT7/wUzdDfi/ahMnS nw1+9mojPPlgg== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 15/21] objtool/klp: Add arm64 support for prefix/PFE detection Date: Tue, 12 May 2026 20:34:11 -0700 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033411.8Rh5sH3FIvtaf9RcTfNZ4Cs_lPJgl8qt2Koe2Db8DDA@z> Content-Type: text/plain; charset="utf-8" Add arm64 support for detecting prefixed areas before functions (for kCFI or ftrace with call ops), and __patchable_function_entries (for ftrace with call ops or args). Signed-off-by: Josh Poimboeuf --- tools/objtool/arch/x86/include/arch/elf.h | 2 + tools/objtool/elf.c | 13 ++ tools/objtool/include/objtool/elf.h | 22 +++ tools/objtool/klp-diff.c | 166 ++++++++++++++++++++-- 4 files changed, 192 insertions(+), 11 deletions(-) diff --git a/tools/objtool/arch/x86/include/arch/elf.h b/tools/objtool/arch= /x86/include/arch/elf.h index 7131f7f51a4e8..5ee0ccda7db18 100644 --- a/tools/objtool/arch/x86/include/arch/elf.h +++ b/tools/objtool/arch/x86/include/arch/elf.h @@ -10,4 +10,6 @@ #define R_TEXT32 R_X86_64_PC32 #define R_TEXT64 R_X86_64_PC32 =20 +#define ARCH_HAS_PREFIX_SYMBOLS 1 + #endif /* _OBJTOOL_ARCH_ELF */ diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index 065ccfeb98288..9d5a926934dc2 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -274,6 +274,19 @@ struct symbol *find_func_containing(struct section *se= c, unsigned long offset) return NULL; } =20 +struct symbol *find_data_mapping_sym(struct section *sec, unsigned long of= fset) +{ + struct rb_root_cached *tree =3D (struct rb_root_cached *)&sec->symbol_tre= e; + struct symbol *sym; + + __sym_for_each(sym, tree, offset, offset) { + if (sym->offset =3D=3D offset && is_data_mapping_sym(sym)) + return sym; + } + + return NULL; +} + struct symbol *find_symbol_by_name(const struct elf *elf, const char *name) { struct symbol *sym; diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/ob= jtool/elf.h index 9d36b14f420e2..ab1d53ed23189 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -130,6 +130,7 @@ struct elf { struct list_head sections; struct list_head symbols; unsigned long num_relocs; + int pfe_offset; =20 int symbol_bits; int symbol_name_bits; @@ -229,6 +230,7 @@ struct reloc *find_reloc_by_dest(const struct elf *elf,= struct section *sec, uns struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct secti= on *sec, unsigned long offset, unsigned int len); struct symbol *find_func_containing(struct section *sec, unsigned long off= set); +struct symbol *find_data_mapping_sym(struct section *sec, unsigned long of= fset); =20 /* * Try to see if it's a whole archive (vmlinux.o or module). @@ -295,6 +297,26 @@ static inline bool is_notype_sym(struct symbol *sym) return sym->type =3D=3D STT_NOTYPE; } =20 +/* + * ARM64 mapping symbols ($d, $x, $a, __pi_$d, etc) which mark transitions + * between code and data. + */ +static inline bool is_mapping_sym(struct symbol *sym) +{ + return is_notype_sym(sym) && strchr(sym->name, '$'); +} + +static inline bool is_data_mapping_sym(struct symbol *sym) +{ + const char *dollar; + + if (!is_mapping_sym(sym)) + return false; + + dollar =3D strchr(sym->name, '$'); + return dollar && dollar[1] =3D=3D 'd'; +} + static inline bool is_global_sym(struct symbol *sym) { return sym->bind =3D=3D STB_GLOBAL; diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c index 6957292e455e4..eb21f3bf3120b 100644 --- a/tools/objtool/klp-diff.c +++ b/tools/objtool/klp-diff.c @@ -20,6 +20,7 @@ #include #include #include +#include =20 #define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) =20 @@ -213,6 +214,98 @@ static int read_sym_checksums(struct elf *elf) return 0; } =20 +/* + * For non-x86, detect the offset from the function entry point to its + * __patchable_function_entries (PFE) relocation target. x86 doesn't need= this, + * it clones the __cfi/__pfx symbol instead. + * + * offset < 0 (before function entry): + * + * CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS (arm64) + * + * offset =3D=3D 0 (at function entry): + * + * CONFIG_DYNAMIC_FTRACE_WITH_ARGS without BTI (arm64) + * + * offset > 0 (after function entry): + * + * CONFIG_DYNAMIC_FTRACE_WITH_ARGS with BTI (arm64) + */ +static int read_pfe_offset(struct elf *elf) +{ + bool has_pfe =3D false; + struct section *sec; + + if (__is_defined(ARCH_HAS_PREFIX_SYMBOLS)) + return 0; + + for_each_sec(elf, sec) { + struct reloc *reloc; + + if (strcmp(sec->name, "__patchable_function_entries")) + continue; + if (!sec->rsec) + continue; + + has_pfe =3D true; + + for_each_reloc(sec->rsec, reloc) { + unsigned long target =3D reloc->sym->offset + reloc_addend(reloc); + struct symbol *func; + + /* arm64 func */ + func =3D find_func_containing(reloc->sym->sec, target); + if (func) { + elf->pfe_offset =3D target - func->offset; + return 0; + } + + /* arm64 CALL_OPS */ + func =3D find_func_by_offset(reloc->sym->sec, target + 8); + if (func) { + elf->pfe_offset =3D -8; + return 0; + } + } + } + + if (has_pfe) { + ERROR("can't find __patchable_function_entries offset"); + return -1; + } + + return 0; +} + +/* + * Detect the size of the area before a function's entry point. This pref= ix + * area is used for CFI type hashes or ftrace call ops. + * + * $d mapping symbol (arm64): + * + * CONFIG_CFI + * + * PFE before function entry, no symbol (arm64): + * + * CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS + */ +static unsigned long func_pfx_size(struct elf *elf, struct symbol *func) +{ + if (__is_defined(ARCH_HAS_PREFIX_SYMBOLS)) + return 0; + + /* arm64 kCFI $d data mapping symbol */ + if (func->offset >=3D 4 && + find_data_mapping_sym(func->sec, func->offset - 4)) + return 4; + + /* arm64 CALL_OPS (mutually exclusive with kCFI) */ + if (elf->pfe_offset < 0 && func->offset >=3D -elf->pfe_offset) + return -elf->pfe_offset; + + return 0; +} + static struct symbol *first_file_symbol(struct elf *elf) { struct symbol *sym; @@ -302,6 +395,9 @@ static bool is_special_section(struct section *sec) "__ex_table", "__jump_table", "__mcount_loc", +#ifndef ARCH_HAS_PREFIX_SYMBOLS + "__patchable_function_entries", +#endif =20 /* * Extract .static_call_sites here to inherit non-module @@ -931,7 +1027,7 @@ static struct symbol *__clone_symbol(struct elf *elf, = struct symbol *patched_sym bool data_too) { struct section *out_sec =3D NULL; - unsigned long offset =3D 0; + unsigned long offset =3D 0, pfx_size =3D 0; struct symbol *out_sym; =20 if (data_too && !is_undef_sym(patched_sym)) { @@ -963,17 +1059,22 @@ static struct symbol *__clone_symbol(struct elf *elf= , struct symbol *patched_sym void *data =3D NULL; size_t size; =20 + /* Clone (non-x86) function prefix area */ + pfx_size =3D is_func_sym(patched_sym) ? func_pfx_size(elf, patched_sym)= : 0; + /* bss doesn't have data */ if (patched_sym->sec->data && patched_sym->sec->data->d_buf) - data =3D patched_sym->sec->data->d_buf + patched_sym->offset; + data =3D patched_sym->sec->data->d_buf + patched_sym->offset - pfx_siz= e; =20 if (is_sec_sym(patched_sym)) size =3D sec_size(patched_sym->sec); else - size =3D patched_sym->len; + size =3D patched_sym->len + pfx_size; =20 if (!elf_add_data(elf, out_sec, data, size)) return NULL; + + offset +=3D pfx_size; } } =20 @@ -1251,21 +1352,41 @@ static int convert_reloc_sym_to_secsym(struct elf *= elf, struct reloc *reloc) return 0; } =20 +/* + * __patchable_function_entries relocs point to the patchable entry NOPs, + * which are at 'pfe_offset' bytes from the function symbol. + * + * Some entries (e.g., removed weak functions, syscall -ENOSYS stubs) don't + * have a corresponding function symbol. Skip those with a return value o= f 1. + */ +static int convert_pfe_reloc(struct elf *elf, struct reloc *reloc) +{ + struct symbol *func; + + func =3D find_func_by_offset(reloc->sym->sec, + reloc->sym->offset + + reloc_addend(reloc) - elf->pfe_offset); + if (!func) + return 1; + + reloc->sym =3D func; + set_reloc_sym(elf, reloc, func->idx); + set_reloc_addend(elf, reloc, elf->pfe_offset); + return 0; +} + /* Return -1 error, 0 success, 1 skip */ static int convert_reloc_secsym_to_sym(struct elf *elf, struct reloc *relo= c) { struct symbol *sym =3D reloc->sym; struct section *sec =3D sym->sec; =20 + if (!strcmp(reloc->sec->name, ".rela__patchable_function_entries")) + return convert_pfe_reloc(elf, reloc); + if (!is_sec_sym(sym)) return 0; =20 - /* If the symbol has a dedicated section, it's easy to find */ - sym =3D find_symbol_by_offset(sec, 0); - if (sym && sym->len =3D=3D sec_size(sec)) - goto found_sym; - - /* No dedicated section; find the symbol manually */ sym =3D find_symbol_containing_inclusive(sec, arch_adjusted_addend(reloc)= ); if (!sym) { /* @@ -1293,7 +1414,6 @@ static int convert_reloc_secsym_to_sym(struct elf *el= f, struct reloc *reloc) return -1; } =20 -found_sym: reloc->sym =3D sym; set_reloc_sym(elf, reloc, sym->idx); set_reloc_addend(elf, reloc, reloc_addend(reloc) - sym->offset); @@ -1856,6 +1976,9 @@ static int validate_special_section_klp_reloc(struct = elfs *e, struct symbol *sym =20 static int clone_special_section(struct elfs *e, struct section *patched_s= ec) { + bool is_pfe =3D !strcmp(patched_sec->name, "__patchable_function_entries"= ); + struct section *out_sec =3D NULL; + struct reloc *patched_reloc; struct symbol *patched_sym; =20 /* @@ -1863,6 +1986,7 @@ static int clone_special_section(struct elfs *e, stru= ct section *patched_sec) * reference included functions. */ sec_for_each_sym(patched_sec, patched_sym) { + struct symbol *out_sym; int ret; =20 if (!is_object_sym(patched_sym)) @@ -1877,8 +2001,23 @@ static int clone_special_section(struct elfs *e, str= uct section *patched_sec) if (ret > 0) continue; =20 - if (!clone_symbol(e, patched_sym, true)) + out_sym =3D clone_symbol(e, patched_sym, true); + if (!out_sym) return -1; + + if (!is_pfe || (out_sec && out_sec->sh.sh_link)) + continue; + + /* + * For reasons, the patched object has multiple PFE sections, + * but we only need to create one combined section for the + * output. Link the single PFE ouput section to a random text + * section to satisfy the linker for SHF_LINK_ORDER. + */ + out_sec =3D out_sym->sec; + patched_reloc =3D find_reloc_by_dest(e->patched, patched_sec, + patched_sym->offset); + out_sec->sh.sh_link =3D patched_reloc->sym->clone->sec->idx; } =20 return 0; @@ -2175,6 +2314,9 @@ int cmd_klp_diff(int argc, const char **argv) if (read_sym_checksums(e.patched)) return -1; =20 + if (read_pfe_offset(e.patched)) + return -1; + if (correlate_symbols(&e)) return -1; =20 @@ -2188,6 +2330,8 @@ int cmd_klp_diff(int argc, const char **argv) if (!e.out) return -1; =20 + e.out->pfe_offset =3D e.patched->pfe_offset; + /* * Special section fake symbols are needed so that individual special * section entries can be extracted by clone_special_sections(). --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 790A63AFB03; Wed, 13 May 2026 03:34:55 +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=1778643296; cv=none; b=nta2XUdr8PkQpPARI+7GpDmNW7ZMyaDowpj/3kQxxmT9sZZZwizSdYxqffG/nH9iq68B7DUjyqaLYfHMWko6FK73h6iOsVVlR9SIiDy3gs6TZwlW2eg1TwUjVg/3/3rrrtKapu0H7O3EPuCwIkMK6hCT+eElOr+4X9sCOwTqLt4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643296; c=relaxed/simple; bh=+/sFHocRcUihmUH6/AgqXb/DZFT8Oa4f5kM+W19rLY8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ilm2M6f6BIxyxYz0uLeLomGnQu7Q5symcWXxcoCfCKo5p7MljTNHZkwuhgEZQGRruTySDBss/F0iqd/jcnPEDd+vCZTeyk2oWJnmNA2ie7fvA2l9zFpz+kVOzx7OVNstpQPgsKJUXyU4MEr3KH5Ca18mjBugJiYHZroBXJzCbkM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y1MLuE8k; 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="Y1MLuE8k" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2DA6FC32786; Wed, 13 May 2026 03:34:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643295; bh=+/sFHocRcUihmUH6/AgqXb/DZFT8Oa4f5kM+W19rLY8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y1MLuE8k4Kpa6kSM6Z6CrgRxAE+UBR3BnTCR+4FUcvoe2XE26Cdb3MNR2oAiYLgPQ EQ7s0wPlt/suiLGtDORkIo6s85HZk0gqXqB1zOP83dVa6y63DLhuCwAYqjgxqOx/bX eLrqSGqcR4ou1gVc3wbFmR5XhNwP6dZN3ue79RAusmauQtUHndvL/iVIG0RVuBA5Jg O1cs9TQ4dysgBpib8+8RZC5yaNSjHrNpBalkodz0Wpu4zxYXFQkaXPVQkUBRw77+mN NeuWzvDz9lozpURNqiygbc6fKCnu6D3XzXO5DFEPBefsRnXIw9CmQGKRMhS9/Z+bho U6V8vB3I/DLtg== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 16/21] objtool/klp: Filter arm64 mapping symbols in find_symbol_by_offset() Date: Tue, 12 May 2026 20:34:12 -0700 Message-ID: <236050080db7b2462fdb13a03ed48a8efb2415a4.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033412.8X4ZWEOluxGi46RzaDkLq6G-PYNgy0PVZbISsWArpvE@z> Content-Type: text/plain; charset="utf-8" ARM64 ELF objects contain $d/$x mapping symbols (STT_NOTYPE) at offset 0 in data/text sections. These aren't "real" symbols so filter them from find_symbol_by_offset(), consistent with the existing section symbol filter. Signed-off-by: Josh Poimboeuf Acked-by: Song Liu --- tools/objtool/elf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index 9d5a926934dc2..a4d9afa3a079c 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -159,7 +159,7 @@ struct symbol *find_symbol_by_offset(struct section *se= c, unsigned long offset) struct symbol *sym; =20 __sym_for_each(sym, tree, offset, offset) { - if (sym->offset =3D=3D offset && !is_sec_sym(sym)) + if (sym->offset =3D=3D offset && !is_sec_sym(sym) && !is_mapping_sym(sym= )) return sym->alias; } =20 --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 6A2693A8736; Wed, 13 May 2026 03:34:56 +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=1778643296; cv=none; b=KAsY4NT4TvdjINGwWXEzzGLb6D/L282QfaEQPCfIFvv1g0PmVK0tWEAVffJ46WoEvg2MSprX+4y7ZkcDnIMkWbhtH2lYxx2L3U2DcSE14tPSX0/OQTPCbipnwmmXHWq8cNwkcAEdmrowm4ZLpQCaeAsJO6bunDJcDAI60SQctlk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643296; c=relaxed/simple; bh=y8OlQ2u+RBKl5+g5VAi278HKoC71kQ9CG5Kwq0UXfOw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u2dfnWY6WI7aXE19oxizSDpMwQ9kRmE0j+sYjIcNnm823sXVHUj9T1oOj9Zoa4fkA8RwHOX/kOB0PiiGbxqJXtfMQEeI3q8VTwCFbh29J0LK0nV7W7X/H0WTFPuOeAXpom7suTlLYXi2hV0ymf9h91CDGvLENP+9Bjj47L1L2Lw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TwaaG1Fw; 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="TwaaG1Fw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE57CC2BCFB; Wed, 13 May 2026 03:34:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643296; bh=y8OlQ2u+RBKl5+g5VAi278HKoC71kQ9CG5Kwq0UXfOw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TwaaG1FwksSjtDGCqBBb30zlrP/Lef2E9lzbretHPg3Z7pj2aog6WKYOLLmBsLzKD 1RPlSv93beMtMc4YALNhn/nDaxftFgw27pnB7QpPBonygYQr5XqMoshADSOXoNdVSX 8cWdSSDV/0OIJeQVInQMPLrgdQxys0/h5U2vCW0uGz+QYfzYPEmjV4b2vUKImyJVEs vIbVk61qcKWrogRX+NOMgmE+Xvj+ypo+kb6IrcK5igDjuNvKobRFDkn9XmUwoHdh+o nvooKYJaq4fYolQAx1bHfX1JA05hAGrwO/X0g9ywfafSI3cXL6SRa+FMhtqE5j2JlB vIPcIzkI5dbtw== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 17/21] objtool/klp: Don't correlate arm64 mapping symbols Date: Tue, 12 May 2026 20:34:13 -0700 Message-ID: <48efc64058f667159d3dedf367c1d4cdedf84f1c.1778642120.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033413.KyXNxIhmJ4VJ8JzaAY2aUrP1wuKqnirnEkhqZptvUCE@z> Content-Type: text/plain; charset="utf-8" ARM64 ELF files contain mapping symbols ($d, $x, $a, etc.) which mark transitions between code and data. There are thousands of them per object file, all sharing the same few names. They aren't "real" symbols so there's no need to correlate them. Signed-off-by: Josh Poimboeuf --- tools/objtool/klp-diff.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c index eb21f3bf3120b..e1d4d94c9d77c 100644 --- a/tools/objtool/klp-diff.c +++ b/tools/objtool/klp-diff.c @@ -501,6 +501,7 @@ static bool dont_correlate(struct symbol *sym) is_prefix_func(sym) || is_uncorrelated_static_local(sym) || is_local_label(sym) || + is_mapping_sym(sym) || is_string_sec(sym->sec) || is_anonymous_rodata(sym) || is_initcall_sym(sym) || --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 194E13A5457; Wed, 13 May 2026 03:34:56 +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=1778643297; cv=none; b=jdhFtx+U7TYUkbFSWhrxvn4GVh9MXYgpA0XjOjnzGp2vnm2hBS6Ksg4J0zoHhi3xyzTi+u5OlNbibInAEPLcwhqk1eHrrXHv/3qstAc5IGTMLHYAsWy542Jpvj2+mCECvNhkAoiLX6v7uL5ELmeDVy3tDxYoXVxq5El3jc99HH4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643297; c=relaxed/simple; bh=/Ud7RFmvMlyU46qLdzlp+gqu1cwu2w70Cyl79KX3OK0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CqI+cbFgtUeLAnypgntGPXa5YQ1jvoJFEhnssLpx2/kEWTE9jif4WmgKbHwrWzQAi2id72hGQDiQnLQsU6CH6QpbAHiqabGTfJVKD3kDHzx5+JKn8bJIH6Lso5FEUUSPGMSRNZjhZz0G+fmI85UkEP28t66/81jEk0N+aXpcXMY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BAHMWZye; 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="BAHMWZye" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 74873C2BCC7; Wed, 13 May 2026 03:34:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643296; bh=/Ud7RFmvMlyU46qLdzlp+gqu1cwu2w70Cyl79KX3OK0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BAHMWZye+awNKBMXJe0s5jlOd+m/VZf/9rSyW063iL0R8i+kaE9a0gvMOKew7L1Y6 +OUSZfpwIsEpOrIa0stkHA0jf0PfqYQhFO9ZibdzhbOM+bDgZNB8o/Iw1cvRz9147L ZWWams6x9W3aI3fir/8pT8F8+N8mDCIe82jSI16wD1atwLsr3tmL9K3fxo6+vAlF6P K+2jdmsK8nndzFrxGrPlhJiVI27ddZU2CKoKCcLKDcJ3Uh8KeAoXX5Q7DtTi/QGbBA iRzPG7YHG7tlawYdMrADkDzuEskV8hOjnQWSSNipW0ISOqws7B0sdtT2jA9YboFzFm 6Nu9JDf5X6WDw== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 18/21] objtool/klp: Clone inline alternative replacements Date: Tue, 12 May 2026 20:34:14 -0700 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033414.ZdKX1Wh1iN3XsRsKu2-eiE_-Ms44BKqYWvO9jV8M8_8@z> Content-Type: text/plain; charset="utf-8" Unlike x86-64, arm64 places alternative replacement instructions in .text, immediately after the affected function. So if the replacement instructions have PC-relative branches without relocations, their offsets relative to the function have to remain constant. Achieve that by cloning the function's alternative replacements immediately after cloning the function itself. Signed-off-by: Josh Poimboeuf --- tools/objtool/elf.c | 9 +++-- tools/objtool/include/objtool/elf.h | 7 +++- tools/objtool/klp-diff.c | 63 ++++++++++++++++++++++++----- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index a4d9afa3a079c..a5b2929ea0fa9 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -1413,14 +1413,15 @@ int elf_add_string(struct elf *elf, struct section = *strtab, const char *str) return -1; } =20 - data =3D elf_add_data(elf, strtab, str, strlen(str) + 1); + data =3D elf_add_data(elf, strtab, str, strlen(str) + 1, true); if (!data) return -1; =20 return data - strtab->data->d_buf; } =20 -void *elf_add_data(struct elf *elf, struct section *sec, const void *data,= size_t size) +void *elf_add_data(struct elf *elf, struct section *sec, const void *data, + size_t size, bool align) { unsigned long offset, size_old, size_new, alloc_size_old, alloc_size_new; Elf_Scn *s; @@ -1447,7 +1448,7 @@ void *elf_add_data(struct elf *elf, struct section *s= ec, const void *data, size_ } =20 size_old =3D sec->data->d_size; - offset =3D ALIGN(size_old, sec->sh.sh_addralign); + offset =3D ALIGN(size_old, align ? sec->sh.sh_addralign : 1); size_new =3D offset + size; =20 if (!sec->data_overallocated) @@ -1590,7 +1591,7 @@ static int elf_alloc_reloc(struct elf *elf, struct se= ction *rsec) unsigned long nr_alloc_old =3D 0, nr_alloc_new; struct symbol *sym; =20 - if (!elf_add_data(elf, rsec, NULL, elf_rela_size(elf))) + if (!elf_add_data(elf, rsec, NULL, elf_rela_size(elf), true)) return -1; =20 rsec->data->d_type =3D ELF_T_RELA; diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/ob= jtool/elf.h index ab1d53ed23189..fba0a0e08f8b6 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -106,6 +106,8 @@ struct symbol { u8 included : 1; u8 klp : 1; u8 dont_correlate : 1; + u8 fake : 1; + u8 unalign : 1; struct list_head pv_target; struct reloc *relocs; struct section *group_sec; @@ -186,7 +188,7 @@ struct symbol *elf_create_symbol(struct elf *elf, const= char *name, struct symbol *elf_create_section_symbol(struct elf *elf, struct section *= sec); =20 void *elf_add_data(struct elf *elf, struct section *sec, const void *data, - size_t size); + size_t size, bool align); =20 int elf_find_string(struct elf *elf, struct section *strtab, const char *s= tr); int elf_add_string(struct elf *elf, struct section *strtab, const char *st= r); @@ -532,6 +534,9 @@ static inline void set_sym_next_reloc(struct reloc *rel= oc, struct reloc *next) #define sec_for_each_sym_from(sec, sym) \ list_for_each_entry_from(sym, &sec->symbol_list, list) =20 +#define sec_for_each_sym_continue(sec, sym) \ + list_for_each_entry_continue(sym, &sec->symbol_list, list) + #define sec_prev_sym(sym) \ sym->sec && sym->list.prev !=3D &sym->sec->symbol_list ? \ list_prev_entry(sym, list) : NULL diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c index e1d4d94c9d77c..b9624bd9439b9 100644 --- a/tools/objtool/klp-diff.c +++ b/tools/objtool/klp-diff.c @@ -1027,8 +1027,9 @@ static int clone_sym_relocs(struct elfs *e, struct sy= mbol *patched_sym); static struct symbol *__clone_symbol(struct elf *elf, struct symbol *patch= ed_sym, bool data_too) { - struct section *out_sec =3D NULL; unsigned long offset =3D 0, pfx_size =3D 0; + bool align =3D !patched_sym->unalign; + struct section *out_sec =3D NULL; struct symbol *out_sym; =20 if (data_too && !is_undef_sym(patched_sym)) { @@ -1054,7 +1055,7 @@ static struct symbol *__clone_symbol(struct elf *elf,= struct symbol *patched_sym } =20 if (!is_sec_sym(patched_sym)) - offset =3D ALIGN(sec_size(out_sec), out_sec->sh.sh_addralign); + offset =3D ALIGN(sec_size(out_sec), align ? out_sec->sh.sh_addralign : = 1); =20 if (patched_sym->len || is_sec_sym(patched_sym)) { void *data =3D NULL; @@ -1072,7 +1073,7 @@ static struct symbol *__clone_symbol(struct elf *elf,= struct symbol *patched_sym else size =3D patched_sym->len + pfx_size; =20 - if (!elf_add_data(elf, out_sec, data, size)) + if (!elf_add_data(elf, out_sec, data, size, align)) return NULL; =20 offset +=3D pfx_size; @@ -1114,6 +1115,37 @@ static const char *sym_bind(struct symbol *sym) } } =20 +static struct symbol *clone_symbol(struct elfs *e, struct symbol *patched_= sym, + bool data_too); + +/* + * For arm64 alternatives, the replacement instructions come immediately a= fter + * the function. Clone any such blocks of instructions in place to preser= ve + * their offsets relative to the function in case they have hard-coded PC + * relative branches. + */ +static int clone_inline_alternatives(struct elfs *e, struct symbol *patche= d_sym) +{ + struct symbol *next; + + if (!__is_defined(ARCH_HAS_INLINE_ALTS) || !is_func_sym(patched_sym)) + return 0; + + next =3D patched_sym; + sec_for_each_sym_continue(patched_sym->sec, next) { + if (next->offset < (patched_sym->offset + patched_sym->len) || + is_mapping_sym(next)) + continue; + if (!next->fake) + break; + next->unalign =3D 1; + if (!clone_symbol(e, next, true)) + return -1; + } + + return 0; +} + /* * Copy a symbol to the output object, optionally including its data and * relocations. @@ -1138,7 +1170,13 @@ static struct symbol *clone_symbol(struct elfs *e, s= truct symbol *patched_sym, if (!__clone_symbol(e->out, patched_sym, data_too)) return NULL; =20 - if (data_too && clone_sym_relocs(e, patched_sym)) + if (!data_too || is_undef_sym(patched_sym)) + return patched_sym->clone; + + if (clone_sym_relocs(e, patched_sym)) + return NULL; + + if (clone_inline_alternatives(e, patched_sym)) return NULL; =20 return patched_sym->clone; @@ -1551,7 +1589,7 @@ static int clone_reloc_klp(struct elfs *e, struct rel= oc *patched_reloc, memset(&klp_reloc, 0, sizeof(klp_reloc)); =20 klp_reloc.type =3D reloc_type(patched_reloc); - if (!elf_add_data(e->out, klp_relocs, &klp_reloc, sizeof(klp_reloc))) + if (!elf_add_data(e->out, klp_relocs, &klp_reloc, sizeof(klp_reloc), true= )) return -1; =20 /* klp_reloc.offset */ @@ -1714,6 +1752,7 @@ static int create_fake_symbol(struct elf *elf, struct= section *sec, unsigned long offset, size_t size) { char name[SYM_NAME_LEN]; + struct symbol *sym; unsigned int type; static int ctr; char *c; @@ -1730,7 +1769,13 @@ static int create_fake_symbol(struct elf *elf, struc= t section *sec, * while still allowing objdump to disassemble it. */ type =3D is_text_sec(sec) ? STT_NOTYPE : STT_OBJECT; - return elf_create_symbol(elf, name, sec, STB_LOCAL, type, offset, size) ?= 0 : -1; + + sym =3D elf_create_symbol(elf, name, sec, STB_LOCAL, type, offset, size); + if (!sym) + return -1; + + sym->fake =3D 1; + return 0; } =20 /* @@ -2095,7 +2140,7 @@ static int create_klp_sections(struct elfs *e) return -1; =20 /* allocate klp_object_ext */ - obj_data =3D elf_add_data(e->out, obj_sec, NULL, obj_size); + obj_data =3D elf_add_data(e->out, obj_sec, NULL, obj_size, true); if (!obj_data) return -1; =20 @@ -2130,7 +2175,7 @@ static int create_klp_sections(struct elfs *e) continue; =20 /* allocate klp_func_ext */ - func_data =3D elf_add_data(e->out, funcs_sec, NULL, func_size); + func_data =3D elf_add_data(e->out, funcs_sec, NULL, func_size, true); if (!func_data) return -1; =20 @@ -2276,7 +2321,7 @@ static int copy_import_ns(struct elfs *e) } } =20 - if (!elf_add_data(e->out, out_sec, import_ns, strlen(import_ns) + 1)) + if (!elf_add_data(e->out, out_sec, import_ns, strlen(import_ns) + 1, tru= e)) return -1; } =20 --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 94A4C3AE704; Wed, 13 May 2026 03:34:57 +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=1778643297; cv=none; b=dZp+rnMNajCYj9+PVdgZqLwBscfA7CCp6d+YLXGig0wODGUMRugqD6MqGguqTP+VnN7P7oC3lZyv9yoXkFObk2u5qVZkRd7Umsh5Uan73I0/2obtwupmlrP5X3V3IkjJKoqSYpkOqu/dghtXKWgWMZfMeCZjsFmA2TAAuqlQVyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643297; c=relaxed/simple; bh=htHqB9fjsGibk8/Z1/tD3h7Th9hfmcAsTtcWLppiK1Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G0iTgHnmhKqzl5Og4gnRdrECIxTcKGv3gGZHcd9QsOqtudSuCHSn6lJ/etOox6f4w1CDnNqgwrMc1fIQSdgfHK8BZx5zl/cDl1QizZgFrb4fVwGmkoT36u9E2LtVqLfF2wG3aH5fbjRE8c/o9e/NFLEjcuOtJm/UaFIM4KbV2qg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QPtJ57Ss; 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="QPtJ57Ss" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0A7F6C2BCFA; Wed, 13 May 2026 03:34:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643297; bh=htHqB9fjsGibk8/Z1/tD3h7Th9hfmcAsTtcWLppiK1Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QPtJ57Ss2C5oeJm5PngBvSj5BfCbp3P4yplAqZ8VoEjLZJSGSZXibJTMM/OfA7MH3 grKttNw5o5/7mZFYsP5lonZ44tZFyZjsLC32PPnktBGsVnvgBxYWfsPTtRUWLjN26a PWQMk3M4oUc7lO90sI+G1cd6PXJNumU8xsaYABLQ25QrGIEWErfxQz7whWRctsMPGn ozD5FYtkW/EKryooEDN6mdJWXb8FFDnhTnuK0HYFoo0nRtvhtzSRUl8s40dMNqcmWe arBHvnTXsm800E9L4UvHnKyadiXmLcy7VWkac0ejFNx5P4rBDvepNVQNuFbCYjyfsh ZsAoKd6Iqfnmg== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 19/21] objtool/klp: Introduce objtool for arm64 Date: Tue, 12 May 2026 20:34:15 -0700 Message-ID: <5b66146373b1ff1aba1318fd51867dea2eb882f6.1778642121.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033415.ze1wUzHIPTZijw7YtTSnT99cRYzp_IIeR_dibFK55PA@z> Content-Type: text/plain; charset="utf-8" Add basic support for arm64 on objtool. Only "objtool klp" subcommands are currently supported. Signed-off-by: Josh Poimboeuf --- arch/arm64/Kconfig | 2 + tools/objtool/Makefile | 4 + tools/objtool/arch/arm64/Build | 2 + tools/objtool/arch/arm64/decode.c | 177 ++++++++++++++++++ .../arch/arm64/include/arch/cfi_regs.h | 11 ++ tools/objtool/arch/arm64/include/arch/elf.h | 15 ++ .../objtool/arch/arm64/include/arch/special.h | 21 +++ tools/objtool/arch/arm64/special.c | 21 +++ 8 files changed, 253 insertions(+) create mode 100644 tools/objtool/arch/arm64/Build create mode 100644 tools/objtool/arch/arm64/decode.c create mode 100644 tools/objtool/arch/arm64/include/arch/cfi_regs.h create mode 100644 tools/objtool/arch/arm64/include/arch/elf.h create mode 100644 tools/objtool/arch/arm64/include/arch/special.h create mode 100644 tools/objtool/arch/arm64/special.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index fe60738e5943b..101080fd4f99e 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -210,9 +210,11 @@ config ARM64 select HAVE_HW_BREAKPOINT if PERF_EVENTS select HAVE_IOREMAP_PROT select HAVE_IRQ_TIME_ACCOUNTING + select HAVE_KLP_BUILD select HAVE_LIVEPATCH select HAVE_MOD_ARCH_SPECIFIC select HAVE_NMI + select HAVE_OBJTOOL select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS_NMI if ARM64_PSEUDO_NMI select HAVE_PERF_REGS diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile index a4484fd22a96d..94aabeee97367 100644 --- a/tools/objtool/Makefile +++ b/tools/objtool/Makefile @@ -11,6 +11,10 @@ ifeq ($(SRCARCH),loongarch) BUILD_ORC :=3D y endif =20 +ifeq ($(SRCARCH),arm64) + ARCH_HAS_KLP :=3D y +endif + ifeq ($(ARCH_HAS_KLP),y) HAVE_XXHASH =3D $(shell printf "$(pound)include \nXXH3_state_t = *state;int main() {}" | \ $(HOSTCC) $(HOSTCFLAGS) -xc - -o /dev/null -lxxhash 2> /dev/null &= & echo y || echo n) diff --git a/tools/objtool/arch/arm64/Build b/tools/objtool/arch/arm64/Build new file mode 100644 index 0000000000000..d24d5636a5b84 --- /dev/null +++ b/tools/objtool/arch/arm64/Build @@ -0,0 +1,2 @@ +objtool-y +=3D decode.o +objtool-y +=3D special.o diff --git a/tools/objtool/arch/arm64/decode.c b/tools/objtool/arch/arm64/d= ecode.c new file mode 100644 index 0000000000000..47658c76e1af0 --- /dev/null +++ b/tools/objtool/arch/arm64/decode.c @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include + +const char *arch_reg_name[CFI_NUM_REGS] =3D {}; + +int arch_ftrace_match(const char *name) +{ + return 0; +} + +s64 arch_insn_adjusted_addend(struct instruction *insn, struct reloc *relo= c) +{ + return reloc_addend(reloc); +} + +bool arch_callee_saved_reg(unsigned char reg) +{ + return false; +} + +int arch_decode_hint_reg(u8 sp_reg, int *base) +{ + exit(-1); +} + +const char *arch_nop_insn(int len) +{ + exit(-1); +} + +const char *arch_ret_insn(int len) +{ + exit(-1); +} + +int arch_decode_instruction(struct objtool_file *file, const struct sectio= n *sec, + unsigned long offset, unsigned int maxlen, + struct instruction *insn) +{ + u32 ins; + + if (maxlen < 4) { + ERROR_INSN(insn, "can't decode instruction"); + return -1; + } + + /* arm64 instructions are always LE, thus no bswap_if_needed() */ + ins =3D le32toh(*(u32 *)(sec->data->d_buf + offset)); + + /* + * These are the bare minimum needed for static branch detection and + * checksum calculations. + */ + if (ins =3D=3D 0xd503201f) { + /* NOP: static branch */ + insn->type =3D INSN_NOP; + } else if ((ins & 0xfc000000) =3D=3D 0x14000000) { + /* B: static branch, intra-TU sibling call */ + insn->type =3D INSN_JUMP_UNCONDITIONAL; + insn->immediate =3D sign_extend64(ins & 0x03ffffff, 25); + } else if ((ins & 0xfc000000) =3D=3D 0x94000000) { + /* BL: intra-TU call */ + insn->type =3D INSN_CALL; + insn->immediate =3D sign_extend64(ins & 0x03ffffff, 25); + } else if ((ins & 0xff000000) =3D=3D 0x54000000) { + /* B.cond: intra-TU sibling call */ + insn->type =3D INSN_JUMP_CONDITIONAL; + insn->immediate =3D sign_extend64((ins >> 5) & 0x7ffff, 18); + } else if ((ins & 0x7e000000) =3D=3D 0x34000000) { + /* CBZ/CBNZ: intra-TU sibling call */ + insn->type =3D INSN_JUMP_CONDITIONAL; + insn->immediate =3D sign_extend64((ins >> 5) & 0x7ffff, 18); + } else if ((ins & 0x7e000000) =3D=3D 0x36000000) { + /* TBZ/TBNZ: intra-TU sibling call */ + insn->type =3D INSN_JUMP_CONDITIONAL; + insn->immediate =3D sign_extend64((ins >> 5) & 0x3fff, 13); + } else { + insn->type =3D INSN_OTHER; + } + + insn->len =3D 4; + return 0; +} + +size_t arch_jump_opcode_bytes(struct objtool_file *file, struct instructio= n *insn, + unsigned char *buf) +{ + u32 ins; + + ins =3D le32toh(*(u32 *)(insn->sec->data->d_buf + insn->offset)); + + switch (insn->type) { + case INSN_JUMP_UNCONDITIONAL: + case INSN_CALL: + ins &=3D ~0x03ffffff; + break; + case INSN_JUMP_CONDITIONAL: + if ((ins & 0xff000000) =3D=3D 0x54000000) + ins &=3D ~0x00ffffe0; /* B.cond */ + else if ((ins & 0x7e000000) =3D=3D 0x34000000) + ins &=3D ~0x00ffffe0; /* CBZ/CBNZ */ + else + ins &=3D ~0x0007ffe0; /* TBZ/TBNZ */ + break; + default: + break; + } + + ins =3D htole32(ins); + memcpy(buf, &ins, 4); + return 4; +} + +u64 arch_adjusted_addend(struct reloc *reloc) +{ + return reloc_addend(reloc); +} + +unsigned long arch_jump_destination(struct instruction *insn) +{ + return insn->offset + (insn->immediate << 2); +} + +bool arch_pc_relative_reloc(struct reloc *reloc) +{ + switch (reloc_type(reloc)) { + case R_AARCH64_PREL64: + case R_AARCH64_PREL32: + case R_AARCH64_PREL16: + case R_AARCH64_LD_PREL_LO19: + case R_AARCH64_ADR_PREL_LO21: + case R_AARCH64_ADR_PREL_PG_HI21: + case R_AARCH64_ADR_PREL_PG_HI21_NC: + case R_AARCH64_JUMP26: + case R_AARCH64_CALL26: + case R_AARCH64_CONDBR19: + case R_AARCH64_TSTBR14: + return true; + default: + return false; + } +} + +void arch_initial_func_cfi_state(struct cfi_init_state *state) +{ + state->cfa.base =3D CFI_UNDEFINED; +} + +unsigned int arch_reloc_size(struct reloc *reloc) +{ + switch (reloc_type(reloc)) { + case R_AARCH64_ABS64: + case R_AARCH64_PREL64: + return 8; + case R_AARCH64_PREL16: + return 2; + default: + return 4; + } +} + +#ifdef DISAS +int arch_disas_info_init(struct disassemble_info *dinfo) +{ + return disas_info_init(dinfo, bfd_arch_aarch64, + bfd_mach_arm_unknown, bfd_mach_aarch64, + NULL); +} +#endif /* DISAS */ diff --git a/tools/objtool/arch/arm64/include/arch/cfi_regs.h b/tools/objto= ol/arch/arm64/include/arch/cfi_regs.h new file mode 100644 index 0000000000000..49c81cbb6646d --- /dev/null +++ b/tools/objtool/arch/arm64/include/arch/cfi_regs.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _OBJTOOL_ARCH_CFI_REGS_H +#define _OBJTOOL_ARCH_CFI_REGS_H + +/* These aren't actually used for arm64 */ +#define CFI_BP 0 +#define CFI_SP 0 +#define CFI_RA 0 +#define CFI_NUM_REGS 2 + +#endif /* _OBJTOOL_ARCH_CFI_REGS_H */ diff --git a/tools/objtool/arch/arm64/include/arch/elf.h b/tools/objtool/ar= ch/arm64/include/arch/elf.h new file mode 100644 index 0000000000000..418b90885c501 --- /dev/null +++ b/tools/objtool/arch/arm64/include/arch/elf.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _OBJTOOL_ARCH_ELF_H +#define _OBJTOOL_ARCH_ELF_H + +#define R_NONE R_AARCH64_NONE +#define R_ABS64 R_AARCH64_ABS64 +#define R_ABS32 R_AARCH64_ABS32 +#define R_DATA32 R_AARCH64_PREL32 +#define R_DATA64 R_AARCH64_PREL64 +#define R_TEXT32 R_AARCH64_PREL32 +#define R_TEXT64 R_AARCH64_PREL64 + +#define ARCH_HAS_INLINE_ALTS 1 + +#endif /* _OBJTOOL_ARCH_ELF_H */ diff --git a/tools/objtool/arch/arm64/include/arch/special.h b/tools/objtoo= l/arch/arm64/include/arch/special.h new file mode 100644 index 0000000000000..8ae804a83ea49 --- /dev/null +++ b/tools/objtool/arch/arm64/include/arch/special.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _OBJTOOL_ARCH_SPECIAL_H +#define _OBJTOOL_ARCH_SPECIAL_H + +#define EX_ENTRY_SIZE 12 +#define EX_ORIG_OFFSET 0 +#define EX_NEW_OFFSET 4 + +#define JUMP_ENTRY_SIZE 16 +#define JUMP_ORIG_OFFSET 0 +#define JUMP_NEW_OFFSET 4 +#define JUMP_KEY_OFFSET 8 + +#define ALT_ENTRY_SIZE 12 +#define ALT_ORIG_OFFSET 0 +#define ALT_NEW_OFFSET 4 +#define ALT_FEATURE_OFFSET 8 +#define ALT_ORIG_LEN_OFFSET 10 +#define ALT_NEW_LEN_OFFSET 11 + +#endif /* _OBJTOOL_ARCH_SPECIAL_H */ diff --git a/tools/objtool/arch/arm64/special.c b/tools/objtool/arch/arm64/= special.c new file mode 100644 index 0000000000000..6ddecd362f3dd --- /dev/null +++ b/tools/objtool/arch/arm64/special.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include + +bool arch_support_alt_relocation(struct special_alt *special_alt, + struct instruction *insn, + struct reloc *reloc) +{ + return true; +} + +struct reloc *arch_find_switch_table(struct objtool_file *file, + struct instruction *insn, + unsigned long *table_size) +{ + return NULL; +} + +const char *arch_cpu_feature_name(int feature_number) +{ + return NULL; +} --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 1960E390209; Wed, 13 May 2026 03:34:58 +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=1778643298; cv=none; b=DMRnQFL0UtYYcMaZq/W9UowDmu0JSb0Dz+DbXAhVL/0P1Z+A8dRtZcLJbowy4kAShMNhYTglwIkqrtBokcpsk+MBFVnhYY5RfC5X2dIhc1p+T5GUA8HdbHSdc/8V5Qg7CndbVSGYqwIfQYqzy1IbCCKa8o7j9d1uq5MN5m8LN3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643298; c=relaxed/simple; bh=Qd0dO/5tgykNYwWLyXzlbqJjDPv/OlwKa96fpijusbY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ASC0bNGEPet5D1Q74oS3CRLTWZIzlKEmC1lU4NtpGD68DA2JYlG21fBcAOH/oEczYu4Q9pTlpzIoXaZv/VN+FSo7CR3pvYN1pcFCV/U29GxsvDfX9vTyHYw8Kc/AqTAjwjolWsGxUmak5YikHa6VGpZUaB9N7tUoo5blmb0v9a4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ezRwnLFh; 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="ezRwnLFh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 91BBDC2BCC7; Wed, 13 May 2026 03:34:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643298; bh=Qd0dO/5tgykNYwWLyXzlbqJjDPv/OlwKa96fpijusbY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ezRwnLFhhW/r1qzWrMNMdxEu2H/DqfXiJ2o4GqbWf+0lMYBwxuOqxduhE5ZEUvVoV cJxTTo+ZYLnCujf7pblg6hk4GFibLqRnpO87CQm8asIkk8EAc6HQhDpewVA9Q8F2Db SM/Exd57jrsCYYHoYwtyvp2Snn8PqfrdMGh9jj+DneVXyHg8hwONsjcZe4ooN+2xRZ y7qeOwVxCOyLeyuyeaRIGiDz9NkSVMQPlrN7HrKnMsQdEauN4So5GSCviuU68oblCn d7t9lqGJlGLg1Km+1zpF0utVYxKUZK4nYJHfx9ZSFOdLO/jVE1lcs7wwFQbGEUpzOb M5KYm1BhNvC5A== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 20/21] klp-build: Support cross-compilation Date: Tue, 12 May 2026 20:34:16 -0700 Message-ID: <8e19a330a899520434cc83f7ccc434c83101ac3c.1778642121.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033416.tSvLgHwdPEP2FbPQu2HvVgZHLNSP8rx0GwGxB_6AzPo@z> Content-Type: text/plain; charset="utf-8" Add support for cross-compilation. The user must export ARCH, and either CROSS_COMPILE or LLVM as needed. Signed-off-by: Josh Poimboeuf --- scripts/livepatch/klp-build | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/scripts/livepatch/klp-build b/scripts/livepatch/klp-build index 911ada05673c2..e83973567c878 100755 --- a/scripts/livepatch/klp-build +++ b/scripts/livepatch/klp-build @@ -432,6 +432,25 @@ validate_patches() { revert_patches } =20 +cross_compile_init() { + if [[ -v LLVM && -n "$LLVM" ]]; then + local prefix=3D"" + local suffix=3D"" + + if [[ "$LLVM" =3D=3D */ ]]; then + # LLVM=3D/path/to/bin/ + prefix=3D"$LLVM" + elif [[ "$LLVM" =3D=3D -* ]]; then + # LLVM=3D-14 + suffix=3D"$LLVM" + fi + + OBJCOPY=3D"${prefix}llvm-objcopy${suffix}" + else + OBJCOPY=3D"${CROSS_COMPILE:-}objcopy" + fi +} + do_init() { # We're not yet smart enough to handle anything other than in-tree # builds in pwd. @@ -462,6 +481,7 @@ do_init() { validate_config set_module_name set_kernelversion + cross_compile_init } =20 # Refresh the patch hunk headers, specifically the line numbers and counts. @@ -871,7 +891,7 @@ build_patch_module() { cp -f "$kmod_file" "$kmod_file.orig" =20 # Work around issue where slight .config change makes corrupt BTF - objcopy --remove-section=3D.BTF "$kmod_file" + "$OBJCOPY" --remove-section=3D.BTF "$kmod_file" =20 # Fix (and work around) linker wreckage for klp syms / relocs "$OBJTOOL" klp post-link "$kmod_file" || die "objtool klp post-link faile= d" --=20 2.53.0 From nobody Wed Jun 10 09:21:54 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 A1F1F3B3BE5; Wed, 13 May 2026 03:34:58 +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=1778643298; cv=none; b=jmE+ee/pyiH2QlL3OGjG8iQ2DKfkqHFGaQVBf6sbkjrtnoYvW3r8sioUbn0GqrIx5I7BXGTvH7HF9yBPAAk1ZkJPYhUKkGuE68zJ2bc6R274oja+cd+hc/uO6MeNBCzoqQT6SyGYxHC1Sf5PllpRR0bg/TMgTJ+cLaQk0iV5ARg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778643298; c=relaxed/simple; bh=YLQATZuaSnhkkzf9eNAaMViHdYeqnWtOoiB9QIjH1E8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nh/XeTSLHVqON3rwkzGS7oB6ED+r/Y0j0kkQjs4RO5PelbIrM2/WsiNr+omRGf7KNkl+f5kiZ/eKXqHV9+wk+2DMwvfLSXBk32uYupGccyw0nTk/9XpEGrosZIa6STIS3JjSGNFK44EI13MnP5wgd8l6vki/Hs4QzacG9SJoikA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=srR52N72; 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="srR52N72" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24E43C2BCC9; Wed, 13 May 2026 03:34:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778643298; bh=YLQATZuaSnhkkzf9eNAaMViHdYeqnWtOoiB9QIjH1E8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=srR52N72ajUS/qt0gfNhYQ2ypWHNM39KZV/y9QyU/Tbh9AewWSuInrKg1fY0AqSkq bGFDCFvmtRYPpmTGDhZ79tmiUbXa1gAPhewu7765XOpGqRWIGtpUnz+AZZTeZxkQ// aKVf1U6Iq02t1j3k4JpsHZvx0MZ+OAa6pnWil+kljhiX7RrhVJkT1DTAhaGzXhtngs RhRvPcmm48852UA7rhOaOqZec1cX10IReoOqfMrliWxX0Jyzj1yqFPqqv62qxyToTB DZH5OeCYUqYw79i2SpwLkdrqf/tZRN7aQEEmQpwdmkmTpyE4sKR3OHymVHXVoFvC2i xYgYZw1nGVRtQ== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Peter Zijlstra , Joe Lawrence , Song Liu , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Mark Rutland , Miroslav Benes , Petr Mladek Subject: [PATCH v3 21/21] klp-build: Add arm64 syscall patching macro Date: Tue, 12 May 2026 20:34:17 -0700 Message-ID: <3bf3cee43039fc4da84e83d0891a92e25f40f00f.1778642121.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 Message-ID: <20260513033417.IxkYK2RnAFRcGLwF3WQr5BbYi187ceo6CuzsFzcyjWI@z> Content-Type: text/plain; charset="utf-8" Add arm64 support for KLP_SYSCALL_DEFINEx(), mirroring the arm64 __SYSCALL_DEFINEx() pattern from arch/arm64/include/asm/syscall_wrapper.h. Signed-off-by: Josh Poimboeuf --- include/linux/livepatch_helpers.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/include/linux/livepatch_helpers.h b/include/linux/livepatch_he= lpers.h index 99d68d0773fa8..4b647b83865f9 100644 --- a/include/linux/livepatch_helpers.h +++ b/include/linux/livepatch_helpers.h @@ -72,6 +72,25 @@ } \ static inline long __klp_do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) =20 +#elif defined(CONFIG_ARM64) + +#define __KLP_SYSCALL_DEFINEx(x, name, ...) \ + static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ + static inline long __klp_do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ + asmlinkage long __arm64_sys##name(const struct pt_regs *regs); \ + asmlinkage long __arm64_sys##name(const struct pt_regs *regs) \ + { \ + return __se_sys##name(SC_ARM64_REGS_TO_ARGS(x,__VA_ARGS__));\ + } \ + static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ + { \ + long ret =3D __klp_do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__));\ + __MAP(x,__SC_TEST,__VA_ARGS__); \ + __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__)); \ + return ret; \ + } \ + static inline long __klp_do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) + #endif =20 #endif /* _LINUX_LIVEPATCH_HELPERS_H */ --=20 2.53.0