@@ -71,6 +71,7 @@ bool filter_reg(__u64 reg)
7171 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM :
7272 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_PMU :
7373 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_DBCN :
74+ case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA :
7475 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL :
7576 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR :
7677 return true;
@@ -461,6 +462,7 @@ static const char *sbi_ext_single_id_to_str(__u64 reg_off)
461462 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_SRST ),
462463 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_HSM ),
463464 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_PMU ),
465+ KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_STA ),
464466 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_EXPERIMENTAL ),
465467 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_VENDOR ),
466468 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_DBCN ),
@@ -509,6 +511,32 @@ static const char *sbi_ext_id_to_str(const char *prefix, __u64 id)
509511 return strdup_printf ("%lld | %lld /* UNKNOWN */" , reg_subtype , reg_off );
510512}
511513
514+ static const char * sbi_sta_id_to_str (__u64 reg_off )
515+ {
516+ switch (reg_off ) {
517+ case 0 : return "KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_lo)" ;
518+ case 1 : return "KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_hi)" ;
519+ }
520+ return strdup_printf ("KVM_REG_RISCV_SBI_STA | %lld /* UNKNOWN */" , reg_off );
521+ }
522+
523+ static const char * sbi_id_to_str (const char * prefix , __u64 id )
524+ {
525+ __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_SBI_STATE );
526+ __u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK ;
527+
528+ assert ((id & KVM_REG_RISCV_TYPE_MASK ) == KVM_REG_RISCV_SBI_STATE );
529+
530+ reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK ;
531+
532+ switch (reg_subtype ) {
533+ case KVM_REG_RISCV_SBI_STA :
534+ return sbi_sta_id_to_str (reg_off );
535+ }
536+
537+ return strdup_printf ("%lld | %lld /* UNKNOWN */" , reg_subtype , reg_off );
538+ }
539+
512540void print_reg (const char * prefix , __u64 id )
513541{
514542 const char * reg_size = NULL ;
@@ -565,6 +593,10 @@ void print_reg(const char *prefix, __u64 id)
565593 printf ("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_SBI_EXT | %s,\n" ,
566594 reg_size , sbi_ext_id_to_str (prefix , id ));
567595 break ;
596+ case KVM_REG_RISCV_SBI_STATE :
597+ printf ("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_SBI_STATE | %s,\n" ,
598+ reg_size , sbi_id_to_str (prefix , id ));
599+ break ;
568600 default :
569601 printf ("\tKVM_REG_RISCV | %s | 0x%llx /* UNKNOWN */,\n" ,
570602 reg_size , id & ~REG_MASK );
@@ -651,6 +683,12 @@ static __u64 sbi_base_regs[] = {
651683 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR ,
652684};
653685
686+ static __u64 sbi_sta_regs [] = {
687+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA ,
688+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG (shmem_lo ),
689+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG (shmem_hi ),
690+ };
691+
654692static __u64 zicbom_regs [] = {
655693 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG (zicbom_block_size ),
656694 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM ,
@@ -757,6 +795,9 @@ static __u64 fp_d_regs[] = {
757795#define SUBLIST_SBI_BASE \
758796 {"sbi-base", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_V01, \
759797 .regs = sbi_base_regs, .regs_n = ARRAY_SIZE(sbi_base_regs),}
798+ #define SUBLIST_SBI_STA \
799+ {"sbi-sta", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_STA, \
800+ .regs = sbi_sta_regs, .regs_n = ARRAY_SIZE(sbi_sta_regs),}
760801#define SUBLIST_ZICBOM \
761802 {"zicbom", .feature = KVM_RISCV_ISA_EXT_ZICBOM, .regs = zicbom_regs, .regs_n = ARRAY_SIZE(zicbom_regs),}
762803#define SUBLIST_ZICBOZ \
@@ -832,6 +873,7 @@ static struct vcpu_reg_list config_sbi_##ext = { \
832873/* Note: The below list is alphabetically sorted. */
833874
834875KVM_SBI_EXT_SUBLIST_CONFIG (base , BASE );
876+ KVM_SBI_EXT_SUBLIST_CONFIG (sta , STA );
835877KVM_SBI_EXT_SIMPLE_CONFIG (pmu , PMU );
836878KVM_SBI_EXT_SIMPLE_CONFIG (dbcn , DBCN );
837879
@@ -858,6 +900,7 @@ KVM_ISA_EXT_SIMPLE_CONFIG(zihpm, ZIHPM);
858900
859901struct vcpu_reg_list * vcpu_configs [] = {
860902 & config_sbi_base ,
903+ & config_sbi_sta ,
861904 & config_sbi_pmu ,
862905 & config_sbi_dbcn ,
863906 & config_aia ,
0 commit comments