From: Conor Dooley <conor@kernel.org>
To: kvm-riscv@lists.infradead.org
Subject: [PATCH v4 5/8] RISC-V: cpufeature: Put vendor_id to work
Date: Thu, 09 Feb 2023 19:05:10 -0000 [thread overview]
Message-ID: <Y+VD2/owMIvqzOx8@spud> (raw)
In-Reply-To: <20230209152628.129914-6-ajones@ventanamicro.com>
Hey Drew,
On Thu, Feb 09, 2023 at 04:26:25PM +0100, Andrew Jones wrote:
> When [ab]using alternatives as cpufeature "static keys", which can
> be used in assembly, also put vendor_id to work as application-
> specific data. This will be initially used in Zicboz's application to
> clear_page(), as Zicboz's block size must also be considered. In that
> case, vendor_id's role will be to convey the maximum block size which
> the Zicboz clear_page() implementation supports.
>
> cpufeature alternative applications which need to check for the
> existence or absence of other cpufeatures may also be able to make
> use of this.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> ---
> arch/riscv/kernel/cpufeature.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> index 0d2db03cf167..74736b4f0624 100644
> --- a/arch/riscv/kernel/cpufeature.c
> +++ b/arch/riscv/kernel/cpufeature.c
> @@ -278,6 +278,11 @@ void __init riscv_fill_hwcap(void)
> }
>
> #ifdef CONFIG_RISCV_ALTERNATIVE
I think a comment here about what "application check" means would be
nice.
That wording just feels clunky & the meaning is not immediately
graspable?
/*
* riscv_cpufeature_application_check() - Check if a cpufeature applies.
* The presence of a cpufeature does not mean it is necessarily
* useable. This function is used to apply the alternative on a
* case-by-case basis.
*/
Dunno, does something like that convey the intent?
> +static bool riscv_cpufeature_application_check(u32 feature, u16 data)
> +{
> + return data == 0;
> +}
> +
> void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> struct alt_entry *end,
> unsigned int stage)
> @@ -289,8 +294,6 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> return;
>
> for (alt = begin; alt < end; alt++) {
> - if (alt->vendor_id != 0)
> - continue;
Can you remind me what makes this "safe"?
My understanding was that a vendor_id of zero was safe, as zero is
reserved in JEDEC.
What is stopping someone stuffing this with a given value and
colliding with a real vendor's errata?
for (alt = begin; alt < end; alt++) {
if (alt->vendor_id != A_VENDOR_ID)
continue;
if (alt->errata_id >= ERRATA_A_NUMBER)
continue;
tmp = (1U << alt->errata_id);
if (cpu_req_errata & tmp) {
oldptr = ALT_OLD_PTR(alt);
altptr = ALT_ALT_PTR(alt);
/* On vm-alternatives, the mmu isn't running yet */
if (stage == RISCV_ALTERNATIVES_EARLY_BOOT)
memcpy((void *)__pa_symbol(oldptr),
(void *)__pa_symbol(altptr),
alt->alt_len);
else
patch_text_nosync(oldptr, altptr, alt->alt_len);
}
}
I've probably just missing something, my brain swapped out alternatives
the other week. Hopefully whatever I missed isn't embarrassingly obvious!
Cheers,
Conor.
> if (alt->errata_id >= RISCV_ISA_EXT_MAX) {
> WARN(1, "This extension id:%d is not in ISA extension list",
> alt->errata_id);
> @@ -300,6 +303,9 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> if (!__riscv_isa_extension_available(NULL, alt->errata_id))
> continue;
>
> + if (!riscv_cpufeature_application_check(alt->errata_id, alt->vendor_id))
> + continue;
> +
> oldptr = ALT_OLD_PTR(alt);
> altptr = ALT_ALT_PTR(alt);
> patch_text_nosync(oldptr, altptr, alt->alt_len);
> --
> 2.39.1
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/kvm-riscv/attachments/20230209/affc4079/attachment-0001.sig>
WARNING: multiple messages have this Message-ID (diff)
From: Conor Dooley <conor@kernel.org>
To: Andrew Jones <ajones@ventanamicro.com>
Cc: linux-riscv@lists.infradead.org, kvm-riscv@lists.infradead.org,
devicetree@vger.kernel.org,
'Anup Patel ' <apatel@ventanamicro.com>,
'Palmer Dabbelt ' <palmer@dabbelt.com>,
'Paul Walmsley ' <paul.walmsley@sifive.com>,
'Krzysztof Kozlowski ' <krzysztof.kozlowski+dt@linaro.org>,
'Atish Patra ' <atishp@rivosinc.com>,
'Heiko Stuebner ' <heiko@sntech.de>,
'Jisheng Zhang ' <jszhang@kernel.org>,
'Rob Herring ' <robh@kernel.org>,
'Albert Ou ' <aou@eecs.berkeley.edu>,
'Conor Dooley ' <conor.dooley@microchip.com>
Subject: Re: [PATCH v4 5/8] RISC-V: cpufeature: Put vendor_id to work
Date: Thu, 9 Feb 2023 19:04:59 +0000 [thread overview]
Message-ID: <Y+VD2/owMIvqzOx8@spud> (raw)
In-Reply-To: <20230209152628.129914-6-ajones@ventanamicro.com>
[-- Attachment #1.1: Type: text/plain, Size: 3587 bytes --]
Hey Drew,
On Thu, Feb 09, 2023 at 04:26:25PM +0100, Andrew Jones wrote:
> When [ab]using alternatives as cpufeature "static keys", which can
> be used in assembly, also put vendor_id to work as application-
> specific data. This will be initially used in Zicboz's application to
> clear_page(), as Zicboz's block size must also be considered. In that
> case, vendor_id's role will be to convey the maximum block size which
> the Zicboz clear_page() implementation supports.
>
> cpufeature alternative applications which need to check for the
> existence or absence of other cpufeatures may also be able to make
> use of this.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> ---
> arch/riscv/kernel/cpufeature.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> index 0d2db03cf167..74736b4f0624 100644
> --- a/arch/riscv/kernel/cpufeature.c
> +++ b/arch/riscv/kernel/cpufeature.c
> @@ -278,6 +278,11 @@ void __init riscv_fill_hwcap(void)
> }
>
> #ifdef CONFIG_RISCV_ALTERNATIVE
I think a comment here about what "application check" means would be
nice.
That wording just feels clunky & the meaning is not immediately
graspable?
/*
* riscv_cpufeature_application_check() - Check if a cpufeature applies.
* The presence of a cpufeature does not mean it is necessarily
* useable. This function is used to apply the alternative on a
* case-by-case basis.
*/
Dunno, does something like that convey the intent?
> +static bool riscv_cpufeature_application_check(u32 feature, u16 data)
> +{
> + return data == 0;
> +}
> +
> void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> struct alt_entry *end,
> unsigned int stage)
> @@ -289,8 +294,6 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> return;
>
> for (alt = begin; alt < end; alt++) {
> - if (alt->vendor_id != 0)
> - continue;
Can you remind me what makes this "safe"?
My understanding was that a vendor_id of zero was safe, as zero is
reserved in JEDEC.
What is stopping someone stuffing this with a given value and
colliding with a real vendor's errata?
for (alt = begin; alt < end; alt++) {
if (alt->vendor_id != A_VENDOR_ID)
continue;
if (alt->errata_id >= ERRATA_A_NUMBER)
continue;
tmp = (1U << alt->errata_id);
if (cpu_req_errata & tmp) {
oldptr = ALT_OLD_PTR(alt);
altptr = ALT_ALT_PTR(alt);
/* On vm-alternatives, the mmu isn't running yet */
if (stage == RISCV_ALTERNATIVES_EARLY_BOOT)
memcpy((void *)__pa_symbol(oldptr),
(void *)__pa_symbol(altptr),
alt->alt_len);
else
patch_text_nosync(oldptr, altptr, alt->alt_len);
}
}
I've probably just missing something, my brain swapped out alternatives
the other week. Hopefully whatever I missed isn't embarrassingly obvious!
Cheers,
Conor.
> if (alt->errata_id >= RISCV_ISA_EXT_MAX) {
> WARN(1, "This extension id:%d is not in ISA extension list",
> alt->errata_id);
> @@ -300,6 +303,9 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> if (!__riscv_isa_extension_available(NULL, alt->errata_id))
> continue;
>
> + if (!riscv_cpufeature_application_check(alt->errata_id, alt->vendor_id))
> + continue;
> +
> oldptr = ALT_OLD_PTR(alt);
> altptr = ALT_ALT_PTR(alt);
> patch_text_nosync(oldptr, altptr, alt->alt_len);
> --
> 2.39.1
>
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
[-- Attachment #2: Type: text/plain, Size: 161 bytes --]
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Conor Dooley <conor@kernel.org>
To: Andrew Jones <ajones@ventanamicro.com>
Cc: linux-riscv@lists.infradead.org, kvm-riscv@lists.infradead.org,
devicetree@vger.kernel.org,
'Anup Patel ' <apatel@ventanamicro.com>,
'Palmer Dabbelt ' <palmer@dabbelt.com>,
'Paul Walmsley ' <paul.walmsley@sifive.com>,
'Krzysztof Kozlowski ' <krzysztof.kozlowski+dt@linaro.org>,
'Atish Patra ' <atishp@rivosinc.com>,
'Heiko Stuebner ' <heiko@sntech.de>,
'Jisheng Zhang ' <jszhang@kernel.org>,
'Rob Herring ' <robh@kernel.org>,
'Albert Ou ' <aou@eecs.berkeley.edu>,
'Conor Dooley ' <conor.dooley@microchip.com>
Subject: Re: [PATCH v4 5/8] RISC-V: cpufeature: Put vendor_id to work
Date: Thu, 9 Feb 2023 19:04:59 +0000 [thread overview]
Message-ID: <Y+VD2/owMIvqzOx8@spud> (raw)
In-Reply-To: <20230209152628.129914-6-ajones@ventanamicro.com>
[-- Attachment #1: Type: text/plain, Size: 3587 bytes --]
Hey Drew,
On Thu, Feb 09, 2023 at 04:26:25PM +0100, Andrew Jones wrote:
> When [ab]using alternatives as cpufeature "static keys", which can
> be used in assembly, also put vendor_id to work as application-
> specific data. This will be initially used in Zicboz's application to
> clear_page(), as Zicboz's block size must also be considered. In that
> case, vendor_id's role will be to convey the maximum block size which
> the Zicboz clear_page() implementation supports.
>
> cpufeature alternative applications which need to check for the
> existence or absence of other cpufeatures may also be able to make
> use of this.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> ---
> arch/riscv/kernel/cpufeature.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> index 0d2db03cf167..74736b4f0624 100644
> --- a/arch/riscv/kernel/cpufeature.c
> +++ b/arch/riscv/kernel/cpufeature.c
> @@ -278,6 +278,11 @@ void __init riscv_fill_hwcap(void)
> }
>
> #ifdef CONFIG_RISCV_ALTERNATIVE
I think a comment here about what "application check" means would be
nice.
That wording just feels clunky & the meaning is not immediately
graspable?
/*
* riscv_cpufeature_application_check() - Check if a cpufeature applies.
* The presence of a cpufeature does not mean it is necessarily
* useable. This function is used to apply the alternative on a
* case-by-case basis.
*/
Dunno, does something like that convey the intent?
> +static bool riscv_cpufeature_application_check(u32 feature, u16 data)
> +{
> + return data == 0;
> +}
> +
> void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> struct alt_entry *end,
> unsigned int stage)
> @@ -289,8 +294,6 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> return;
>
> for (alt = begin; alt < end; alt++) {
> - if (alt->vendor_id != 0)
> - continue;
Can you remind me what makes this "safe"?
My understanding was that a vendor_id of zero was safe, as zero is
reserved in JEDEC.
What is stopping someone stuffing this with a given value and
colliding with a real vendor's errata?
for (alt = begin; alt < end; alt++) {
if (alt->vendor_id != A_VENDOR_ID)
continue;
if (alt->errata_id >= ERRATA_A_NUMBER)
continue;
tmp = (1U << alt->errata_id);
if (cpu_req_errata & tmp) {
oldptr = ALT_OLD_PTR(alt);
altptr = ALT_ALT_PTR(alt);
/* On vm-alternatives, the mmu isn't running yet */
if (stage == RISCV_ALTERNATIVES_EARLY_BOOT)
memcpy((void *)__pa_symbol(oldptr),
(void *)__pa_symbol(altptr),
alt->alt_len);
else
patch_text_nosync(oldptr, altptr, alt->alt_len);
}
}
I've probably just missing something, my brain swapped out alternatives
the other week. Hopefully whatever I missed isn't embarrassingly obvious!
Cheers,
Conor.
> if (alt->errata_id >= RISCV_ISA_EXT_MAX) {
> WARN(1, "This extension id:%d is not in ISA extension list",
> alt->errata_id);
> @@ -300,6 +303,9 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin,
> if (!__riscv_isa_extension_available(NULL, alt->errata_id))
> continue;
>
> + if (!riscv_cpufeature_application_check(alt->errata_id, alt->vendor_id))
> + continue;
> +
> oldptr = ALT_OLD_PTR(alt);
> altptr = ALT_ALT_PTR(alt);
> patch_text_nosync(oldptr, altptr, alt->alt_len);
> --
> 2.39.1
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
next prev parent reply other threads:[~2023-02-09 19:05 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-09 15:26 [PATCH v4 0/8] RISC-V: Apply Zicboz to clear_page Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` [PATCH v4 1/8] RISC-V: alternatives: Support patching multiple insns in assembly Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 18:02 ` Conor Dooley
2023-02-09 18:03 ` Conor Dooley
2023-02-09 18:02 ` Conor Dooley
2023-02-09 15:26 ` [PATCH v4 2/8] RISC-V: Factor out body of riscv_init_cbom_blocksize loop Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` [PATCH v4 3/8] dt-bindings: riscv: Document cboz-block-size Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` [PATCH v4 4/8] RISC-V: Add Zicboz detection and block size parsing Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` [PATCH v4 5/8] RISC-V: cpufeature: Put vendor_id to work Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 19:04 ` Conor Dooley [this message]
2023-02-09 19:05 ` Conor Dooley
2023-02-09 19:04 ` Conor Dooley
2023-02-10 7:58 ` Andrew Jones
2023-02-10 7:58 ` Andrew Jones
2023-02-10 7:58 ` Andrew Jones
2023-02-10 20:29 ` Conor Dooley
2023-02-10 20:29 ` Conor Dooley
2023-02-10 20:29 ` Conor Dooley
2023-02-12 16:26 ` Andrew Jones
2023-02-12 16:26 ` Andrew Jones
2023-02-12 16:26 ` Andrew Jones
2023-02-09 15:26 ` [PATCH v4 6/8] RISC-V: Use Zicboz in clear_page when available Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 19:09 ` Conor Dooley
2023-02-09 19:10 ` Conor Dooley
2023-02-09 19:09 ` Conor Dooley
2023-02-10 8:05 ` Andrew Jones
2023-02-10 8:05 ` Andrew Jones
2023-02-10 8:05 ` Andrew Jones
2023-02-10 9:04 ` Conor Dooley
2023-02-10 9:05 ` Conor Dooley
2023-02-10 9:04 ` Conor Dooley
2023-02-17 10:18 ` Ben Dooks
2023-02-17 10:18 ` Ben Dooks
2023-02-17 10:18 ` Ben Dooks
2023-02-17 10:50 ` Ben Dooks
2023-02-17 10:50 ` Ben Dooks
2023-02-17 10:50 ` Ben Dooks
2023-02-17 12:29 ` Andrew Jones
2023-02-17 12:29 ` Andrew Jones
2023-02-17 12:29 ` Andrew Jones
2023-02-20 18:43 ` Ben Dooks
2023-02-20 18:43 ` Ben Dooks
2023-02-20 18:43 ` Ben Dooks
2023-02-20 19:24 ` Andrew Jones
2023-02-20 19:24 ` Andrew Jones
2023-02-20 19:24 ` Andrew Jones
2023-02-17 12:44 ` Andrew Jones
2023-02-17 12:44 ` Andrew Jones
2023-02-17 12:44 ` Andrew Jones
2023-02-09 15:26 ` [PATCH v4 7/8] RISC-V: KVM: Provide UAPI for Zicboz block size Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` [PATCH v4 8/8] RISC-V: KVM: Expose Zicboz to the guest Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 15:26 ` Andrew Jones
2023-02-09 17:45 ` [PATCH v4 0/8] RISC-V: Apply Zicboz to clear_page Conor Dooley
2023-02-09 17:45 ` Conor Dooley
2023-02-09 17:45 ` Conor Dooley
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=Y+VD2/owMIvqzOx8@spud \
--to=conor@kernel.org \
--cc=kvm-riscv@lists.infradead.org \
/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.