@@ -1335,26 +1335,30 @@ static u64 compute_res0_bits(struct kvm *kvm,
13351335static u64 compute_reg_res0_bits (struct kvm * kvm ,
13361336 const struct reg_feat_map_desc * r ,
13371337 unsigned long require , unsigned long exclude )
1338-
13391338{
13401339 u64 res0 ;
13411340
13421341 res0 = compute_res0_bits (kvm , r -> bit_feat_map , r -> bit_feat_map_sz ,
13431342 require , exclude );
13441343
1345- /*
1346- * If computing FGUs, don't take RES0 or register existence
1347- * into account -- we're not computing bits for the register
1348- * itself.
1349- */
1350- if (!(exclude & NEVER_FGU )) {
1351- res0 |= compute_res0_bits (kvm , & r -> feat_map , 1 , require , exclude );
1352- res0 |= ~reg_feat_map_bits (& r -> feat_map );
1353- }
1344+ res0 |= compute_res0_bits (kvm , & r -> feat_map , 1 , require , exclude );
1345+ res0 |= ~reg_feat_map_bits (& r -> feat_map );
13541346
13551347 return res0 ;
13561348}
13571349
1350+ static u64 compute_fgu_bits (struct kvm * kvm , const struct reg_feat_map_desc * r )
1351+ {
1352+ /*
1353+ * If computing FGUs, we collect the unsupported feature bits as
1354+ * RES0 bits, but don't take the actual RES0 bits or register
1355+ * existence into account -- we're not computing bits for the
1356+ * register itself.
1357+ */
1358+ return compute_res0_bits (kvm , r -> bit_feat_map , r -> bit_feat_map_sz ,
1359+ 0 , NEVER_FGU );
1360+ }
1361+
13581362static u64 compute_reg_fixed_bits (struct kvm * kvm ,
13591363 const struct reg_feat_map_desc * r ,
13601364 u64 * fixed_bits , unsigned long require ,
@@ -1370,40 +1374,29 @@ void compute_fgu(struct kvm *kvm, enum fgt_group_id fgt)
13701374
13711375 switch (fgt ) {
13721376 case HFGRTR_GROUP :
1373- val |= compute_reg_res0_bits (kvm , & hfgrtr_desc ,
1374- 0 , NEVER_FGU );
1375- val |= compute_reg_res0_bits (kvm , & hfgwtr_desc ,
1376- 0 , NEVER_FGU );
1377+ val |= compute_fgu_bits (kvm , & hfgrtr_desc );
1378+ val |= compute_fgu_bits (kvm , & hfgwtr_desc );
13771379 break ;
13781380 case HFGITR_GROUP :
1379- val |= compute_reg_res0_bits (kvm , & hfgitr_desc ,
1380- 0 , NEVER_FGU );
1381+ val |= compute_fgu_bits (kvm , & hfgitr_desc );
13811382 break ;
13821383 case HDFGRTR_GROUP :
1383- val |= compute_reg_res0_bits (kvm , & hdfgrtr_desc ,
1384- 0 , NEVER_FGU );
1385- val |= compute_reg_res0_bits (kvm , & hdfgwtr_desc ,
1386- 0 , NEVER_FGU );
1384+ val |= compute_fgu_bits (kvm , & hdfgrtr_desc );
1385+ val |= compute_fgu_bits (kvm , & hdfgwtr_desc );
13871386 break ;
13881387 case HAFGRTR_GROUP :
1389- val |= compute_reg_res0_bits (kvm , & hafgrtr_desc ,
1390- 0 , NEVER_FGU );
1388+ val |= compute_fgu_bits (kvm , & hafgrtr_desc );
13911389 break ;
13921390 case HFGRTR2_GROUP :
1393- val |= compute_reg_res0_bits (kvm , & hfgrtr2_desc ,
1394- 0 , NEVER_FGU );
1395- val |= compute_reg_res0_bits (kvm , & hfgwtr2_desc ,
1396- 0 , NEVER_FGU );
1391+ val |= compute_fgu_bits (kvm , & hfgrtr2_desc );
1392+ val |= compute_fgu_bits (kvm , & hfgwtr2_desc );
13971393 break ;
13981394 case HFGITR2_GROUP :
1399- val |= compute_reg_res0_bits (kvm , & hfgitr2_desc ,
1400- 0 , NEVER_FGU );
1395+ val |= compute_fgu_bits (kvm , & hfgitr2_desc );
14011396 break ;
14021397 case HDFGRTR2_GROUP :
1403- val |= compute_reg_res0_bits (kvm , & hdfgrtr2_desc ,
1404- 0 , NEVER_FGU );
1405- val |= compute_reg_res0_bits (kvm , & hdfgwtr2_desc ,
1406- 0 , NEVER_FGU );
1398+ val |= compute_fgu_bits (kvm , & hdfgrtr2_desc );
1399+ val |= compute_fgu_bits (kvm , & hdfgwtr2_desc );
14071400 break ;
14081401 default :
14091402 BUG ();
0 commit comments