Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

+25 -32
+25 -32
arch/arm64/kvm/config.c
··· 1335 1335 static u64 compute_reg_res0_bits(struct kvm *kvm, 1336 1336 const struct reg_feat_map_desc *r, 1337 1337 unsigned long require, unsigned long exclude) 1338 - 1339 1338 { 1340 1339 u64 res0; 1341 1340 1342 1341 res0 = compute_res0_bits(kvm, r->bit_feat_map, r->bit_feat_map_sz, 1343 1342 require, exclude); 1344 1343 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); 1354 1346 1355 1347 return res0; 1348 + } 1349 + 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); 1356 1360 } 1357 1361 1358 1362 static u64 compute_reg_fixed_bits(struct kvm *kvm, ··· 1374 1370 1375 1371 switch (fgt) { 1376 1372 case HFGRTR_GROUP: 1377 - val |= compute_reg_res0_bits(kvm, &hfgrtr_desc, 1378 - 0, NEVER_FGU); 1379 - val |= compute_reg_res0_bits(kvm, &hfgwtr_desc, 1380 - 0, NEVER_FGU); 1373 + val |= compute_fgu_bits(kvm, &hfgrtr_desc); 1374 + val |= compute_fgu_bits(kvm, &hfgwtr_desc); 1381 1375 break; 1382 1376 case HFGITR_GROUP: 1383 - val |= compute_reg_res0_bits(kvm, &hfgitr_desc, 1384 - 0, NEVER_FGU); 1377 + val |= compute_fgu_bits(kvm, &hfgitr_desc); 1385 1378 break; 1386 1379 case HDFGRTR_GROUP: 1387 - val |= compute_reg_res0_bits(kvm, &hdfgrtr_desc, 1388 - 0, NEVER_FGU); 1389 - val |= compute_reg_res0_bits(kvm, &hdfgwtr_desc, 1390 - 0, NEVER_FGU); 1380 + val |= compute_fgu_bits(kvm, &hdfgrtr_desc); 1381 + val |= compute_fgu_bits(kvm, &hdfgwtr_desc); 1391 1382 break; 1392 1383 case HAFGRTR_GROUP: 1393 - val |= compute_reg_res0_bits(kvm, &hafgrtr_desc, 1394 - 0, NEVER_FGU); 1384 + val |= compute_fgu_bits(kvm, &hafgrtr_desc); 1395 1385 break; 1396 1386 case HFGRTR2_GROUP: 1397 - val |= compute_reg_res0_bits(kvm, &hfgrtr2_desc, 1398 - 0, NEVER_FGU); 1399 - val |= compute_reg_res0_bits(kvm, &hfgwtr2_desc, 1400 - 0, NEVER_FGU); 1387 + val |= compute_fgu_bits(kvm, &hfgrtr2_desc); 1388 + val |= compute_fgu_bits(kvm, &hfgwtr2_desc); 1401 1389 break; 1402 1390 case HFGITR2_GROUP: 1403 - val |= compute_reg_res0_bits(kvm, &hfgitr2_desc, 1404 - 0, NEVER_FGU); 1391 + val |= compute_fgu_bits(kvm, &hfgitr2_desc); 1405 1392 break; 1406 1393 case HDFGRTR2_GROUP: 1407 - val |= compute_reg_res0_bits(kvm, &hdfgrtr2_desc, 1408 - 0, NEVER_FGU); 1409 - val |= compute_reg_res0_bits(kvm, &hdfgwtr2_desc, 1410 - 0, NEVER_FGU); 1394 + val |= compute_fgu_bits(kvm, &hdfgrtr2_desc); 1395 + val |= compute_fgu_bits(kvm, &hdfgwtr2_desc); 1411 1396 break; 1412 1397 default: 1413 1398 BUG();