Skip to content

Commit 1446e33

Browse files
Ricardo KollerMarc Zyngier
authored andcommitted
KVM: selftests: Use the right memslot for code, page-tables, and data allocations
Now that kvm_vm allows specifying different memslots for code, page tables, and data, use the appropriate memslot when making allocations in common/libraty code. Change them accordingly: - code (allocated by lib/elf) use the CODE memslot - stacks, exception tables, and other core data pages (like the TSS in x86) use the DATA memslot - page tables and the PGD use the PT memslot - test data (anything allocated with vm_vaddr_alloc()) uses the TEST_DATA memslot No functional change intended. All allocators keep using memslot #0. Cc: Sean Christopherson <[email protected]> Cc: Andrew Jones <[email protected]> Signed-off-by: Ricardo Koller <[email protected]> Reviewed-by: Sean Christopherson <[email protected]> Reviewed-by: Andrew Jones <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 5485e82 commit 1446e33

File tree

7 files changed

+65
-40
lines changed

7 files changed

+65
-40
lines changed

tools/testing/selftests/kvm/include/kvm_util_base.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,11 @@ void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
407407
void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot);
408408
struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id);
409409
vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min);
410+
vm_vaddr_t __vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
411+
enum kvm_mem_region_type type);
410412
vm_vaddr_t vm_vaddr_alloc_pages(struct kvm_vm *vm, int nr_pages);
413+
vm_vaddr_t __vm_vaddr_alloc_page(struct kvm_vm *vm,
414+
enum kvm_mem_region_type type);
411415
vm_vaddr_t vm_vaddr_alloc_page(struct kvm_vm *vm);
412416

413417
void virt_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ void virt_arch_pgd_alloc(struct kvm_vm *vm)
8282
return;
8383

8484
vm->pgd = vm_phy_pages_alloc(vm, nr_pages,
85-
KVM_GUEST_PAGE_TABLE_MIN_PADDR, 0);
85+
KVM_GUEST_PAGE_TABLE_MIN_PADDR,
86+
vm->memslots[MEM_REGION_PT]);
8687
vm->pgd_created = true;
8788
}
8889

@@ -332,8 +333,9 @@ struct kvm_vcpu *aarch64_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
332333

333334
stack_size = vm->page_size == 4096 ? DEFAULT_STACK_PGS * vm->page_size :
334335
vm->page_size;
335-
stack_vaddr = vm_vaddr_alloc(vm, stack_size,
336-
DEFAULT_ARM64_GUEST_STACK_VADDR_MIN);
336+
stack_vaddr = __vm_vaddr_alloc(vm, stack_size,
337+
DEFAULT_ARM64_GUEST_STACK_VADDR_MIN,
338+
MEM_REGION_DATA);
337339

338340
aarch64_vcpu_setup(vcpu, init);
339341

@@ -438,8 +440,8 @@ void route_exception(struct ex_regs *regs, int vector)
438440

439441
void vm_init_descriptor_tables(struct kvm_vm *vm)
440442
{
441-
vm->handlers = vm_vaddr_alloc(vm, sizeof(struct handlers),
442-
vm->page_size);
443+
vm->handlers = __vm_vaddr_alloc(vm, sizeof(struct handlers),
444+
vm->page_size, MEM_REGION_DATA);
443445

444446
*(vm_vaddr_t *)addr_gva2hva(vm, (vm_vaddr_t)(&exception_handlers)) = vm->handlers;
445447
}

tools/testing/selftests/kvm/lib/elf.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ void kvm_vm_elf_load(struct kvm_vm *vm, const char *filename)
161161
seg_vend |= vm->page_size - 1;
162162
size_t seg_size = seg_vend - seg_vstart + 1;
163163

164-
vm_vaddr_t vaddr = vm_vaddr_alloc(vm, seg_size, seg_vstart);
164+
vm_vaddr_t vaddr = __vm_vaddr_alloc(vm, seg_size, seg_vstart,
165+
MEM_REGION_CODE);
165166
TEST_ASSERT(vaddr == seg_vstart, "Unable to allocate "
166167
"virtual memory for segment at requested min addr,\n"
167168
" segment idx: %u\n"

tools/testing/selftests/kvm/lib/kvm_util.c

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,32 +1226,15 @@ static vm_vaddr_t vm_vaddr_unused_gap(struct kvm_vm *vm, size_t sz,
12261226
return pgidx_start * vm->page_size;
12271227
}
12281228

1229-
/*
1230-
* VM Virtual Address Allocate
1231-
*
1232-
* Input Args:
1233-
* vm - Virtual Machine
1234-
* sz - Size in bytes
1235-
* vaddr_min - Minimum starting virtual address
1236-
*
1237-
* Output Args: None
1238-
*
1239-
* Return:
1240-
* Starting guest virtual address
1241-
*
1242-
* Allocates at least sz bytes within the virtual address space of the vm
1243-
* given by vm. The allocated bytes are mapped to a virtual address >=
1244-
* the address given by vaddr_min. Note that each allocation uses a
1245-
* a unique set of pages, with the minimum real allocation being at least
1246-
* a page.
1247-
*/
1248-
vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min)
1229+
vm_vaddr_t __vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
1230+
enum kvm_mem_region_type type)
12491231
{
12501232
uint64_t pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0);
12511233

12521234
virt_pgd_alloc(vm);
12531235
vm_paddr_t paddr = vm_phy_pages_alloc(vm, pages,
1254-
KVM_UTIL_MIN_PFN * vm->page_size, 0);
1236+
KVM_UTIL_MIN_PFN * vm->page_size,
1237+
vm->memslots[type]);
12551238

12561239
/*
12571240
* Find an unused range of virtual page addresses of at least
@@ -1272,6 +1255,30 @@ vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min)
12721255
return vaddr_start;
12731256
}
12741257

1258+
/*
1259+
* VM Virtual Address Allocate
1260+
*
1261+
* Input Args:
1262+
* vm - Virtual Machine
1263+
* sz - Size in bytes
1264+
* vaddr_min - Minimum starting virtual address
1265+
*
1266+
* Output Args: None
1267+
*
1268+
* Return:
1269+
* Starting guest virtual address
1270+
*
1271+
* Allocates at least sz bytes within the virtual address space of the vm
1272+
* given by vm. The allocated bytes are mapped to a virtual address >=
1273+
* the address given by vaddr_min. Note that each allocation uses a
1274+
* a unique set of pages, with the minimum real allocation being at least
1275+
* a page. The allocated physical space comes from the TEST_DATA memory region.
1276+
*/
1277+
vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min)
1278+
{
1279+
return __vm_vaddr_alloc(vm, sz, vaddr_min, MEM_REGION_TEST_DATA);
1280+
}
1281+
12751282
/*
12761283
* VM Virtual Address Allocate Pages
12771284
*
@@ -1291,6 +1298,11 @@ vm_vaddr_t vm_vaddr_alloc_pages(struct kvm_vm *vm, int nr_pages)
12911298
return vm_vaddr_alloc(vm, nr_pages * getpagesize(), KVM_UTIL_MIN_VADDR);
12921299
}
12931300

1301+
vm_vaddr_t __vm_vaddr_alloc_page(struct kvm_vm *vm, enum kvm_mem_region_type type)
1302+
{
1303+
return __vm_vaddr_alloc(vm, getpagesize(), KVM_UTIL_MIN_VADDR, type);
1304+
}
1305+
12941306
/*
12951307
* VM Virtual Address Allocate Page
12961308
*
@@ -1856,7 +1868,8 @@ vm_paddr_t vm_phy_page_alloc(struct kvm_vm *vm, vm_paddr_t paddr_min,
18561868

18571869
vm_paddr_t vm_alloc_page_table(struct kvm_vm *vm)
18581870
{
1859-
return vm_phy_page_alloc(vm, KVM_GUEST_PAGE_TABLE_MIN_PADDR, 0);
1871+
return vm_phy_page_alloc(vm, KVM_GUEST_PAGE_TABLE_MIN_PADDR,
1872+
vm->memslots[MEM_REGION_PT]);
18601873
}
18611874

18621875
/*

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ void virt_arch_pgd_alloc(struct kvm_vm *vm)
6161
return;
6262

6363
vm->pgd = vm_phy_pages_alloc(vm, nr_pages,
64-
KVM_GUEST_PAGE_TABLE_MIN_PADDR, 0);
64+
KVM_GUEST_PAGE_TABLE_MIN_PADDR,
65+
vm->memslots[MEM_REGION_PT]);
6566
vm->pgd_created = true;
6667
}
6768

@@ -288,8 +289,9 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
288289

289290
stack_size = vm->page_size == 4096 ? DEFAULT_STACK_PGS * vm->page_size :
290291
vm->page_size;
291-
stack_vaddr = vm_vaddr_alloc(vm, stack_size,
292-
DEFAULT_RISCV_GUEST_STACK_VADDR_MIN);
292+
stack_vaddr = __vm_vaddr_alloc(vm, stack_size,
293+
DEFAULT_RISCV_GUEST_STACK_VADDR_MIN,
294+
MEM_REGION_DATA);
293295

294296
vcpu = __vm_vcpu_add(vm, vcpu_id);
295297
riscv_vcpu_mmu_setup(vcpu);

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ void virt_arch_pgd_alloc(struct kvm_vm *vm)
2121
return;
2222

2323
paddr = vm_phy_pages_alloc(vm, PAGES_PER_REGION,
24-
KVM_GUEST_PAGE_TABLE_MIN_PADDR, 0);
24+
KVM_GUEST_PAGE_TABLE_MIN_PADDR,
25+
vm->memslots[MEM_REGION_PT]);
2526
memset(addr_gpa2hva(vm, paddr), 0xff, PAGES_PER_REGION * vm->page_size);
2627

2728
vm->pgd = paddr;
@@ -167,8 +168,9 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
167168
TEST_ASSERT(vm->page_size == 4096, "Unsupported page size: 0x%x",
168169
vm->page_size);
169170

170-
stack_vaddr = vm_vaddr_alloc(vm, stack_size,
171-
DEFAULT_GUEST_STACK_VADDR_MIN);
171+
stack_vaddr = __vm_vaddr_alloc(vm, stack_size,
172+
DEFAULT_GUEST_STACK_VADDR_MIN,
173+
MEM_REGION_DATA);
172174

173175
vcpu = __vm_vcpu_add(vm, vcpu_id);
174176

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
552552
static void kvm_setup_gdt(struct kvm_vm *vm, struct kvm_dtable *dt)
553553
{
554554
if (!vm->gdt)
555-
vm->gdt = vm_vaddr_alloc_page(vm);
555+
vm->gdt = __vm_vaddr_alloc_page(vm, MEM_REGION_DATA);
556556

557557
dt->base = vm->gdt;
558558
dt->limit = getpagesize();
@@ -562,7 +562,7 @@ static void kvm_setup_tss_64bit(struct kvm_vm *vm, struct kvm_segment *segp,
562562
int selector)
563563
{
564564
if (!vm->tss)
565-
vm->tss = vm_vaddr_alloc_page(vm);
565+
vm->tss = __vm_vaddr_alloc_page(vm, MEM_REGION_DATA);
566566

567567
memset(segp, 0, sizeof(*segp));
568568
segp->base = vm->tss;
@@ -647,8 +647,9 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
647647
vm_vaddr_t stack_vaddr;
648648
struct kvm_vcpu *vcpu;
649649

650-
stack_vaddr = vm_vaddr_alloc(vm, DEFAULT_STACK_PGS * getpagesize(),
651-
DEFAULT_GUEST_STACK_VADDR_MIN);
650+
stack_vaddr = __vm_vaddr_alloc(vm, DEFAULT_STACK_PGS * getpagesize(),
651+
DEFAULT_GUEST_STACK_VADDR_MIN,
652+
MEM_REGION_DATA);
652653

653654
vcpu = __vm_vcpu_add(vm, vcpu_id);
654655
vcpu_init_cpuid(vcpu, kvm_get_supported_cpuid());
@@ -1145,8 +1146,8 @@ void vm_init_descriptor_tables(struct kvm_vm *vm)
11451146
extern void *idt_handlers;
11461147
int i;
11471148

1148-
vm->idt = vm_vaddr_alloc_page(vm);
1149-
vm->handlers = vm_vaddr_alloc_page(vm);
1149+
vm->idt = __vm_vaddr_alloc_page(vm, MEM_REGION_DATA);
1150+
vm->handlers = __vm_vaddr_alloc_page(vm, MEM_REGION_DATA);
11501151
/* Handlers have the same address in both address spaces.*/
11511152
for (i = 0; i < NUM_INTERRUPTS; i++)
11521153
set_idt_entry(vm, i, (unsigned long)(&idt_handlers)[i], 0,

0 commit comments

Comments
 (0)