[kvmtool PATCH v2 08/10] riscv: Include single-letter extensions in isa_info_arr[]
Andrew Jones
ajones at ventanamicro.com
Fri Apr 25 05:17:21 PDT 2025
On Thu, Apr 24, 2025 at 09:01:57PM +0530, Anup Patel wrote:
> Currently, the isa_info_arr[] only include multi-letter extensions but
> the KVM ONE_REG interface covers both single-letter and multi-letter
> extensions so extend isa_info_arr[] to include single-letter extensions.
>
> This also allows combining two loops in the generate_cpu_nodes()
> function into one loop.
>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
> riscv/fdt.c | 148 +++++++++++++++++++++++++++-------------------------
> 1 file changed, 76 insertions(+), 72 deletions(-)
>
> diff --git a/riscv/fdt.c b/riscv/fdt.c
> index 251821e..c741fd8 100644
> --- a/riscv/fdt.c
> +++ b/riscv/fdt.c
> @@ -12,71 +12,81 @@
> struct isa_ext_info {
> const char *name;
> unsigned long ext_id;
> + bool single_letter;
> };
>
> struct isa_ext_info isa_info_arr[] = {
> - /* sorted alphabetically */
> - {"smnpm", KVM_RISCV_ISA_EXT_SMNPM},
> - {"smstateen", KVM_RISCV_ISA_EXT_SMSTATEEN},
> - {"ssaia", KVM_RISCV_ISA_EXT_SSAIA},
> - {"sscofpmf", KVM_RISCV_ISA_EXT_SSCOFPMF},
> - {"ssnpm", KVM_RISCV_ISA_EXT_SSNPM},
> - {"sstc", KVM_RISCV_ISA_EXT_SSTC},
> - {"svade", KVM_RISCV_ISA_EXT_SVADE},
> - {"svadu", KVM_RISCV_ISA_EXT_SVADU},
> - {"svinval", KVM_RISCV_ISA_EXT_SVINVAL},
> - {"svnapot", KVM_RISCV_ISA_EXT_SVNAPOT},
> - {"svpbmt", KVM_RISCV_ISA_EXT_SVPBMT},
> - {"svvptc", KVM_RISCV_ISA_EXT_SVVPTC},
> - {"zabha", KVM_RISCV_ISA_EXT_ZABHA},
> - {"zacas", KVM_RISCV_ISA_EXT_ZACAS},
> - {"zawrs", KVM_RISCV_ISA_EXT_ZAWRS},
> - {"zba", KVM_RISCV_ISA_EXT_ZBA},
> - {"zbb", KVM_RISCV_ISA_EXT_ZBB},
> - {"zbc", KVM_RISCV_ISA_EXT_ZBC},
> - {"zbkb", KVM_RISCV_ISA_EXT_ZBKB},
> - {"zbkc", KVM_RISCV_ISA_EXT_ZBKC},
> - {"zbkx", KVM_RISCV_ISA_EXT_ZBKX},
> - {"zbs", KVM_RISCV_ISA_EXT_ZBS},
> - {"zca", KVM_RISCV_ISA_EXT_ZCA},
> - {"zcb", KVM_RISCV_ISA_EXT_ZCB},
> - {"zcd", KVM_RISCV_ISA_EXT_ZCD},
> - {"zcf", KVM_RISCV_ISA_EXT_ZCF},
> - {"zcmop", KVM_RISCV_ISA_EXT_ZCMOP},
> - {"zfa", KVM_RISCV_ISA_EXT_ZFA},
> - {"zfh", KVM_RISCV_ISA_EXT_ZFH},
> - {"zfhmin", KVM_RISCV_ISA_EXT_ZFHMIN},
> - {"zicbom", KVM_RISCV_ISA_EXT_ZICBOM},
> - {"zicboz", KVM_RISCV_ISA_EXT_ZICBOZ},
> - {"ziccrse", KVM_RISCV_ISA_EXT_ZICCRSE},
> - {"zicntr", KVM_RISCV_ISA_EXT_ZICNTR},
> - {"zicond", KVM_RISCV_ISA_EXT_ZICOND},
> - {"zicsr", KVM_RISCV_ISA_EXT_ZICSR},
> - {"zifencei", KVM_RISCV_ISA_EXT_ZIFENCEI},
> - {"zihintntl", KVM_RISCV_ISA_EXT_ZIHINTNTL},
> - {"zihintpause", KVM_RISCV_ISA_EXT_ZIHINTPAUSE},
> - {"zihpm", KVM_RISCV_ISA_EXT_ZIHPM},
> - {"zimop", KVM_RISCV_ISA_EXT_ZIMOP},
> - {"zknd", KVM_RISCV_ISA_EXT_ZKND},
> - {"zkne", KVM_RISCV_ISA_EXT_ZKNE},
> - {"zknh", KVM_RISCV_ISA_EXT_ZKNH},
> - {"zkr", KVM_RISCV_ISA_EXT_ZKR},
> - {"zksed", KVM_RISCV_ISA_EXT_ZKSED},
> - {"zksh", KVM_RISCV_ISA_EXT_ZKSH},
> - {"zkt", KVM_RISCV_ISA_EXT_ZKT},
> - {"ztso", KVM_RISCV_ISA_EXT_ZTSO},
> - {"zvbb", KVM_RISCV_ISA_EXT_ZVBB},
> - {"zvbc", KVM_RISCV_ISA_EXT_ZVBC},
> - {"zvfh", KVM_RISCV_ISA_EXT_ZVFH},
> - {"zvfhmin", KVM_RISCV_ISA_EXT_ZVFHMIN},
> - {"zvkb", KVM_RISCV_ISA_EXT_ZVKB},
> - {"zvkg", KVM_RISCV_ISA_EXT_ZVKG},
> - {"zvkned", KVM_RISCV_ISA_EXT_ZVKNED},
> - {"zvknha", KVM_RISCV_ISA_EXT_ZVKNHA},
> - {"zvknhb", KVM_RISCV_ISA_EXT_ZVKNHB},
> - {"zvksed", KVM_RISCV_ISA_EXT_ZVKSED},
> - {"zvksh", KVM_RISCV_ISA_EXT_ZVKSH},
> - {"zvkt", KVM_RISCV_ISA_EXT_ZVKT},
> + /* single-letter ordered canonically as "IEMAFDQCLBJTPVNSUHKORWXYZG" */
> + {"i", KVM_RISCV_ISA_EXT_I, .single_letter = true},
> + {"m", KVM_RISCV_ISA_EXT_M, .single_letter = true},
> + {"a", KVM_RISCV_ISA_EXT_A, .single_letter = true},
> + {"f", KVM_RISCV_ISA_EXT_F, .single_letter = true},
> + {"d", KVM_RISCV_ISA_EXT_D, .single_letter = true},
> + {"c", KVM_RISCV_ISA_EXT_C, .single_letter = true},
> + {"v", KVM_RISCV_ISA_EXT_V, .single_letter = true},
> + {"h", KVM_RISCV_ISA_EXT_H, .single_letter = true},
> + /* multi-letter sorted alphabetically */
> + {"smnpm", KVM_RISCV_ISA_EXT_SMNPM},
> + {"smstateen", KVM_RISCV_ISA_EXT_SMSTATEEN},
> + {"ssaia", KVM_RISCV_ISA_EXT_SSAIA},
> + {"sscofpmf", KVM_RISCV_ISA_EXT_SSCOFPMF},
> + {"ssnpm", KVM_RISCV_ISA_EXT_SSNPM},
> + {"sstc", KVM_RISCV_ISA_EXT_SSTC},
> + {"svade", KVM_RISCV_ISA_EXT_SVADE},
> + {"svadu", KVM_RISCV_ISA_EXT_SVADU},
> + {"svinval", KVM_RISCV_ISA_EXT_SVINVAL},
> + {"svnapot", KVM_RISCV_ISA_EXT_SVNAPOT},
> + {"svpbmt", KVM_RISCV_ISA_EXT_SVPBMT},
> + {"svvptc", KVM_RISCV_ISA_EXT_SVVPTC},
> + {"zabha", KVM_RISCV_ISA_EXT_ZABHA},
> + {"zacas", KVM_RISCV_ISA_EXT_ZACAS},
> + {"zawrs", KVM_RISCV_ISA_EXT_ZAWRS},
> + {"zba", KVM_RISCV_ISA_EXT_ZBA},
> + {"zbb", KVM_RISCV_ISA_EXT_ZBB},
> + {"zbc", KVM_RISCV_ISA_EXT_ZBC},
> + {"zbkb", KVM_RISCV_ISA_EXT_ZBKB},
> + {"zbkc", KVM_RISCV_ISA_EXT_ZBKC},
> + {"zbkx", KVM_RISCV_ISA_EXT_ZBKX},
> + {"zbs", KVM_RISCV_ISA_EXT_ZBS},
> + {"zca", KVM_RISCV_ISA_EXT_ZCA},
> + {"zcb", KVM_RISCV_ISA_EXT_ZCB},
> + {"zcd", KVM_RISCV_ISA_EXT_ZCD},
> + {"zcf", KVM_RISCV_ISA_EXT_ZCF},
> + {"zcmop", KVM_RISCV_ISA_EXT_ZCMOP},
> + {"zfa", KVM_RISCV_ISA_EXT_ZFA},
> + {"zfh", KVM_RISCV_ISA_EXT_ZFH},
> + {"zfhmin", KVM_RISCV_ISA_EXT_ZFHMIN},
> + {"zicbom", KVM_RISCV_ISA_EXT_ZICBOM},
> + {"zicboz", KVM_RISCV_ISA_EXT_ZICBOZ},
> + {"ziccrse", KVM_RISCV_ISA_EXT_ZICCRSE},
> + {"zicntr", KVM_RISCV_ISA_EXT_ZICNTR},
> + {"zicond", KVM_RISCV_ISA_EXT_ZICOND},
> + {"zicsr", KVM_RISCV_ISA_EXT_ZICSR},
> + {"zifencei", KVM_RISCV_ISA_EXT_ZIFENCEI},
> + {"zihintntl", KVM_RISCV_ISA_EXT_ZIHINTNTL},
> + {"zihintpause", KVM_RISCV_ISA_EXT_ZIHINTPAUSE},
> + {"zihpm", KVM_RISCV_ISA_EXT_ZIHPM},
> + {"zimop", KVM_RISCV_ISA_EXT_ZIMOP},
> + {"zknd", KVM_RISCV_ISA_EXT_ZKND},
> + {"zkne", KVM_RISCV_ISA_EXT_ZKNE},
> + {"zknh", KVM_RISCV_ISA_EXT_ZKNH},
> + {"zkr", KVM_RISCV_ISA_EXT_ZKR},
> + {"zksed", KVM_RISCV_ISA_EXT_ZKSED},
> + {"zksh", KVM_RISCV_ISA_EXT_ZKSH},
> + {"zkt", KVM_RISCV_ISA_EXT_ZKT},
> + {"ztso", KVM_RISCV_ISA_EXT_ZTSO},
> + {"zvbb", KVM_RISCV_ISA_EXT_ZVBB},
> + {"zvbc", KVM_RISCV_ISA_EXT_ZVBC},
> + {"zvfh", KVM_RISCV_ISA_EXT_ZVFH},
> + {"zvfhmin", KVM_RISCV_ISA_EXT_ZVFHMIN},
> + {"zvkb", KVM_RISCV_ISA_EXT_ZVKB},
> + {"zvkg", KVM_RISCV_ISA_EXT_ZVKG},
> + {"zvkned", KVM_RISCV_ISA_EXT_ZVKNED},
> + {"zvknha", KVM_RISCV_ISA_EXT_ZVKNHA},
> + {"zvknhb", KVM_RISCV_ISA_EXT_ZVKNHB},
> + {"zvksed", KVM_RISCV_ISA_EXT_ZVKSED},
> + {"zvksh", KVM_RISCV_ISA_EXT_ZVKSH},
> + {"zvkt", KVM_RISCV_ISA_EXT_ZVKT},
> };
>
> static void dump_fdt(const char *dtb_file, void *fdt)
> @@ -98,10 +108,8 @@ static void dump_fdt(const char *dtb_file, void *fdt)
> #define CPU_NAME_MAX_LEN 15
> static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
> {
> - int cpu, pos, i, index, valid_isa_len;
> - const char *valid_isa_order = "IEMAFDQCLBJTPVNSUHKORWXYZG";
> - int arr_sz = ARRAY_SIZE(isa_info_arr);
> unsigned long cbom_blksz = 0, cboz_blksz = 0, satp_mode = 0;
> + int i, cpu, pos, arr_sz = ARRAY_SIZE(isa_info_arr);
>
> _FDT(fdt_begin_node(fdt, "cpus"));
> _FDT(fdt_property_cell(fdt, "#address-cells", 0x1));
> @@ -121,12 +129,6 @@ static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
>
> snprintf(cpu_isa, CPU_ISA_MAX_LEN, "rv%ld", vcpu->riscv_xlen);
> pos = strlen(cpu_isa);
> - valid_isa_len = strlen(valid_isa_order);
> - for (i = 0; i < valid_isa_len; i++) {
> - index = valid_isa_order[i] - 'A';
> - if (vcpu->riscv_isa & (1 << (index)))
> - cpu_isa[pos++] = 'a' + index;
> - }
>
> for (i = 0; i < arr_sz; i++) {
> reg.id = RISCV_ISA_EXT_REG(isa_info_arr[i].ext_id);
> @@ -164,7 +166,9 @@ static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
> isa_info_arr[i].name);
> break;
> }
> - pos += snprintf(cpu_isa + pos, CPU_ISA_MAX_LEN - pos, "_%s",
> +
> + pos += snprintf(cpu_isa + pos, CPU_ISA_MAX_LEN - pos, "%s%s",
> + isa_info_arr[i].single_letter ? "" : "_",
> isa_info_arr[i].name);
> }
> cpu_isa[pos] = '\0';
> --
> 2.43.0
>
Reviewed-by: Andrew Jones <ajones at ventanamicro.com>
More information about the kvm-riscv
mailing list