Skip to content

Commit a3c9200

Browse files
author
Marc Zyngier
committed
KVM: arm64: Introduce standalone FGU computing primitive
Computing the FGU bits is made oddly complicated, as we use the RES0 helper instead of using a specific abstraction. Introduce such an abstraction, which is going to make things significantly simpler in the future. Reviewed-by: Fuad Tabba <tabba@google.com> Tested-by: Fuad Tabba <tabba@google.com> Link: https://patch.msgid.link/20260202184329.2724080-4-maz@kernel.org Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent 4faf521 commit a3c9200

1 file changed

Lines changed: 25 additions & 32 deletions

File tree

arch/arm64/kvm/config.c

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,26 +1335,30 @@ static u64 compute_res0_bits(struct kvm *kvm,
13351335
static 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+
13581362
static 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

Comments
 (0)