@@ -132,6 +132,7 @@ bool filter_reg(__u64 reg)
132132 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_DBCN :
133133 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SUSP :
134134 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA :
135+ case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_FWFT :
135136 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL :
136137 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR :
137138 return true;
@@ -637,6 +638,7 @@ static const char *sbi_ext_single_id_to_str(__u64 reg_off)
637638 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_DBCN ),
638639 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_SUSP ),
639640 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_STA ),
641+ KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_FWFT ),
640642 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_EXPERIMENTAL ),
641643 KVM_SBI_EXT_ARR (KVM_RISCV_SBI_EXT_VENDOR ),
642644 };
@@ -693,6 +695,19 @@ static const char *sbi_sta_id_to_str(__u64 reg_off)
693695 return strdup_printf ("KVM_REG_RISCV_SBI_STA | %lld /* UNKNOWN */" , reg_off );
694696}
695697
698+ static const char * sbi_fwft_id_to_str (__u64 reg_off )
699+ {
700+ switch (reg_off ) {
701+ case 0 : return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.enable)" ;
702+ case 1 : return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.flags)" ;
703+ case 2 : return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.value)" ;
704+ case 3 : return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.enable)" ;
705+ case 4 : return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.flags)" ;
706+ case 5 : return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.value)" ;
707+ }
708+ return strdup_printf ("KVM_REG_RISCV_SBI_FWFT | %lld /* UNKNOWN */" , reg_off );
709+ }
710+
696711static const char * sbi_id_to_str (const char * prefix , __u64 id )
697712{
698713 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_SBI_STATE );
@@ -705,6 +720,8 @@ static const char *sbi_id_to_str(const char *prefix, __u64 id)
705720 switch (reg_subtype ) {
706721 case KVM_REG_RISCV_SBI_STA :
707722 return sbi_sta_id_to_str (reg_off );
723+ case KVM_REG_RISCV_SBI_FWFT :
724+ return sbi_fwft_id_to_str (reg_off );
708725 }
709726
710727 return strdup_printf ("%lld | %lld /* UNKNOWN */" , reg_subtype , reg_off );
@@ -872,6 +889,16 @@ static __u64 sbi_sta_regs[] = {
872889 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 ),
873890};
874891
892+ static __u64 sbi_fwft_regs [] = {
893+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_FWFT ,
894+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG (misaligned_deleg .enable ),
895+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG (misaligned_deleg .flags ),
896+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG (misaligned_deleg .value ),
897+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG (pointer_masking .enable ),
898+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG (pointer_masking .flags ),
899+ KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG (pointer_masking .value ),
900+ };
901+
875902static __u64 zicbom_regs [] = {
876903 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG (zicbom_block_size ),
877904 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM ,
@@ -1028,6 +1055,9 @@ static __u64 vector_regs[] = {
10281055#define SUBLIST_SBI_STA \
10291056 {"sbi-sta", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_STA, \
10301057 .regs = sbi_sta_regs, .regs_n = ARRAY_SIZE(sbi_sta_regs),}
1058+ #define SUBLIST_SBI_FWFT \
1059+ {"sbi-fwft", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_FWFT, \
1060+ .regs = sbi_fwft_regs, .regs_n = ARRAY_SIZE(sbi_fwft_regs),}
10311061#define SUBLIST_ZICBOM \
10321062 {"zicbom", .feature = KVM_RISCV_ISA_EXT_ZICBOM, .regs = zicbom_regs, .regs_n = ARRAY_SIZE(zicbom_regs),}
10331063#define SUBLIST_ZICBOP \
@@ -1112,6 +1142,7 @@ KVM_SBI_EXT_SUBLIST_CONFIG(sta, STA);
11121142KVM_SBI_EXT_SIMPLE_CONFIG (pmu , PMU );
11131143KVM_SBI_EXT_SIMPLE_CONFIG (dbcn , DBCN );
11141144KVM_SBI_EXT_SIMPLE_CONFIG (susp , SUSP );
1145+ KVM_SBI_EXT_SUBLIST_CONFIG (fwft , FWFT );
11151146
11161147KVM_ISA_EXT_SUBLIST_CONFIG (aia , AIA );
11171148KVM_ISA_EXT_SUBLIST_CONFIG (fp_f , FP_F );
@@ -1191,6 +1222,7 @@ struct vcpu_reg_list *vcpu_configs[] = {
11911222 & config_sbi_pmu ,
11921223 & config_sbi_dbcn ,
11931224 & config_sbi_susp ,
1225+ & config_sbi_fwft ,
11941226 & config_aia ,
11951227 & config_fp_f ,
11961228 & config_fp_d ,
0 commit comments