From: Oleksii Kurochko <oleksii.kurochko@gmail.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Romain Caritey" <Romain.Caritey@microchip.com>,
"Baptiste Le Duc" <baptiste.le-duc@vates.tech>,
"Alistair Francis" <alistair.francis@wdc.com>,
"Connor Davis" <connojdavis@gmail.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Anthony PERARD" <anthony.perard@vates.tech>,
"Michal Orzel" <michal.orzel@amd.com>,
"Julien Grall" <julien@xen.org>,
"Roger Pau Monné" <roger.pau@citrix.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH v4 08/25] xen/riscv: introduce guest riscv,isa string
Date: Tue, 30 Jun 2026 18:06:31 +0200 [thread overview]
Message-ID: <20740b98-bdc0-4098-afda-45b09dc07ca3@gmail.com> (raw)
In-Reply-To: <9d082182-394d-40cd-9afe-35369d7bc4bc@suse.com>
On 6/29/26 4:46 PM, Jan Beulich wrote:
> On 26.06.2026 17:46, Oleksii Kurochko wrote:
>> Changes in v4:
>> - Add an explicit overflow guard in build_guest_isa_str(): return
>> -ENOSPC when buf is non-NULL and total >= size, to avoid the
>> size - total underflow being passed to snprintf().
>
> How does ...
>
>> @@ -480,6 +489,81 @@ bool riscv_isa_extension_available(const unsigned long *isa_bitmap,
>> return test_bit(id, isa_bitmap);
>> }
>>
>> +static int build_guest_isa_str(char *buf, size_t size,
>> + const unsigned long *isa_bitmap)
>> +{
>> + int total;
>> +
>> +#if defined(CONFIG_RISCV_32)
>> + total = snprintf(buf, size, "rv32");
>> +#elif defined(CONFIG_RISCV_64)
>> + total = snprintf(buf, size, "rv64");
>> +#else
>> +# error "Unsupported RISC-V bitness"
>> +#endif
>> +
>> + if ( total < 0 )
>> + return total;
>> +
>> + if ( buf && ((size_t)total >= size) )
>> + return -ENOSPC;
>
> ... this help an underflow ...
>
>> + for ( unsigned int i = 0; i < ARRAY_SIZE(riscv_isa_ext); i++ )
>> + {
>> + const struct riscv_isa_ext_data *ext = &riscv_isa_ext[i];
>> + int ret;
>> +
>> + if ( !riscv_isa_extension_available(isa_bitmap, ext->id) )
>> + continue;
>> +
>> + ret = snprintf(buf ? buf + total : NULL,
>> + buf ? size - total : 0, "%s%s",
>
> ... on any but the first iteration here?
Agree, overflow still could happen. I will update that part to:
char *p = buf;
size_t left = size;
...
ret = snprintf(p, left, ...);
if ( ret < 0 )
return ret;
total += ret;
if ( buf )
{
if ( (size_t)ret >= left )
return -ENOSPC;
p += ret;
left -= ret;
}
Then size - total never compute, so unsigned underflow simply cannot occur.
>
>> +static void __init init_guest_unsupp(void)
>> +{
>> + __set_bit(RISCV_ISA_EXT_f, guest_unsupp);
>> + __set_bit(RISCV_ISA_EXT_d, guest_unsupp);
>> + __set_bit(RISCV_ISA_EXT_q, guest_unsupp);
>> + __set_bit(RISCV_ISA_EXT_v, guest_unsupp);
>> + __set_bit(RISCV_ISA_EXT_h, guest_unsupp);
>> + __set_bit(RISCV_ISA_EXT_sstc, guest_unsupp);
>> + __set_bit(RISCV_ISA_EXT_svade, guest_unsupp);
>> + __set_bit(RISCV_ISA_EXT_svpbmt, guest_unsupp);
>> +}
>
> Wouldn't riscv_isa_ext[] better get a prominent reminder that additions there
> may need mirroring here (unless guest support is implemented at the same time)?
> (As before, yet better would of course be to make sure this is consistent
> right from build time, i.e. without the need to have this separate function.
> Or minimally have the info right in that array, so that while adding one needs
> to think how to set that separate field.)
How about making the field mandatory at the call site instead, so it
can't be silently forgotten:
#define RISCV_ISA_EXT_DATA(ext_name, guest_supp) \
{ \
.id = RISCV_ISA_EXT_ ## ext_name, \
.name = #ext_name, \
.guest_supported = guest_supp, \
}
Every entry in riscv_isa_ext[] would then need an explicit true/false
argument, e.g. RISCV_ISA_EXT_DATA(f, false). That forces whoever adds a
new extension to make the decision right there, rather than relying on a
separate init_guest_unsupp() to be remembered. We'd drop guest_unsupp
and init_guest_unsupp(), and build d->arch.isa directly from the array
in init_guest_isa().
Maybe it would be better to introduce separate structure which will
embed .guest_supported + struct riscv_isa_ext_data.
>
>> --- a/xen/arch/riscv/include/asm/cpufeature.h
>> +++ b/xen/arch/riscv/include/asm/cpufeature.h
>> @@ -17,6 +17,7 @@
>> */
>> #define RISCV_ISA_EXT_BASE 26
>>
>> +
>> enum riscv_isa_ext_id {
>> RISCV_ISA_EXT_a,
>> RISCV_ISA_EXT_c,
>
> ???
I will drop unnecessary empty line.
>
>> @@ -94,6 +95,9 @@ struct arch_domain {
>> struct p2m_domain p2m;
>>
>> struct paging_domain paging;
>> +
>> + DECLARE_BITMAP(isa, RISCV_ISA_EXT_MAX);
>> + char *isa_str;
>> };
>
> Why is it again that both the bitmap and its string representation need
> storing? In the end they provide two different sources of truth, as there's
> no guarantee that they'll remain in sync.
isa_str is needed to guest device tree to tell which extensions are
supported.
isa bitmap is needed to check in runtime if extension is available and
it will be faster then search in a string. It could be a cases when code
is generic enough and some things shouldn't be touched when some
extension is available or not.
Considering the way how they are built they should be always in sync.
Thanks.
~ Oleksii
next prev parent reply other threads:[~2026-06-30 16:06 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-26 15:46 [PATCH v4 00/25] Introduce enablemenant of dom0less Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 01/25] xen/dom0less: turn max_init_domid into a common variable Oleksii Kurochko
2026-06-29 14:34 ` Jan Beulich
2026-06-26 15:46 ` [PATCH v4 02/25] xen: arm: move declaration of map_device_irqs_to_domain() to common header Oleksii Kurochko
2026-06-29 7:10 ` Orzel, Michal
2026-06-26 15:46 ` [PATCH v4 03/25] xen: arm: update p2m_set_allocation() prototype Oleksii Kurochko
2026-06-29 7:14 ` Orzel, Michal
2026-06-26 15:46 ` [PATCH v4 04/25] xen/Kconfig: introduce HAS_STATIC_MEMORY Oleksii Kurochko
2026-06-29 7:05 ` Jan Beulich
2026-06-29 7:24 ` Orzel, Michal
2026-06-26 15:46 ` [PATCH v4 05/25] xen/riscv: Implement ARCH_PAGING_MEMPOOL Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 06/25] xen/riscv: Implement construct_domain() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 07/25] xen/riscv: implement prerequisites for domain_create() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 08/25] xen/riscv: introduce guest riscv,isa string Oleksii Kurochko
2026-06-29 14:46 ` Jan Beulich
2026-06-30 16:06 ` Oleksii Kurochko [this message]
2026-07-01 6:22 ` Jan Beulich
2026-07-01 7:44 ` Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 09/25] xen/riscv: implement make_cpus_node() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 10/25] xen/riscv: implement make_timer_node() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 11/25] xen/riscv: implement make_arch_nodes() Oleksii Kurochko
2026-06-29 7:07 ` Jan Beulich
2026-06-26 15:46 ` [PATCH v4 12/25] xen/riscv: introduce init interrupt controller operations Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 13/25] xen/riscv: implement make_intc_domU_node() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 14/25] xen/riscv: introduce aia_init() and aia_usable() Oleksii Kurochko
2026-06-29 9:54 ` Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 15/25] xen/riscv: introduce per-vCPU IMSIC state Oleksii Kurochko
2026-06-29 14:54 ` Jan Beulich
2026-06-26 15:46 ` [PATCH v4 16/25] xen/riscv: introduce minimal virtual APLIC (vAPLIC) infrastructure Oleksii Kurochko
2026-06-29 15:02 ` Jan Beulich
2026-07-01 10:24 ` Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 17/25] xen/riscv: rename enum intc_version to intc_variant Oleksii Kurochko
2026-06-29 15:04 ` Jan Beulich
2026-07-01 10:32 ` Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 18/25] xen/riscv: introduce (de)initialization helpers for vINTC Oleksii Kurochko
2026-06-29 15:07 ` Jan Beulich
2026-07-01 10:52 ` Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 19/25] xen/riscv: generate IMSIC DT node for guest domains Oleksii Kurochko
2026-06-29 15:19 ` Jan Beulich
2026-07-01 11:21 ` Oleksii Kurochko
2026-07-01 11:55 ` Jan Beulich
2026-07-01 12:04 ` Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 20/25] xen/riscv: create APLIC " Oleksii Kurochko
2026-06-29 15:26 ` Jan Beulich
2026-07-01 11:55 ` Oleksii Kurochko
2026-07-01 11:58 ` Jan Beulich
2026-06-26 15:46 ` [PATCH v4 21/25] xen/riscv: implement IRQ routing for device passthrough Oleksii Kurochko
2026-06-29 15:55 ` Jan Beulich
2026-07-01 14:49 ` Oleksii Kurochko
2026-07-02 6:38 ` Jan Beulich
2026-07-02 9:33 ` Oleksii Kurochko
2026-07-02 14:32 ` Jan Beulich
2026-07-02 16:04 ` Oleksii Kurochko
2026-07-03 7:21 ` Jan Beulich
2026-07-03 10:34 ` Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 22/25] xen/riscv: implement init_intc_phandle() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 23/25] xen/riscv: initialize RCU, scheduler, and system domains in start_xen() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 24/25] xen/riscv: provide init_vuart() Oleksii Kurochko
2026-06-26 15:46 ` [PATCH v4 25/25] xen/riscv: add initial dom0less infrastructure support Oleksii Kurochko
2026-06-30 7:28 ` Jan Beulich
2026-07-01 15:24 ` Oleksii Kurochko
2026-07-02 6:41 ` Jan Beulich
2026-07-02 9:48 ` Oleksii Kurochko
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=20740b98-bdc0-4098-afda-45b09dc07ca3@gmail.com \
--to=oleksii.kurochko@gmail.com \
--cc=Romain.Caritey@microchip.com \
--cc=alistair.francis@wdc.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=baptiste.le-duc@vates.tech \
--cc=connojdavis@gmail.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.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.