[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