Skip to content

Commit 980b8bc

Browse files
taosu-linuxsean-jc
authored andcommitted
KVM: selftests: x86: Prioritize getting max_gfn from GuestPhysBits
Use the max mappable GPA via GuestPhysBits advertised by KVM to calculate max_gfn. Currently some selftests (e.g. access_tracking_perf_test, dirty_log_test...) add RAM regions close to max_gfn, so guest may access GPA beyond its mappable range and cause infinite loop. Adjust max_gfn in vm_compute_max_gfn() since x86 selftests already overrides vm_compute_max_gfn() specifically to deal with goofy edge cases. Reported-by: Yi Lai <yi1.lai@intel.com> Signed-off-by: Tao Su <tao1.su@linux.intel.com> Tested-by: Yi Lai <yi1.lai@intel.com> Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> Link: https://lore.kernel.org/r/20240513014003.104593-1-tao1.su@linux.intel.com [sean: tweak name, add comment and sanity check] Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent d21b3c6 commit 980b8bc

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

tools/testing/selftests/kvm/include/x86_64/processor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ struct kvm_x86_cpu_property {
277277
#define X86_PROPERTY_MAX_EXT_LEAF KVM_X86_CPU_PROPERTY(0x80000000, 0, EAX, 0, 31)
278278
#define X86_PROPERTY_MAX_PHY_ADDR KVM_X86_CPU_PROPERTY(0x80000008, 0, EAX, 0, 7)
279279
#define X86_PROPERTY_MAX_VIRT_ADDR KVM_X86_CPU_PROPERTY(0x80000008, 0, EAX, 8, 15)
280+
#define X86_PROPERTY_GUEST_MAX_PHY_ADDR KVM_X86_CPU_PROPERTY(0x80000008, 0, EAX, 16, 23)
280281
#define X86_PROPERTY_SEV_C_BIT KVM_X86_CPU_PROPERTY(0x8000001F, 0, EBX, 0, 5)
281282
#define X86_PROPERTY_PHYS_ADDR_REDUCTION KVM_X86_CPU_PROPERTY(0x8000001F, 0, EBX, 6, 11)
282283

tools/testing/selftests/kvm/lib/x86_64/processor.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,9 +1247,20 @@ unsigned long vm_compute_max_gfn(struct kvm_vm *vm)
12471247
{
12481248
const unsigned long num_ht_pages = 12 << (30 - vm->page_shift); /* 12 GiB */
12491249
unsigned long ht_gfn, max_gfn, max_pfn;
1250-
uint8_t maxphyaddr;
1250+
uint8_t maxphyaddr, guest_maxphyaddr;
12511251

1252-
max_gfn = (1ULL << (vm->pa_bits - vm->page_shift)) - 1;
1252+
/*
1253+
* Use "guest MAXPHYADDR" from KVM if it's available. Guest MAXPHYADDR
1254+
* enumerates the max _mappable_ GPA, which can be less than the raw
1255+
* MAXPHYADDR, e.g. if MAXPHYADDR=52, KVM is using TDP, and the CPU
1256+
* doesn't support 5-level TDP.
1257+
*/
1258+
guest_maxphyaddr = kvm_cpu_property(X86_PROPERTY_GUEST_MAX_PHY_ADDR);
1259+
guest_maxphyaddr = guest_maxphyaddr ?: vm->pa_bits;
1260+
TEST_ASSERT(guest_maxphyaddr <= vm->pa_bits,
1261+
"Guest MAXPHYADDR should never be greater than raw MAXPHYADDR");
1262+
1263+
max_gfn = (1ULL << (guest_maxphyaddr - vm->page_shift)) - 1;
12531264

12541265
/* Avoid reserved HyperTransport region on AMD processors. */
12551266
if (!host_cpu_is_amd)

0 commit comments

Comments
 (0)