From: Marc Zyngier <maz@kernel.org>
To: Ada Couprie Diaz <ada.coupriediaz@arm.com>
Cc: linux-arm-kernel@lists.infradead.org,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Oliver Upton <oliver.upton@linux.dev>,
Ard Biesheuvel <ardb@kernel.org>, Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Andrey Ryabinin <ryabinin.a.a@gmail.com>,
Alexander Potapenko <glider@google.com>,
Andrey Konovalov <andreyknvl@gmail.com>,
Dmitry Vyukov <dvyukov@google.com>,
Vincenzo Frascino <vincenzo.frascino@arm.com>,
linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev,
kasan-dev@googlegroups.com, Mark Rutland <mark.rutland@arm.com>
Subject: Re: [RFC PATCH 14/16] arm64/insn: always inline aarch64_insn_encode_ldst_size()
Date: Mon, 20 Oct 2025 18:12:53 +0100 [thread overview]
Message-ID: <86h5vtwl7u.wl-maz@kernel.org> (raw)
In-Reply-To: <20250923174903.76283-15-ada.coupriediaz@arm.com>
On Tue, 23 Sep 2025 18:49:01 +0100,
Ada Couprie Diaz <ada.coupriediaz@arm.com> wrote:
>
> The type and instruction checks cannot be made at compile time,
> as they are dynamically created. However, we can remove the error print
> as it should never appear in normal operation and will still lead to
> a fault BRK.
>
> This makes `aarch64_insn_encode_ldst_size()` safe for inlining
> and usage from patching callbacks.
>
> This is a change of visiblity, as previously the function was private to
> lib/insn.c.
> However, in order to inline more `aarch64_insn_` functions and make
> patching callbacks safe, it needs to be accessible by those functions.
> As it is more accessible than before, add a check so that only loads
> or stores can be affected by the size encoding.
>
> Signed-off-by: Ada Couprie Diaz <ada.coupriediaz@arm.com>
> ---
> arch/arm64/include/asm/insn.h | 24 ++++++++++++++++++++++++
> arch/arm64/lib/insn.c | 19 +------------------
> 2 files changed, 25 insertions(+), 18 deletions(-)
>
> diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h
> index 44435eede1f3..46d4d452e2e2 100644
> --- a/arch/arm64/include/asm/insn.h
> +++ b/arch/arm64/include/asm/insn.h
> @@ -717,6 +717,30 @@ static __always_inline u32 aarch64_insn_encode_immediate(
>
> return insn;
> }
> +
> +extern const u32 aarch64_insn_ldst_size[];
> +static __always_inline u32 aarch64_insn_encode_ldst_size(
> + enum aarch64_insn_size_type type,
> + u32 insn)
> +{
> + u32 size;
> +
> + if (type < AARCH64_INSN_SIZE_8 || type > AARCH64_INSN_SIZE_64) {
> + return AARCH64_BREAK_FAULT;
> + }
> +
> + /* Don't corrput the top bits of other instructions which aren't a size. */
> + if (!aarch64_insn_is_ldst(insn)) {
> + return AARCH64_BREAK_FAULT;
> + }
> +
> + size = aarch64_insn_ldst_size[type];
Given that we have this:
enum aarch64_insn_size_type {
AARCH64_INSN_SIZE_8,
AARCH64_INSN_SIZE_16,
AARCH64_INSN_SIZE_32,
AARCH64_INSN_SIZE_64,
};
[...]
> + insn &= ~GENMASK(31, 30);
> + insn |= size << 30;
> +
> + return insn;
> +}
> +
> static __always_inline u32 aarch64_insn_encode_register(
> enum aarch64_insn_register_type type,
> u32 insn,
> diff --git a/arch/arm64/lib/insn.c b/arch/arm64/lib/insn.c
> index 71df4d72ac81..63564d236235 100644
> --- a/arch/arm64/lib/insn.c
> +++ b/arch/arm64/lib/insn.c
> @@ -42,30 +42,13 @@ u64 aarch64_insn_decode_immediate(enum aarch64_insn_imm_type type, u32 insn)
> return (insn >> shift) & mask;
> }
>
> -static const u32 aarch64_insn_ldst_size[] = {
> +const u32 aarch64_insn_ldst_size[] = {
> [AARCH64_INSN_SIZE_8] = 0,
> [AARCH64_INSN_SIZE_16] = 1,
> [AARCH64_INSN_SIZE_32] = 2,
> [AARCH64_INSN_SIZE_64] = 3,
> };
[...] this array is completely superfluous, and
size = aarch64_insn_ldst_size[type];
could be replaced by
size = type;
But that's only a very minor improvement. On the plus side, your
approach definitely makes it impossible to add a patching callback
using aarch64_insn_encode_ldst_size() in a module!
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2025-10-20 17:12 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-23 17:48 [RFC PATCH 00/16] arm64: make alternative patching callbacks safe Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 01/16] kasan: mark kasan_(hw_)tags_enabled() __always_inline Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 02/16] arm64: kasan: make kasan_hw_tags_enable() callback safe Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 03/16] arm64/insn: always inline aarch64_insn_decode_register() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-10-20 16:39 ` Marc Zyngier
2025-09-23 17:48 ` [RFC PATCH 04/16] arm64/insn: always inline aarch64_insn_encode_register() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 05/16] arm64/insn: always inline aarch64_insn_encode_immediate() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 06/16] arm64/insn: always inline aarch64_insn_gen_movewide() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-10-20 16:48 ` Marc Zyngier
2025-09-23 17:48 ` [RFC PATCH 07/16] arm64/proton-pack: make alternative callbacks safe Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 08/16] arm64/insn: always inline aarch64_insn_gen_logical_immediate() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 09/16] arm64/insn: always inline aarch64_insn_gen_add_sub_imm() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 10/16] arm64/insn: always inline aarch64_insn_gen_branch_reg() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 11/16] arm64/insn: always inline aarch64_insn_gen_extr() Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-09-23 17:48 ` [RFC PATCH 12/16] kvm/arm64: make alternative callbacks safe Ada Couprie Diaz
2025-09-23 17:48 ` Ada Couprie Diaz
2025-10-20 17:05 ` Marc Zyngier
2025-09-23 17:49 ` [RFC PATCH 13/16] arm64/insn: introduce missing is_store/is_load helpers Ada Couprie Diaz
2025-09-23 17:49 ` Ada Couprie Diaz
2025-09-23 17:49 ` [RFC PATCH 14/16] arm64/insn: always inline aarch64_insn_encode_ldst_size() Ada Couprie Diaz
2025-09-23 17:49 ` Ada Couprie Diaz
2025-10-20 17:12 ` Marc Zyngier [this message]
2025-09-23 17:49 ` [RFC PATCH 15/16] arm64/insn: always inline aarch64_insn_gen_load_acq_store_rel() Ada Couprie Diaz
2025-09-23 17:49 ` Ada Couprie Diaz
2025-09-23 17:49 ` [RFC PATCH 16/16] arm64/io: rework Cortex-A57 erratum 832075 to use callback Ada Couprie Diaz
2025-09-23 17:49 ` Ada Couprie Diaz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86h5vtwl7u.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=ada.coupriediaz@arm.com \
--cc=andreyknvl@gmail.com \
--cc=ardb@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=dvyukov@google.com \
--cc=glider@google.com \
--cc=joey.gouly@arm.com \
--cc=kasan-dev@googlegroups.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=oliver.upton@linux.dev \
--cc=ryabinin.a.a@gmail.com \
--cc=suzuki.poulose@arm.com \
--cc=vincenzo.frascino@arm.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.