From nobody Fri Apr 17 10:35: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 386922629D for ; Sat, 21 Feb 2026 14:37:00 +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=1771684621; cv=none; b=OnzExURgWygqVIi/Do3qcjfYFn5G1LIZFitASXrA/oNtWut3tJsDWF6ZpiLI759zCozR5+Sey6J9Z+3lvnRYVIJ6aD1aRBGJOZSUR/x+OExWuf6QlM6wvzA2nHMTEEu8zvloyopphC27hJtge3YgABJw92nmsO1+3fLwXqHALO8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771684621; c=relaxed/simple; bh=sRapExpB2i3CFisLm3IxOn3vqYVl2ysR1xFZfZZHINc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=PnlV4R75K5x5FBPZF+hzncCnstLodNJIduzzAVKxWaJ74zqtnVxm9YkrI0DOQkG4hbrVj/18hhj4vxGoenAxtYH06epTtBbfGbAsI9SQUpBxOxsShR+7DyUFhhCfabbvOzZsCG6v3Jjk+pJEOcee/d2Zbcb1CyYU85tgTYjxbWM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=e33k54bl; 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="e33k54bl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0332C4CEF7; Sat, 21 Feb 2026 14:36:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771684620; bh=sRapExpB2i3CFisLm3IxOn3vqYVl2ysR1xFZfZZHINc=; h=From:To:Cc:Subject:Date:From; b=e33k54blChfrldzIYzZ+zCCNRWnjEbBwe11/1IjDP+YLR3gwMXsUvo07AAWpFrq0J dUWUrBhu3/5pcarU0uyLMZeRA6l5Vj3l08s4eiYzUA76TDdrAmWHFMBhxq5e5ziBR2 JWi++Ytnj3OgzNVW+StY63VMRA9jOdbTBqLE6gSml+cFvaVH+es9HueI+tPXMh0TYJ YxYXJyMQZKic02Qiv6mXUdoNS5wjvwK/hivDesC+uQr8vWrqAflHKETgbeyuzcpS9/ TJiHDUhBwackQHhxRrwzZLw+5Xy/mZkn/FO6954DTNzSDKZ1VFHdEK+DwZDaPvNJPO MwvyYs+gTGSnw== From: Jisheng Zhang To: Russell King Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] arm: Add runtime constant support for armv7 and !THUMB2_KERNEL Date: Sat, 21 Feb 2026 22:18:31 +0800 Message-ID: <20260221141831.16136-1-jszhang@kernel.org> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement the runtime constant infrastructure for armv7 && !THUMB2_KERNEL. So that armv7 can use this infrastructure to generate constants to be used by the d_hash(), dentry_cache(), names_cache() and so on. This is the armv7 variant of commit 94a2bc0f611c ("arm64: add 'runtime constant' support") and commit e3c92e81711d ("runtime constants: add x86 architecture support"). As for < armv7 or THUMB2_KERNEL, we fall back to the generic runtime-constant.h, no functionality changes. Signed-off-by: Jisheng Zhang --- arch/arm/include/asm/runtime-const.h | 102 +++++++++++++++++++++++++++ arch/arm/kernel/vmlinux.lds.S | 2 + 2 files changed, 104 insertions(+) create mode 100644 arch/arm/include/asm/runtime-const.h diff --git a/arch/arm/include/asm/runtime-const.h b/arch/arm/include/asm/ru= ntime-const.h new file mode 100644 index 000000000000..c1a14f71dd5e --- /dev/null +++ b/arch/arm/include/asm/runtime-const.h @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_ARM_RUNTIME_CONST_H +#define _ASM_ARM_RUNTIME_CONST_H + +#ifdef MODULE + #error "Cannot use runtime-const infrastructure from modules" +#endif + +#if __LINUX_ARM_ARCH__ >=3D 7 && !defined(CONFIG_THUMB2_KERNEL) +#include + +/* Sigh. You can still run arm in BE mode */ +#include + +#define runtime_const_ptr(sym) ({ \ + typeof(sym) __ret; \ + asm_inline("1:\n" \ + "movw %0, #0x4567\n" \ + "movt %0, #0x0123\n" \ + ".pushsection runtime_ptr_" #sym ",\"a\"\n\t" \ + ".long 1b - .\n" \ + ".popsection" \ + : "=3Dr" (__ret)); \ + __ret; }) + +#define runtime_const_shift_right_32(val, sym) ({ \ + unsigned long __ret; \ + asm_inline("1:\n" \ + "lsr %0,%1,#12\n" \ + ".pushsection runtime_shift_" #sym ",\"a\"\n\t" \ + ".long 1b - .\n" \ + ".popsection" \ + : "=3Dr" (__ret) \ + : "r" (0u+(val))); \ + __ret; }) + +#define runtime_const_init(type, sym) do { \ + extern s32 __start_runtime_##type##_##sym[]; \ + extern s32 __stop_runtime_##type##_##sym[]; \ + \ + runtime_const_fixup(__runtime_fixup_##type, \ + (unsigned long)(sym), \ + __start_runtime_##type##_##sym, \ + __stop_runtime_##type##_##sym); \ +} while (0) + +/* + * 16-bit immediate for wide move (movw and movt) is encoded in + * bits 19:16, 11:0 + */ +static inline void __runtime_fixup_16(__le32 *p, unsigned int val) +{ + u32 insn =3D le32_to_cpu(*p); + + insn &=3D 0xfff0f000; + insn |=3D val & 0xfff; + insn |=3D ((val & 0xf000) >> 12) << 16; + *p =3D cpu_to_le32(insn); +} + +static inline void __runtime_fixup_caches(void *where, unsigned int insns) +{ + unsigned long va =3D (unsigned long)where; + + flush_icache_range(va, va + 4 * insns); +} + +static inline void __runtime_fixup_ptr(void *where, unsigned long val) +{ + __le32 *p =3D where; + + __runtime_fixup_16(p, val); + __runtime_fixup_16(p + 1, val >> 16); + __runtime_fixup_caches(where, 2); +} + +/* Immediate value is 5 bits starting at bit #7 */ +static inline void __runtime_fixup_shift(void *where, unsigned long val) +{ + __le32 *p =3D where; + u32 insn =3D le32_to_cpu(*p); + + insn &=3D 0xfffff07f; + insn |=3D (val & 0x1f) << 7; + *p =3D cpu_to_le32(insn); + __runtime_fixup_caches(where, 1); +} + +static inline void runtime_const_fixup(void (*fn)(void *, unsigned long), + unsigned long val, s32 *start, s32 *end) +{ + while (start < end) { + fn(*start + (void *)start, val); + start++; + } +} + +#else +#include +#endif /* __LINUX_ARM_ARCH__ >=3D 7 && !defined(CONFIG_THUMB2_KERNEL) */ + +#endif /* _ASM_ARM_RUNTIME_CONST_H */ diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index d592a203f9c6..5d90cd16e538 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -126,6 +126,8 @@ SECTIONS ARM_EXIT_KEEP(EXIT_DATA) } =20 + RUNTIME_CONST_VARIABLES + #ifdef CONFIG_SMP PERCPU_SECTION(L1_CACHE_BYTES) #endif --=20 2.51.0