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 v5 09/26] xen/riscv: introduce guest riscv,isa string
Date: Fri, 10 Jul 2026 17:00:57 +0200 [thread overview]
Message-ID: <79e5b29d-b107-4176-b8e8-bacf4c4059cd@gmail.com> (raw)
In-Reply-To: <2f26c623-e577-44bb-8163-f52b97496d05@suse.com>
On 7/9/26 3:05 PM, Jan Beulich wrote:
> On 06.07.2026 17:57, Oleksii Kurochko wrote:
>> --- a/xen/arch/riscv/cpufeature.c
>> +++ b/xen/arch/riscv/cpufeature.c
>> @@ -14,6 +14,7 @@
>> #include <xen/errno.h>
>> #include <xen/init.h>
>> #include <xen/lib.h>
>> +#include <xen/sched.h>
>> #include <xen/sections.h>
>>
>> #include <asm/cpufeature.h>
>> @@ -34,6 +35,19 @@ struct riscv_isa_ext_data {
>> .name = #ext_name, \
>> }
>>
>> +struct riscv_isa_ext_entry {
>> + unsigned int id;
>> + const char *name;
>> + bool guest_supported;
>> +};
>> +
>> +#define RISCV_ISA_EXT_ENTRY(ext_name, guest_supp) \
>> +{ \
>> + .id = RISCV_ISA_EXT_ ## ext_name, \
>> + .name = #ext_name, \
>> + .guest_supported = guest_supp, \
>> +}
>> +
>> /* Host ISA bitmap */
>> static __ro_after_init DECLARE_BITMAP(riscv_isa, RISCV_ISA_EXT_MAX);
>>
>> @@ -120,29 +134,30 @@ static int __init dt_get_cpuid_from_node(const struct dt_device_node *cpu,
>> * and strncmp() is used in match_isa_ext() to compare extension names instead
>> * of strncasecmp().
>> */
>> -const struct riscv_isa_ext_data __initconst riscv_isa_ext[] = {
>
> I realize it has been this way before, but ...
>
>> - RISCV_ISA_EXT_DATA(i),
>> - RISCV_ISA_EXT_DATA(m),
>> - RISCV_ISA_EXT_DATA(a),
>> - RISCV_ISA_EXT_DATA(f),
>> - RISCV_ISA_EXT_DATA(d),
>> - RISCV_ISA_EXT_DATA(q),
>> - RISCV_ISA_EXT_DATA(c),
>> - RISCV_ISA_EXT_DATA(h),
>> - RISCV_ISA_EXT_DATA(zicntr),
>> - RISCV_ISA_EXT_DATA(zicsr),
>> - RISCV_ISA_EXT_DATA(zifencei),
>> - RISCV_ISA_EXT_DATA(zihintpause),
>> - RISCV_ISA_EXT_DATA(zihpm),
>> - RISCV_ISA_EXT_DATA(zba),
>> - RISCV_ISA_EXT_DATA(zbb),
>> - RISCV_ISA_EXT_DATA(zbs),
>> - RISCV_ISA_EXT_DATA(smaia),
>> - RISCV_ISA_EXT_DATA(smstateen),
>> - RISCV_ISA_EXT_DATA(ssaia),
>> - RISCV_ISA_EXT_DATA(sstc),
>> - RISCV_ISA_EXT_DATA(svade),
>> - RISCV_ISA_EXT_DATA(svpbmt),
>> +const struct riscv_isa_ext_entry riscv_isa_ext[] = {
>
> ... is there a reason for this to be non-static? Its type (struct
> riscv_isa_ext_entry) is local to this file, and I also can't spot any
> declaration elsewhere.
I checked downstream changes and it also local to cpufeature.c file so
it should be static.
>
>> @@ -480,6 +495,74 @@ bool riscv_isa_extension_available(const unsigned long *isa_bitmap,
>> return test_bit(id, isa_bitmap);
>> }
>>
>> +int build_guest_isa_str(char *buf, size_t size,
>> + const unsigned long *isa_bitmap)
>> +{
>> + char *p = buf;
>> + size_t left = size;
>> + int total;
>> +
>> +#if defined(CONFIG_RISCV_32)
>> + total = snprintf(p, left, "rv32");
>> +#elif defined(CONFIG_RISCV_64)
>> + total = snprintf(p, left, "rv64");
>> +#else
>> +# error "Unsupported RISC-V bitness"
>> +#endif
>
> For the longer-term future of this, passing in const struct domain * may
> help.
pointer to const struct domain looks really better I chnage prototype of
build_guest_isa_str().
>
>> + if ( total < 0 )
>> + return total;
>> +
>> + if ( buf )
>> + {
>> + if ( (size_t)total >= left )
>> + return -ENOSPC;
>> +
>> + p += total;
>> + left -= total;
>> + }
>> +
>> + for ( unsigned int i = 0; i < ARRAY_SIZE(riscv_isa_ext); i++ )
>> + {
>> + const struct riscv_isa_ext_entry *ext = &riscv_isa_ext[i];
>> + int ret;
>> +
>> + if ( !riscv_isa_extension_available(isa_bitmap, ext->id) )
>> + continue;
>> +
>> + ret = snprintf(p, left, "%s%s",
>> + ext->id >= RISCV_ISA_EXT_BASE ? "_" : "",
>> + ext->name);
>> + if ( ret < 0 )
>> + return ret;
>> +
>> + total += ret;
>> +
>> + if ( buf )
>> + {
>> + if ( (size_t)ret >= left )
>> + return -ENOSPC;
>> +
>> + p += ret;
>> + left -= ret;
>> + }
>> + }
>> +
>> + return total;
>> +}
>> +
>> +void init_guest_isa(struct domain *d)
>> +{
>> + for ( unsigned int i = 0; i < ARRAY_SIZE(riscv_isa_ext); i++ )
>> + {
>> + const struct riscv_isa_ext_entry *ext = &riscv_isa_ext[i];
>> +
>> + if ( ext->guest_supported &&
>> + riscv_isa_extension_available(NULL, ext->id) )
>> + __set_bit(ext->id, d->arch.isa);
>> + }
>> +}
>
> Right now what this function does is dependent on only global variables.
> IOW each guest gets the same bitmap. Is this going to change soon?
At the moment, we don't have a use case where domain has unique bitmap.
But IIRC correctly we agreed that generally it is good idea to have isa
bitmap per domain and let the use to chose.
Else
> why not calculate that bitmap once, taking the same shortcut as you take
> elsewhere for the time being?
static __ro_after_init DECLARE_BITMAP(guest_isa, RISCV_ISA_EXT_MAX);
/* called once from riscv_fill_hwcap() or similar */
void __init init_guest_isa_mask(void)
{
for ( unsigned int i = 0; i < ARRAY_SIZE(riscv_isa_ext); i++ )
if ( riscv_isa_ext[i].guest_supported &&
riscv_isa_extension_available(NULL, riscv_isa_ext[i].id) )
__set_bit(riscv_isa_ext[i].id, guest_isa);
}
void init_guest_isa(struct domain *d) /* called per-domain */
{
bitmap_copy(d->arch.isa, guest_isa, RISCV_ISA_EXT_MAX);
}
Do you mean something like that?
Then allowing riscv_isa_ext[] to remain
> __initconst (should really have been __initconstrel).
I think you explained me already why but I forgot. Could you please
remind me again why __initconstrel should be here? Is it because of
pointers used inside struct riscv_isa_ext_entry?
Thanks.
~ Oleksii
next prev parent reply other threads:[~2026-07-10 15:01 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-06 15:57 [PATCH v5 00/26] Introduce enablemenant of dom0less Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 01/26] xen/dom0less: turn max_init_domid into a common variable Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 02/26] xen: arm: move declaration of map_device_irqs_to_domain() to common header Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 03/26] xen: arm: update p2m_set_allocation() prototype Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 04/26] xen/Kconfig: introduce HAS_STATIC_MEMORY Oleksii Kurochko
2026-07-07 9:52 ` Jan Beulich
2026-07-08 11:50 ` Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 05/26] xen/riscv: rename enum intc_version to intc_variant Oleksii Kurochko
2026-07-06 16:05 ` Jan Beulich
2026-07-07 7:34 ` Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 06/26] xen/riscv: Implement ARCH_PAGING_MEMPOOL Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 07/26] xen/riscv: Implement construct_domain() Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 08/26] xen/riscv: implement prerequisites for domain_create() Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 09/26] xen/riscv: introduce guest riscv,isa string Oleksii Kurochko
2026-07-09 13:05 ` Jan Beulich
2026-07-10 15:00 ` Oleksii Kurochko [this message]
2026-07-13 6:37 ` Jan Beulich
2026-07-06 15:57 ` [PATCH v5 10/26] xen/riscv: implement make_cpus_node() Oleksii Kurochko
2026-07-09 13:20 ` Jan Beulich
2026-07-10 16:00 ` Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 11/26] xen/riscv: implement make_timer_node() Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 12/26] xen/riscv: implement make_arch_nodes() Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 13/26] xen/riscv: introduce init interrupt controller operations Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 14/26] xen/riscv: implement make_intc_domU_node() Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 15/26] xen/riscv: introduce aia_init() and aia_usable() Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 16/26] xen/riscv: introduce per-vCPU IMSIC state Oleksii Kurochko
2026-07-06 15:57 ` [PATCH v5 17/26] xen/riscv: introduce minimal virtual APLIC (vAPLIC) infrastructure Oleksii Kurochko
2026-07-09 15:39 ` Jan Beulich
2026-07-10 15:52 ` Oleksii Kurochko
2026-07-13 6:41 ` Jan Beulich
2026-07-13 9:57 ` Oleksii Kurochko
2026-07-13 15:44 ` Jan Beulich
2026-07-06 15:57 ` [PATCH v5 18/26] xen/riscv: introduce (de)initialization helpers for vINTC Oleksii Kurochko
2026-07-06 15:58 ` [PATCH v5 19/26] xen/riscv: generate IMSIC DT node for guest domains Oleksii Kurochko
2026-07-09 15:49 ` Jan Beulich
2026-07-13 10:41 ` Oleksii Kurochko
2026-07-06 15:58 ` [PATCH v5 20/26] xen/riscv: create APLIC " Oleksii Kurochko
2026-07-09 15:55 ` Jan Beulich
2026-07-06 15:58 ` [PATCH v5 21/26] xen/riscv: implement IRQ routing for device passthrough Oleksii Kurochko
2026-07-06 15:58 ` [PATCH v5 22/26] xen/riscv: implement init_intc_phandle() Oleksii Kurochko
2026-07-06 15:58 ` [PATCH v5 23/26] xen/riscv: initialize RCU, scheduler, and system domains in start_xen() Oleksii Kurochko
2026-07-06 15:58 ` [PATCH v5 24/26] xen/riscv: provide init_vuart() Oleksii Kurochko
2026-07-06 15:58 ` [PATCH v5 25/26] xen/riscv: add initial dom0less infrastructure support Oleksii Kurochko
2026-07-06 15:58 ` [PATCH v5 26/26] xen/riscv: do a 4th linking pass if necessary Oleksii Kurochko
2026-07-06 16:13 ` Jan Beulich
2026-07-07 8:19 ` Oleksii Kurochko
2026-07-07 8:37 ` Jan Beulich
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=79e5b29d-b107-4176-b8e8-bacf4c4059cd@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.