[kvm-unit-tests PATCH 4/7] riscv: Add ACPI support for ISA string discovery
Andrew Jones
andrew.jones at linux.dev
Wed Sep 30 03:15:10 PDT 2026
On Thu, Sep 24, 2026 at 11:39:42AM +0800, Xiang W wrote:
> When a DT is not provided, walk the RHCT Hart Info nodes and parse
> the referenced ISA String node instead of aborting in isa_init()
> and cpu_has_extension_name().
>
> Match the current hart by ACPI UID (DT still matches by hartid)
> and feed the ISA string into the existing isa_parse() helper so
> extension detection is shared by both firmware descriptions.
>
> Rename isa_info.hartid to isa_info.id so the same iterator state
> can hold either identifier.
>
> Signed-off-by: Xiang W <wangxiang at iscas.ac.cn>
> ---
> lib/acpi.h | 28 ++++++++++++++++++++
> lib/riscv/isa.c | 68 ++++++++++++++++++++++++++++++++++++++++++++-----
> 2 files changed, 89 insertions(+), 7 deletions(-)
>
> diff --git a/lib/acpi.h b/lib/acpi.h
> index 2597e8ce..3db382b7 100644
> --- a/lib/acpi.h
> +++ b/lib/acpi.h
> @@ -337,6 +337,34 @@ struct acpi_table_rhct {
> u32 node_offset;
> };
>
> +#define ACPI_RHCT_NODE_HEADER_DEF \
> + u16 type; \
> + u16 length; \
> + u16 revision; \
> +
> +struct acpi_rhct_node {
> + ACPI_RHCT_NODE_HEADER_DEF
> + char data[];
> +};
> +
> +enum acpi_rhct_node_type {
> + RHCT_NODE_ISA_STRING = 0x0,
> + RHCT_NODE_HART_INFO = 0xFFFF
ACPI_RHCT_NODE_TYPE_ISA_STRING
ACPI_RHCT_NODE_TYPE_HART_INFO
> +};
> +
> +struct acpi_rhct_node_isa_string {
> + ACPI_RHCT_NODE_HEADER_DEF
> + u16 isa_length;
> + char isa[];
> +};
> +
> +struct acpi_rhct_node_hart_info {
> + ACPI_RHCT_NODE_HEADER_DEF
> + u16 num_offsets;
> + u32 uid;
> + u32 nodes[];
> +};
> +
> /* Reset to default packing */
> #pragma pack()
>
> diff --git a/lib/riscv/isa.c b/lib/riscv/isa.c
> index bc1c9c72..b0257979 100644
> --- a/lib/riscv/isa.c
> +++ b/lib/riscv/isa.c
> @@ -12,7 +12,7 @@
> typedef void (*isa_func_t)(const char *, int, void *);
>
> struct isa_info {
> - unsigned long hartid;
> + unsigned long id;
> isa_func_t func;
> void *data;
> };
> @@ -74,7 +74,7 @@ static void isa_parse_fdt(int cpu_node, u64 hartid, void *data)
> const struct fdt_property *prop;
> int len;
>
> - if (hartid != info->hartid)
> + if (hartid != info->id)
> return;
>
> prop = fdt_get_property(dt_fdt(), cpu_node, "riscv,isa", &len);
> @@ -83,32 +83,80 @@ static void isa_parse_fdt(int cpu_node, u64 hartid, void *data)
> isa_parse(prop->data, len, info);
> }
>
> -static void isa_init_acpi(void)
> +#ifdef CONFIG_EFI
> +#include <acpi.h>
> +
> +static void isa_parse_acpi(struct acpi_table_rhct *rhct, struct acpi_rhct_node_hart_info *hart_info, void *data)
Let's keep it under 100
static void isa_parse_acpi(struct acpi_table_rhct *rhct,
struct acpi_rhct_node_hart_info *hart_info, void *data)
> +{
> + u32 offset;
> + struct acpi_rhct_node *node;
> + struct acpi_rhct_node_isa_string *isa_string;
> + struct isa_info *info = (struct isa_info *)data;
> +
> + if (hart_info->uid != info->id)
> + return;
> +
> + for (int i = 0; i < hart_info->num_offsets; i++) {
> + offset = hart_info->nodes[i];
> + if (offset >= rhct->length)
> + break;
> + node = (void *)rhct + offset;
> + if (node->type == RHCT_NODE_ISA_STRING) {
> + isa_string = (void *) node;
isa_string = (void *)node
I thought checkpatch would catch something like that. Did you run it?
> + isa_parse(isa_string->isa, isa_string->isa_length, info);
> + }
> + }
> +}
> +
> +static void acpi_rhct_for_each_hart(
> + void (*func)(struct acpi_table_rhct *, struct acpi_rhct_node_hart_info *, void *), void *data)
static void acpi_rhct_for_each_hart(void (*func)(struct acpi_table_rhct *,
struct acpi_rhct_node_hart_info *,
void *), void *data)
> {
> - assert_msg(false, "ACPI not available");
> + u32 offset;
> + struct acpi_table_rhct *rhct;
> + struct acpi_rhct_node *node;
> + struct acpi_rhct_node_hart_info *hart_info;
Need a blank line here. I'm thinking checkpatch wasn't run, since I'm sure
that would have been caught.
Thanks,
drew
More information about the kvm-riscv
mailing list