Skip to content

Commit 07676c0

Browse files
committed
KVM: selftests: Move TDP mapping functions outside of vmx.c
Now that the functions are no longer VMX-specific, move them to processor.c. Do a minor comment tweak replacing 'EPT' with 'TDP'. No functional change intended. Signed-off-by: Yosry Ahmed <yosry.ahmed@linux.dev> Link: https://patch.msgid.link/20251230230150.4150236-15-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 508d1cc commit 07676c0

4 files changed

Lines changed: 57 additions & 74 deletions

File tree

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,10 @@ void __virt_pg_map(struct kvm_vm *vm, struct kvm_mmu *mmu, uint64_t vaddr,
14791479
void virt_map_level(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
14801480
uint64_t nr_bytes, int level);
14811481

1482+
void tdp_map(struct kvm_vm *vm, uint64_t nested_paddr, uint64_t paddr, uint64_t size);
1483+
void tdp_identity_map_default_memslots(struct kvm_vm *vm);
1484+
void tdp_identity_map_1g(struct kvm_vm *vm, uint64_t addr, uint64_t size);
1485+
14821486
/*
14831487
* Basic CPU control in CR0
14841488
*/

tools/testing/selftests/kvm/include/x86/vmx.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -557,9 +557,6 @@ bool load_vmcs(struct vmx_pages *vmx);
557557

558558
bool ept_1g_pages_supported(void);
559559

560-
void tdp_map(struct kvm_vm *vm, uint64_t nested_paddr, uint64_t paddr, uint64_t size);
561-
void tdp_identity_map_default_memslots(struct kvm_vm *vm);
562-
void tdp_identity_map_1g(struct kvm_vm *vm, uint64_t addr, uint64_t size);
563560
bool kvm_cpu_has_ept(void);
564561
void vm_enable_ept(struct kvm_vm *vm);
565562
void prepare_virtualize_apic_accesses(struct vmx_pages *vmx, struct kvm_vm *vm);

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,59 @@ void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
472472
}
473473
}
474474

475+
void __tdp_map(struct kvm_vm *vm, uint64_t nested_paddr, uint64_t paddr,
476+
uint64_t size, int level)
477+
{
478+
size_t page_size = PG_LEVEL_SIZE(level);
479+
size_t npages = size / page_size;
480+
481+
TEST_ASSERT(nested_paddr + size > nested_paddr, "Vaddr overflow");
482+
TEST_ASSERT(paddr + size > paddr, "Paddr overflow");
483+
484+
while (npages--) {
485+
__virt_pg_map(vm, &vm->stage2_mmu, nested_paddr, paddr, level);
486+
nested_paddr += page_size;
487+
paddr += page_size;
488+
}
489+
}
490+
491+
void tdp_map(struct kvm_vm *vm, uint64_t nested_paddr, uint64_t paddr,
492+
uint64_t size)
493+
{
494+
__tdp_map(vm, nested_paddr, paddr, size, PG_LEVEL_4K);
495+
}
496+
497+
/* Prepare an identity extended page table that maps all the
498+
* physical pages in VM.
499+
*/
500+
void tdp_identity_map_default_memslots(struct kvm_vm *vm)
501+
{
502+
uint32_t s, memslot = 0;
503+
sparsebit_idx_t i, last;
504+
struct userspace_mem_region *region = memslot2region(vm, memslot);
505+
506+
/* Only memslot 0 is mapped here, ensure it's the only one being used */
507+
for (s = 0; s < NR_MEM_REGIONS; s++)
508+
TEST_ASSERT_EQ(vm->memslots[s], 0);
509+
510+
i = (region->region.guest_phys_addr >> vm->page_shift) - 1;
511+
last = i + (region->region.memory_size >> vm->page_shift);
512+
for (;;) {
513+
i = sparsebit_next_clear(region->unused_phy_pages, i);
514+
if (i > last)
515+
break;
516+
517+
tdp_map(vm, (uint64_t)i << vm->page_shift,
518+
(uint64_t)i << vm->page_shift, 1 << vm->page_shift);
519+
}
520+
}
521+
522+
/* Identity map a region with 1GiB Pages. */
523+
void tdp_identity_map_1g(struct kvm_vm *vm, uint64_t addr, uint64_t size)
524+
{
525+
__tdp_map(vm, addr, addr, size, PG_LEVEL_1G);
526+
}
527+
475528
/*
476529
* Set Unusable Segment
477530
*

tools/testing/selftests/kvm/lib/x86/vmx.c

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -373,77 +373,6 @@ void prepare_vmcs(struct vmx_pages *vmx, void *guest_rip, void *guest_rsp)
373373
init_vmcs_guest_state(guest_rip, guest_rsp);
374374
}
375375

376-
/*
377-
* Map a range of EPT guest physical addresses to the VM's physical address
378-
*
379-
* Input Args:
380-
* vm - Virtual Machine
381-
* nested_paddr - Nested guest physical address to map
382-
* paddr - VM Physical Address
383-
* size - The size of the range to map
384-
* level - The level at which to map the range
385-
*
386-
* Output Args: None
387-
*
388-
* Return: None
389-
*
390-
* Within the VM given by vm, creates a nested guest translation for the
391-
* page range starting at nested_paddr to the page range starting at paddr.
392-
*/
393-
void __tdp_map(struct kvm_vm *vm, uint64_t nested_paddr, uint64_t paddr,
394-
uint64_t size, int level)
395-
{
396-
struct kvm_mmu *mmu = &vm->stage2_mmu;
397-
size_t page_size = PG_LEVEL_SIZE(level);
398-
size_t npages = size / page_size;
399-
400-
TEST_ASSERT(nested_paddr + size > nested_paddr, "Vaddr overflow");
401-
TEST_ASSERT(paddr + size > paddr, "Paddr overflow");
402-
403-
while (npages--) {
404-
__virt_pg_map(vm, mmu, nested_paddr, paddr, level);
405-
nested_paddr += page_size;
406-
paddr += page_size;
407-
}
408-
}
409-
410-
void tdp_map(struct kvm_vm *vm, uint64_t nested_paddr, uint64_t paddr,
411-
uint64_t size)
412-
{
413-
__tdp_map(vm, nested_paddr, paddr, size, PG_LEVEL_4K);
414-
}
415-
416-
/* Prepare an identity extended page table that maps all the
417-
* physical pages in VM.
418-
*/
419-
void tdp_identity_map_default_memslots(struct kvm_vm *vm)
420-
{
421-
uint32_t s, memslot = 0;
422-
sparsebit_idx_t i, last;
423-
struct userspace_mem_region *region = memslot2region(vm, memslot);
424-
425-
/* Only memslot 0 is mapped here, ensure it's the only one being used */
426-
for (s = 0; s < NR_MEM_REGIONS; s++)
427-
TEST_ASSERT_EQ(vm->memslots[s], 0);
428-
429-
i = (region->region.guest_phys_addr >> vm->page_shift) - 1;
430-
last = i + (region->region.memory_size >> vm->page_shift);
431-
for (;;) {
432-
i = sparsebit_next_clear(region->unused_phy_pages, i);
433-
if (i > last)
434-
break;
435-
436-
tdp_map(vm, (uint64_t)i << vm->page_shift,
437-
(uint64_t)i << vm->page_shift, 1 << vm->page_shift);
438-
}
439-
}
440-
441-
/* Identity map a region with 1GiB Pages. */
442-
void tdp_identity_map_1g(struct kvm_vm *vm, uint64_t addr, uint64_t size)
443-
{
444-
__tdp_map(vm, addr, addr, size, PG_LEVEL_1G);
445-
}
446-
447376
bool kvm_cpu_has_ept(void)
448377
{
449378
uint64_t ctrl;

0 commit comments

Comments
 (0)