1 /*
2  * tools/testing/selftests/kvm/lib/kvm_util.c
3  *
4  * Copyright (C) 2018, Google LLC.
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2.
7  */
8 
9 #include "test_util.h"
10 #include "kvm_util.h"
11 #include "kvm_util_internal.h"
12 
13 #include <assert.h>
14 #include <sys/mman.h>
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <linux/kernel.h>
18 
19 #define KVM_DEV_PATH "/dev/kvm"
20 
21 #define KVM_UTIL_PGS_PER_HUGEPG 512
22 #define KVM_UTIL_MIN_PADDR      0x2000
23 
24 /* Aligns x up to the next multiple of size. Size must be a power of 2. */
align(void * x,size_t size)25 static void *align(void *x, size_t size)
26 {
27 	size_t mask = size - 1;
28 	TEST_ASSERT(size != 0 && !(size & (size - 1)),
29 		    "size not a power of 2: %lu", size);
30 	return (void *) (((size_t) x + mask) & ~mask);
31 }
32 
33 /* Capability
34  *
35  * Input Args:
36  *   cap - Capability
37  *
38  * Output Args: None
39  *
40  * Return:
41  *   On success, the Value corresponding to the capability (KVM_CAP_*)
42  *   specified by the value of cap.  On failure a TEST_ASSERT failure
43  *   is produced.
44  *
45  * Looks up and returns the value corresponding to the capability
46  * (KVM_CAP_*) given by cap.
47  */
kvm_check_cap(long cap)48 int kvm_check_cap(long cap)
49 {
50 	int ret;
51 	int kvm_fd;
52 
53 	kvm_fd = open(KVM_DEV_PATH, O_RDONLY);
54 	if (kvm_fd < 0)
55 		exit(KSFT_SKIP);
56 
57 	ret = ioctl(kvm_fd, KVM_CHECK_EXTENSION, cap);
58 	TEST_ASSERT(ret != -1, "KVM_CHECK_EXTENSION IOCTL failed,\n"
59 		"  rc: %i errno: %i", ret, errno);
60 
61 	close(kvm_fd);
62 
63 	return ret;
64 }
65 
66 /* VM Enable Capability
67  *
68  * Input Args:
69  *   vm - Virtual Machine
70  *   cap - Capability
71  *
72  * Output Args: None
73  *
74  * Return: On success, 0. On failure a TEST_ASSERT failure is produced.
75  *
76  * Enables a capability (KVM_CAP_*) on the VM.
77  */
vm_enable_cap(struct kvm_vm * vm,struct kvm_enable_cap * cap)78 int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap)
79 {
80 	int ret;
81 
82 	ret = ioctl(vm->fd, KVM_ENABLE_CAP, cap);
83 	TEST_ASSERT(ret == 0, "KVM_ENABLE_CAP IOCTL failed,\n"
84 		"  rc: %i errno: %i", ret, errno);
85 
86 	return ret;
87 }
88 
vm_open(struct kvm_vm * vm,int perm)89 static void vm_open(struct kvm_vm *vm, int perm)
90 {
91 	vm->kvm_fd = open(KVM_DEV_PATH, perm);
92 	if (vm->kvm_fd < 0)
93 		exit(KSFT_SKIP);
94 
95 	/* Create VM. */
96 	vm->fd = ioctl(vm->kvm_fd, KVM_CREATE_VM, NULL);
97 	TEST_ASSERT(vm->fd >= 0, "KVM_CREATE_VM ioctl failed, "
98 		"rc: %i errno: %i", vm->fd, errno);
99 }
100 
101 /* VM Create
102  *
103  * Input Args:
104  *   mode - VM Mode (e.g. VM_MODE_FLAT48PG)
105  *   phy_pages - Physical memory pages
106  *   perm - permission
107  *
108  * Output Args: None
109  *
110  * Return:
111  *   Pointer to opaque structure that describes the created VM.
112  *
113  * Creates a VM with the mode specified by mode (e.g. VM_MODE_FLAT48PG).
114  * When phy_pages is non-zero, a memory region of phy_pages physical pages
115  * is created and mapped starting at guest physical address 0.  The file
116  * descriptor to control the created VM is created with the permissions
117  * given by perm (e.g. O_RDWR).
118  */
vm_create(enum vm_guest_mode mode,uint64_t phy_pages,int perm)119 struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
120 {
121 	struct kvm_vm *vm;
122 	int kvm_fd;
123 
124 	/* Allocate memory. */
125 	vm = calloc(1, sizeof(*vm));
126 	TEST_ASSERT(vm != NULL, "Insufficent Memory");
127 
128 	vm->mode = mode;
129 	vm_open(vm, perm);
130 
131 	/* Setup mode specific traits. */
132 	switch (vm->mode) {
133 	case VM_MODE_FLAT48PG:
134 		vm->page_size = 0x1000;
135 		vm->page_shift = 12;
136 
137 		/* Limit to 48-bit canonical virtual addresses. */
138 		vm->vpages_valid = sparsebit_alloc();
139 		sparsebit_set_num(vm->vpages_valid,
140 			0, (1ULL << (48 - 1)) >> vm->page_shift);
141 		sparsebit_set_num(vm->vpages_valid,
142 			(~((1ULL << (48 - 1)) - 1)) >> vm->page_shift,
143 			(1ULL << (48 - 1)) >> vm->page_shift);
144 
145 		/* Limit physical addresses to 52-bits. */
146 		vm->max_gfn = ((1ULL << 52) >> vm->page_shift) - 1;
147 		break;
148 
149 	default:
150 		TEST_ASSERT(false, "Unknown guest mode, mode: 0x%x", mode);
151 	}
152 
153 	/* Allocate and setup memory for guest. */
154 	vm->vpages_mapped = sparsebit_alloc();
155 	if (phy_pages != 0)
156 		vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
157 					    0, 0, phy_pages, 0);
158 
159 	return vm;
160 }
161 
162 /* VM Restart
163  *
164  * Input Args:
165  *   vm - VM that has been released before
166  *   perm - permission
167  *
168  * Output Args: None
169  *
170  * Reopens the file descriptors associated to the VM and reinstates the
171  * global state, such as the irqchip and the memory regions that are mapped
172  * into the guest.
173  */
kvm_vm_restart(struct kvm_vm * vmp,int perm)174 void kvm_vm_restart(struct kvm_vm *vmp, int perm)
175 {
176 	struct userspace_mem_region *region;
177 
178 	vm_open(vmp, perm);
179 	if (vmp->has_irqchip)
180 		vm_create_irqchip(vmp);
181 
182 	for (region = vmp->userspace_mem_region_head; region;
183 		region = region->next) {
184 		int ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION, &region->region);
185 		TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n"
186 			    "  rc: %i errno: %i\n"
187 			    "  slot: %u flags: 0x%x\n"
188 			    "  guest_phys_addr: 0x%lx size: 0x%lx",
189 			    ret, errno, region->region.slot, region->region.flags,
190 			    region->region.guest_phys_addr,
191 			    region->region.memory_size);
192 	}
193 }
194 
kvm_vm_get_dirty_log(struct kvm_vm * vm,int slot,void * log)195 void kvm_vm_get_dirty_log(struct kvm_vm *vm, int slot, void *log)
196 {
197 	struct kvm_dirty_log args = { .dirty_bitmap = log, .slot = slot };
198 	int ret;
199 
200 	ret = ioctl(vm->fd, KVM_GET_DIRTY_LOG, &args);
201 	TEST_ASSERT(ret == 0, "%s: KVM_GET_DIRTY_LOG failed: %s",
202 		    strerror(-ret));
203 }
204 
205 /* Userspace Memory Region Find
206  *
207  * Input Args:
208  *   vm - Virtual Machine
209  *   start - Starting VM physical address
210  *   end - Ending VM physical address, inclusive.
211  *
212  * Output Args: None
213  *
214  * Return:
215  *   Pointer to overlapping region, NULL if no such region.
216  *
217  * Searches for a region with any physical memory that overlaps with
218  * any portion of the guest physical addresses from start to end
219  * inclusive.  If multiple overlapping regions exist, a pointer to any
220  * of the regions is returned.  Null is returned only when no overlapping
221  * region exists.
222  */
userspace_mem_region_find(struct kvm_vm * vm,uint64_t start,uint64_t end)223 static struct userspace_mem_region *userspace_mem_region_find(
224 	struct kvm_vm *vm, uint64_t start, uint64_t end)
225 {
226 	struct userspace_mem_region *region;
227 
228 	for (region = vm->userspace_mem_region_head; region;
229 		region = region->next) {
230 		uint64_t existing_start = region->region.guest_phys_addr;
231 		uint64_t existing_end = region->region.guest_phys_addr
232 			+ region->region.memory_size - 1;
233 		if (start <= existing_end && end >= existing_start)
234 			return region;
235 	}
236 
237 	return NULL;
238 }
239 
240 /* KVM Userspace Memory Region Find
241  *
242  * Input Args:
243  *   vm - Virtual Machine
244  *   start - Starting VM physical address
245  *   end - Ending VM physical address, inclusive.
246  *
247  * Output Args: None
248  *
249  * Return:
250  *   Pointer to overlapping region, NULL if no such region.
251  *
252  * Public interface to userspace_mem_region_find. Allows tests to look up
253  * the memslot datastructure for a given range of guest physical memory.
254  */
255 struct kvm_userspace_memory_region *
kvm_userspace_memory_region_find(struct kvm_vm * vm,uint64_t start,uint64_t end)256 kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start,
257 				 uint64_t end)
258 {
259 	struct userspace_mem_region *region;
260 
261 	region = userspace_mem_region_find(vm, start, end);
262 	if (!region)
263 		return NULL;
264 
265 	return &region->region;
266 }
267 
268 /* VCPU Find
269  *
270  * Input Args:
271  *   vm - Virtual Machine
272  *   vcpuid - VCPU ID
273  *
274  * Output Args: None
275  *
276  * Return:
277  *   Pointer to VCPU structure
278  *
279  * Locates a vcpu structure that describes the VCPU specified by vcpuid and
280  * returns a pointer to it.  Returns NULL if the VM doesn't contain a VCPU
281  * for the specified vcpuid.
282  */
vcpu_find(struct kvm_vm * vm,uint32_t vcpuid)283 struct vcpu *vcpu_find(struct kvm_vm *vm,
284 	uint32_t vcpuid)
285 {
286 	struct vcpu *vcpup;
287 
288 	for (vcpup = vm->vcpu_head; vcpup; vcpup = vcpup->next) {
289 		if (vcpup->id == vcpuid)
290 			return vcpup;
291 	}
292 
293 	return NULL;
294 }
295 
296 /* VM VCPU Remove
297  *
298  * Input Args:
299  *   vm - Virtual Machine
300  *   vcpuid - VCPU ID
301  *
302  * Output Args: None
303  *
304  * Return: None, TEST_ASSERT failures for all error conditions
305  *
306  * Within the VM specified by vm, removes the VCPU given by vcpuid.
307  */
vm_vcpu_rm(struct kvm_vm * vm,uint32_t vcpuid)308 static void vm_vcpu_rm(struct kvm_vm *vm, uint32_t vcpuid)
309 {
310 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
311 	int ret;
312 
313 	ret = munmap(vcpu->state, sizeof(*vcpu->state));
314 	TEST_ASSERT(ret == 0, "munmap of VCPU fd failed, rc: %i "
315 		"errno: %i", ret, errno);
316 	close(vcpu->fd);
317 	TEST_ASSERT(ret == 0, "Close of VCPU fd failed, rc: %i "
318 		"errno: %i", ret, errno);
319 
320 	if (vcpu->next)
321 		vcpu->next->prev = vcpu->prev;
322 	if (vcpu->prev)
323 		vcpu->prev->next = vcpu->next;
324 	else
325 		vm->vcpu_head = vcpu->next;
326 	free(vcpu);
327 }
328 
kvm_vm_release(struct kvm_vm * vmp)329 void kvm_vm_release(struct kvm_vm *vmp)
330 {
331 	int ret;
332 
333 	/* Free VCPUs. */
334 	while (vmp->vcpu_head)
335 		vm_vcpu_rm(vmp, vmp->vcpu_head->id);
336 
337 	/* Close file descriptor for the VM. */
338 	ret = close(vmp->fd);
339 	TEST_ASSERT(ret == 0, "Close of vm fd failed,\n"
340 		"  vmp->fd: %i rc: %i errno: %i", vmp->fd, ret, errno);
341 
342 	close(vmp->kvm_fd);
343 	TEST_ASSERT(ret == 0, "Close of /dev/kvm fd failed,\n"
344 		"  vmp->kvm_fd: %i rc: %i errno: %i", vmp->kvm_fd, ret, errno);
345 }
346 
347 /* Destroys and frees the VM pointed to by vmp.
348  */
kvm_vm_free(struct kvm_vm * vmp)349 void kvm_vm_free(struct kvm_vm *vmp)
350 {
351 	int ret;
352 
353 	if (vmp == NULL)
354 		return;
355 
356 	/* Free userspace_mem_regions. */
357 	while (vmp->userspace_mem_region_head) {
358 		struct userspace_mem_region *region
359 			= vmp->userspace_mem_region_head;
360 
361 		region->region.memory_size = 0;
362 		ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION,
363 			&region->region);
364 		TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed, "
365 			"rc: %i errno: %i", ret, errno);
366 
367 		vmp->userspace_mem_region_head = region->next;
368 		sparsebit_free(&region->unused_phy_pages);
369 		ret = munmap(region->mmap_start, region->mmap_size);
370 		TEST_ASSERT(ret == 0, "munmap failed, rc: %i errno: %i",
371 			    ret, errno);
372 
373 		free(region);
374 	}
375 
376 	/* Free sparsebit arrays. */
377 	sparsebit_free(&vmp->vpages_valid);
378 	sparsebit_free(&vmp->vpages_mapped);
379 
380 	kvm_vm_release(vmp);
381 
382 	/* Free the structure describing the VM. */
383 	free(vmp);
384 }
385 
386 /* Memory Compare, host virtual to guest virtual
387  *
388  * Input Args:
389  *   hva - Starting host virtual address
390  *   vm - Virtual Machine
391  *   gva - Starting guest virtual address
392  *   len - number of bytes to compare
393  *
394  * Output Args: None
395  *
396  * Input/Output Args: None
397  *
398  * Return:
399  *   Returns 0 if the bytes starting at hva for a length of len
400  *   are equal the guest virtual bytes starting at gva.  Returns
401  *   a value < 0, if bytes at hva are less than those at gva.
402  *   Otherwise a value > 0 is returned.
403  *
404  * Compares the bytes starting at the host virtual address hva, for
405  * a length of len, to the guest bytes starting at the guest virtual
406  * address given by gva.
407  */
kvm_memcmp_hva_gva(void * hva,struct kvm_vm * vm,vm_vaddr_t gva,size_t len)408 int kvm_memcmp_hva_gva(void *hva,
409 	struct kvm_vm *vm, vm_vaddr_t gva, size_t len)
410 {
411 	size_t amt;
412 
413 	/* Compare a batch of bytes until either a match is found
414 	 * or all the bytes have been compared.
415 	 */
416 	for (uintptr_t offset = 0; offset < len; offset += amt) {
417 		uintptr_t ptr1 = (uintptr_t)hva + offset;
418 
419 		/* Determine host address for guest virtual address
420 		 * at offset.
421 		 */
422 		uintptr_t ptr2 = (uintptr_t)addr_gva2hva(vm, gva + offset);
423 
424 		/* Determine amount to compare on this pass.
425 		 * Don't allow the comparsion to cross a page boundary.
426 		 */
427 		amt = len - offset;
428 		if ((ptr1 >> vm->page_shift) != ((ptr1 + amt) >> vm->page_shift))
429 			amt = vm->page_size - (ptr1 % vm->page_size);
430 		if ((ptr2 >> vm->page_shift) != ((ptr2 + amt) >> vm->page_shift))
431 			amt = vm->page_size - (ptr2 % vm->page_size);
432 
433 		assert((ptr1 >> vm->page_shift) == ((ptr1 + amt - 1) >> vm->page_shift));
434 		assert((ptr2 >> vm->page_shift) == ((ptr2 + amt - 1) >> vm->page_shift));
435 
436 		/* Perform the comparison.  If there is a difference
437 		 * return that result to the caller, otherwise need
438 		 * to continue on looking for a mismatch.
439 		 */
440 		int ret = memcmp((void *)ptr1, (void *)ptr2, amt);
441 		if (ret != 0)
442 			return ret;
443 	}
444 
445 	/* No mismatch found.  Let the caller know the two memory
446 	 * areas are equal.
447 	 */
448 	return 0;
449 }
450 
451 /* Allocate an instance of struct kvm_cpuid2
452  *
453  * Input Args: None
454  *
455  * Output Args: None
456  *
457  * Return: A pointer to the allocated struct. The caller is responsible
458  * for freeing this struct.
459  *
460  * Since kvm_cpuid2 uses a 0-length array to allow a the size of the
461  * array to be decided at allocation time, allocation is slightly
462  * complicated. This function uses a reasonable default length for
463  * the array and performs the appropriate allocation.
464  */
allocate_kvm_cpuid2(void)465 static struct kvm_cpuid2 *allocate_kvm_cpuid2(void)
466 {
467 	struct kvm_cpuid2 *cpuid;
468 	int nent = 100;
469 	size_t size;
470 
471 	size = sizeof(*cpuid);
472 	size += nent * sizeof(struct kvm_cpuid_entry2);
473 	cpuid = malloc(size);
474 	if (!cpuid) {
475 		perror("malloc");
476 		abort();
477 	}
478 
479 	cpuid->nent = nent;
480 
481 	return cpuid;
482 }
483 
484 /* KVM Supported CPUID Get
485  *
486  * Input Args: None
487  *
488  * Output Args:
489  *
490  * Return: The supported KVM CPUID
491  *
492  * Get the guest CPUID supported by KVM.
493  */
kvm_get_supported_cpuid(void)494 struct kvm_cpuid2 *kvm_get_supported_cpuid(void)
495 {
496 	static struct kvm_cpuid2 *cpuid;
497 	int ret;
498 	int kvm_fd;
499 
500 	if (cpuid)
501 		return cpuid;
502 
503 	cpuid = allocate_kvm_cpuid2();
504 	kvm_fd = open(KVM_DEV_PATH, O_RDONLY);
505 	if (kvm_fd < 0)
506 		exit(KSFT_SKIP);
507 
508 	ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_CPUID, cpuid);
509 	TEST_ASSERT(ret == 0, "KVM_GET_SUPPORTED_CPUID failed %d %d\n",
510 		    ret, errno);
511 
512 	close(kvm_fd);
513 	return cpuid;
514 }
515 
516 /* Locate a cpuid entry.
517  *
518  * Input Args:
519  *   cpuid: The cpuid.
520  *   function: The function of the cpuid entry to find.
521  *
522  * Output Args: None
523  *
524  * Return: A pointer to the cpuid entry. Never returns NULL.
525  */
526 struct kvm_cpuid_entry2 *
kvm_get_supported_cpuid_index(uint32_t function,uint32_t index)527 kvm_get_supported_cpuid_index(uint32_t function, uint32_t index)
528 {
529 	struct kvm_cpuid2 *cpuid;
530 	struct kvm_cpuid_entry2 *entry = NULL;
531 	int i;
532 
533 	cpuid = kvm_get_supported_cpuid();
534 	for (i = 0; i < cpuid->nent; i++) {
535 		if (cpuid->entries[i].function == function &&
536 		    cpuid->entries[i].index == index) {
537 			entry = &cpuid->entries[i];
538 			break;
539 		}
540 	}
541 
542 	TEST_ASSERT(entry, "Guest CPUID entry not found: (EAX=%x, ECX=%x).",
543 		    function, index);
544 	return entry;
545 }
546 
547 /* VM Userspace Memory Region Add
548  *
549  * Input Args:
550  *   vm - Virtual Machine
551  *   backing_src - Storage source for this region.
552  *                 NULL to use anonymous memory.
553  *   guest_paddr - Starting guest physical address
554  *   slot - KVM region slot
555  *   npages - Number of physical pages
556  *   flags - KVM memory region flags (e.g. KVM_MEM_LOG_DIRTY_PAGES)
557  *
558  * Output Args: None
559  *
560  * Return: None
561  *
562  * Allocates a memory area of the number of pages specified by npages
563  * and maps it to the VM specified by vm, at a starting physical address
564  * given by guest_paddr.  The region is created with a KVM region slot
565  * given by slot, which must be unique and < KVM_MEM_SLOTS_NUM.  The
566  * region is created with the flags given by flags.
567  */
vm_userspace_mem_region_add(struct kvm_vm * vm,enum vm_mem_backing_src_type src_type,uint64_t guest_paddr,uint32_t slot,uint64_t npages,uint32_t flags)568 void vm_userspace_mem_region_add(struct kvm_vm *vm,
569 	enum vm_mem_backing_src_type src_type,
570 	uint64_t guest_paddr, uint32_t slot, uint64_t npages,
571 	uint32_t flags)
572 {
573 	int ret;
574 	unsigned long pmem_size = 0;
575 	struct userspace_mem_region *region;
576 	size_t huge_page_size = KVM_UTIL_PGS_PER_HUGEPG * vm->page_size;
577 
578 	TEST_ASSERT((guest_paddr % vm->page_size) == 0, "Guest physical "
579 		"address not on a page boundary.\n"
580 		"  guest_paddr: 0x%lx vm->page_size: 0x%x",
581 		guest_paddr, vm->page_size);
582 	TEST_ASSERT((((guest_paddr >> vm->page_shift) + npages) - 1)
583 		<= vm->max_gfn, "Physical range beyond maximum "
584 		"supported physical address,\n"
585 		"  guest_paddr: 0x%lx npages: 0x%lx\n"
586 		"  vm->max_gfn: 0x%lx vm->page_size: 0x%x",
587 		guest_paddr, npages, vm->max_gfn, vm->page_size);
588 
589 	/* Confirm a mem region with an overlapping address doesn't
590 	 * already exist.
591 	 */
592 	region = (struct userspace_mem_region *) userspace_mem_region_find(
593 		vm, guest_paddr, guest_paddr + npages * vm->page_size);
594 	if (region != NULL)
595 		TEST_ASSERT(false, "overlapping userspace_mem_region already "
596 			"exists\n"
597 			"  requested guest_paddr: 0x%lx npages: 0x%lx "
598 			"page_size: 0x%x\n"
599 			"  existing guest_paddr: 0x%lx size: 0x%lx",
600 			guest_paddr, npages, vm->page_size,
601 			(uint64_t) region->region.guest_phys_addr,
602 			(uint64_t) region->region.memory_size);
603 
604 	/* Confirm no region with the requested slot already exists. */
605 	for (region = vm->userspace_mem_region_head; region;
606 		region = region->next) {
607 		if (region->region.slot == slot)
608 			break;
609 		if ((guest_paddr <= (region->region.guest_phys_addr
610 				+ region->region.memory_size))
611 			&& ((guest_paddr + npages * vm->page_size)
612 				>= region->region.guest_phys_addr))
613 			break;
614 	}
615 	if (region != NULL)
616 		TEST_ASSERT(false, "A mem region with the requested slot "
617 			"or overlapping physical memory range already exists.\n"
618 			"  requested slot: %u paddr: 0x%lx npages: 0x%lx\n"
619 			"  existing slot: %u paddr: 0x%lx size: 0x%lx",
620 			slot, guest_paddr, npages,
621 			region->region.slot,
622 			(uint64_t) region->region.guest_phys_addr,
623 			(uint64_t) region->region.memory_size);
624 
625 	/* Allocate and initialize new mem region structure. */
626 	region = calloc(1, sizeof(*region));
627 	TEST_ASSERT(region != NULL, "Insufficient Memory");
628 	region->mmap_size = npages * vm->page_size;
629 
630 	/* Enough memory to align up to a huge page. */
631 	if (src_type == VM_MEM_SRC_ANONYMOUS_THP)
632 		region->mmap_size += huge_page_size;
633 	region->mmap_start = mmap(NULL, region->mmap_size,
634 				  PROT_READ | PROT_WRITE,
635 				  MAP_PRIVATE | MAP_ANONYMOUS
636 				  | (src_type == VM_MEM_SRC_ANONYMOUS_HUGETLB ? MAP_HUGETLB : 0),
637 				  -1, 0);
638 	TEST_ASSERT(region->mmap_start != MAP_FAILED,
639 		    "test_malloc failed, mmap_start: %p errno: %i",
640 		    region->mmap_start, errno);
641 
642 	/* Align THP allocation up to start of a huge page. */
643 	region->host_mem = align(region->mmap_start,
644 				 src_type == VM_MEM_SRC_ANONYMOUS_THP ?  huge_page_size : 1);
645 
646 	/* As needed perform madvise */
647 	if (src_type == VM_MEM_SRC_ANONYMOUS || src_type == VM_MEM_SRC_ANONYMOUS_THP) {
648 		ret = madvise(region->host_mem, npages * vm->page_size,
649 			     src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE);
650 		TEST_ASSERT(ret == 0, "madvise failed,\n"
651 			    "  addr: %p\n"
652 			    "  length: 0x%lx\n"
653 			    "  src_type: %x",
654 			    region->host_mem, npages * vm->page_size, src_type);
655 	}
656 
657 	region->unused_phy_pages = sparsebit_alloc();
658 	sparsebit_set_num(region->unused_phy_pages,
659 		guest_paddr >> vm->page_shift, npages);
660 	region->region.slot = slot;
661 	region->region.flags = flags;
662 	region->region.guest_phys_addr = guest_paddr;
663 	region->region.memory_size = npages * vm->page_size;
664 	region->region.userspace_addr = (uintptr_t) region->host_mem;
665 	ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, &region->region);
666 	TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n"
667 		"  rc: %i errno: %i\n"
668 		"  slot: %u flags: 0x%x\n"
669 		"  guest_phys_addr: 0x%lx size: 0x%lx",
670 		ret, errno, slot, flags,
671 		guest_paddr, (uint64_t) region->region.memory_size);
672 
673 	/* Add to linked-list of memory regions. */
674 	if (vm->userspace_mem_region_head)
675 		vm->userspace_mem_region_head->prev = region;
676 	region->next = vm->userspace_mem_region_head;
677 	vm->userspace_mem_region_head = region;
678 }
679 
680 /* Memslot to region
681  *
682  * Input Args:
683  *   vm - Virtual Machine
684  *   memslot - KVM memory slot ID
685  *
686  * Output Args: None
687  *
688  * Return:
689  *   Pointer to memory region structure that describe memory region
690  *   using kvm memory slot ID given by memslot.  TEST_ASSERT failure
691  *   on error (e.g. currently no memory region using memslot as a KVM
692  *   memory slot ID).
693  */
memslot2region(struct kvm_vm * vm,uint32_t memslot)694 static struct userspace_mem_region *memslot2region(struct kvm_vm *vm,
695 	uint32_t memslot)
696 {
697 	struct userspace_mem_region *region;
698 
699 	for (region = vm->userspace_mem_region_head; region;
700 		region = region->next) {
701 		if (region->region.slot == memslot)
702 			break;
703 	}
704 	if (region == NULL) {
705 		fprintf(stderr, "No mem region with the requested slot found,\n"
706 			"  requested slot: %u\n", memslot);
707 		fputs("---- vm dump ----\n", stderr);
708 		vm_dump(stderr, vm, 2);
709 		TEST_ASSERT(false, "Mem region not found");
710 	}
711 
712 	return region;
713 }
714 
715 /* VM Memory Region Flags Set
716  *
717  * Input Args:
718  *   vm - Virtual Machine
719  *   flags - Starting guest physical address
720  *
721  * Output Args: None
722  *
723  * Return: None
724  *
725  * Sets the flags of the memory region specified by the value of slot,
726  * to the values given by flags.
727  */
vm_mem_region_set_flags(struct kvm_vm * vm,uint32_t slot,uint32_t flags)728 void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags)
729 {
730 	int ret;
731 	struct userspace_mem_region *region;
732 
733 	/* Locate memory region. */
734 	region = memslot2region(vm, slot);
735 
736 	region->region.flags = flags;
737 
738 	ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, &region->region);
739 
740 	TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n"
741 		"  rc: %i errno: %i slot: %u flags: 0x%x",
742 		ret, errno, slot, flags);
743 }
744 
745 /* VCPU mmap Size
746  *
747  * Input Args: None
748  *
749  * Output Args: None
750  *
751  * Return:
752  *   Size of VCPU state
753  *
754  * Returns the size of the structure pointed to by the return value
755  * of vcpu_state().
756  */
vcpu_mmap_sz(void)757 static int vcpu_mmap_sz(void)
758 {
759 	int dev_fd, ret;
760 
761 	dev_fd = open(KVM_DEV_PATH, O_RDONLY);
762 	if (dev_fd < 0)
763 		exit(KSFT_SKIP);
764 
765 	ret = ioctl(dev_fd, KVM_GET_VCPU_MMAP_SIZE, NULL);
766 	TEST_ASSERT(ret >= sizeof(struct kvm_run),
767 		"%s KVM_GET_VCPU_MMAP_SIZE ioctl failed, rc: %i errno: %i",
768 		__func__, ret, errno);
769 
770 	close(dev_fd);
771 
772 	return ret;
773 }
774 
775 /* VM VCPU Add
776  *
777  * Input Args:
778  *   vm - Virtual Machine
779  *   vcpuid - VCPU ID
780  *
781  * Output Args: None
782  *
783  * Return: None
784  *
785  * Creates and adds to the VM specified by vm and virtual CPU with
786  * the ID given by vcpuid.
787  */
vm_vcpu_add(struct kvm_vm * vm,uint32_t vcpuid,int pgd_memslot,int gdt_memslot)788 void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, int pgd_memslot, int gdt_memslot)
789 {
790 	struct vcpu *vcpu;
791 
792 	/* Confirm a vcpu with the specified id doesn't already exist. */
793 	vcpu = vcpu_find(vm, vcpuid);
794 	if (vcpu != NULL)
795 		TEST_ASSERT(false, "vcpu with the specified id "
796 			"already exists,\n"
797 			"  requested vcpuid: %u\n"
798 			"  existing vcpuid: %u state: %p",
799 			vcpuid, vcpu->id, vcpu->state);
800 
801 	/* Allocate and initialize new vcpu structure. */
802 	vcpu = calloc(1, sizeof(*vcpu));
803 	TEST_ASSERT(vcpu != NULL, "Insufficient Memory");
804 	vcpu->id = vcpuid;
805 	vcpu->fd = ioctl(vm->fd, KVM_CREATE_VCPU, vcpuid);
806 	TEST_ASSERT(vcpu->fd >= 0, "KVM_CREATE_VCPU failed, rc: %i errno: %i",
807 		vcpu->fd, errno);
808 
809 	TEST_ASSERT(vcpu_mmap_sz() >= sizeof(*vcpu->state), "vcpu mmap size "
810 		"smaller than expected, vcpu_mmap_sz: %i expected_min: %zi",
811 		vcpu_mmap_sz(), sizeof(*vcpu->state));
812 	vcpu->state = (struct kvm_run *) mmap(NULL, sizeof(*vcpu->state),
813 		PROT_READ | PROT_WRITE, MAP_SHARED, vcpu->fd, 0);
814 	TEST_ASSERT(vcpu->state != MAP_FAILED, "mmap vcpu_state failed, "
815 		"vcpu id: %u errno: %i", vcpuid, errno);
816 
817 	/* Add to linked-list of VCPUs. */
818 	if (vm->vcpu_head)
819 		vm->vcpu_head->prev = vcpu;
820 	vcpu->next = vm->vcpu_head;
821 	vm->vcpu_head = vcpu;
822 
823 	vcpu_setup(vm, vcpuid, pgd_memslot, gdt_memslot);
824 }
825 
826 /* VM Virtual Address Unused Gap
827  *
828  * Input Args:
829  *   vm - Virtual Machine
830  *   sz - Size (bytes)
831  *   vaddr_min - Minimum Virtual Address
832  *
833  * Output Args: None
834  *
835  * Return:
836  *   Lowest virtual address at or below vaddr_min, with at least
837  *   sz unused bytes.  TEST_ASSERT failure if no area of at least
838  *   size sz is available.
839  *
840  * Within the VM specified by vm, locates the lowest starting virtual
841  * address >= vaddr_min, that has at least sz unallocated bytes.  A
842  * TEST_ASSERT failure occurs for invalid input or no area of at least
843  * sz unallocated bytes >= vaddr_min is available.
844  */
vm_vaddr_unused_gap(struct kvm_vm * vm,size_t sz,vm_vaddr_t vaddr_min)845 static vm_vaddr_t vm_vaddr_unused_gap(struct kvm_vm *vm, size_t sz,
846 	vm_vaddr_t vaddr_min)
847 {
848 	uint64_t pages = (sz + vm->page_size - 1) >> vm->page_shift;
849 
850 	/* Determine lowest permitted virtual page index. */
851 	uint64_t pgidx_start = (vaddr_min + vm->page_size - 1) >> vm->page_shift;
852 	if ((pgidx_start * vm->page_size) < vaddr_min)
853 			goto no_va_found;
854 
855 	/* Loop over section with enough valid virtual page indexes. */
856 	if (!sparsebit_is_set_num(vm->vpages_valid,
857 		pgidx_start, pages))
858 		pgidx_start = sparsebit_next_set_num(vm->vpages_valid,
859 			pgidx_start, pages);
860 	do {
861 		/*
862 		 * Are there enough unused virtual pages available at
863 		 * the currently proposed starting virtual page index.
864 		 * If not, adjust proposed starting index to next
865 		 * possible.
866 		 */
867 		if (sparsebit_is_clear_num(vm->vpages_mapped,
868 			pgidx_start, pages))
869 			goto va_found;
870 		pgidx_start = sparsebit_next_clear_num(vm->vpages_mapped,
871 			pgidx_start, pages);
872 		if (pgidx_start == 0)
873 			goto no_va_found;
874 
875 		/*
876 		 * If needed, adjust proposed starting virtual address,
877 		 * to next range of valid virtual addresses.
878 		 */
879 		if (!sparsebit_is_set_num(vm->vpages_valid,
880 			pgidx_start, pages)) {
881 			pgidx_start = sparsebit_next_set_num(
882 				vm->vpages_valid, pgidx_start, pages);
883 			if (pgidx_start == 0)
884 				goto no_va_found;
885 		}
886 	} while (pgidx_start != 0);
887 
888 no_va_found:
889 	TEST_ASSERT(false, "No vaddr of specified pages available, "
890 		"pages: 0x%lx", pages);
891 
892 	/* NOT REACHED */
893 	return -1;
894 
895 va_found:
896 	TEST_ASSERT(sparsebit_is_set_num(vm->vpages_valid,
897 		pgidx_start, pages),
898 		"Unexpected, invalid virtual page index range,\n"
899 		"  pgidx_start: 0x%lx\n"
900 		"  pages: 0x%lx",
901 		pgidx_start, pages);
902 	TEST_ASSERT(sparsebit_is_clear_num(vm->vpages_mapped,
903 		pgidx_start, pages),
904 		"Unexpected, pages already mapped,\n"
905 		"  pgidx_start: 0x%lx\n"
906 		"  pages: 0x%lx",
907 		pgidx_start, pages);
908 
909 	return pgidx_start * vm->page_size;
910 }
911 
912 /* VM Virtual Address Allocate
913  *
914  * Input Args:
915  *   vm - Virtual Machine
916  *   sz - Size in bytes
917  *   vaddr_min - Minimum starting virtual address
918  *   data_memslot - Memory region slot for data pages
919  *   pgd_memslot - Memory region slot for new virtual translation tables
920  *
921  * Output Args: None
922  *
923  * Return:
924  *   Starting guest virtual address
925  *
926  * Allocates at least sz bytes within the virtual address space of the vm
927  * given by vm.  The allocated bytes are mapped to a virtual address >=
928  * the address given by vaddr_min.  Note that each allocation uses a
929  * a unique set of pages, with the minimum real allocation being at least
930  * a page.
931  */
vm_vaddr_alloc(struct kvm_vm * vm,size_t sz,vm_vaddr_t vaddr_min,uint32_t data_memslot,uint32_t pgd_memslot)932 vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
933 	uint32_t data_memslot, uint32_t pgd_memslot)
934 {
935 	uint64_t pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0);
936 
937 	virt_pgd_alloc(vm, pgd_memslot);
938 
939 	/* Find an unused range of virtual page addresses of at least
940 	 * pages in length.
941 	 */
942 	vm_vaddr_t vaddr_start = vm_vaddr_unused_gap(vm, sz, vaddr_min);
943 
944 	/* Map the virtual pages. */
945 	for (vm_vaddr_t vaddr = vaddr_start; pages > 0;
946 		pages--, vaddr += vm->page_size) {
947 		vm_paddr_t paddr;
948 
949 		paddr = vm_phy_page_alloc(vm, KVM_UTIL_MIN_PADDR, data_memslot);
950 
951 		virt_pg_map(vm, vaddr, paddr, pgd_memslot);
952 
953 		sparsebit_set(vm->vpages_mapped,
954 			vaddr >> vm->page_shift);
955 	}
956 
957 	return vaddr_start;
958 }
959 
960 /*
961  * Map a range of VM virtual address to the VM's physical address
962  *
963  * Input Args:
964  *   vm - Virtual Machine
965  *   vaddr - Virtuall address to map
966  *   paddr - VM Physical Address
967  *   size - The size of the range to map
968  *   pgd_memslot - Memory region slot for new virtual translation tables
969  *
970  * Output Args: None
971  *
972  * Return: None
973  *
974  * Within the VM given by vm, creates a virtual translation for the
975  * page range starting at vaddr to the page range starting at paddr.
976  */
virt_map(struct kvm_vm * vm,uint64_t vaddr,uint64_t paddr,size_t size,uint32_t pgd_memslot)977 void virt_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
978 	      size_t size, uint32_t pgd_memslot)
979 {
980 	size_t page_size = vm->page_size;
981 	size_t npages = size / page_size;
982 
983 	TEST_ASSERT(vaddr + size > vaddr, "Vaddr overflow");
984 	TEST_ASSERT(paddr + size > paddr, "Paddr overflow");
985 
986 	while (npages--) {
987 		virt_pg_map(vm, vaddr, paddr, pgd_memslot);
988 		vaddr += page_size;
989 		paddr += page_size;
990 	}
991 }
992 
993 /* Address VM Physical to Host Virtual
994  *
995  * Input Args:
996  *   vm - Virtual Machine
997  *   gpa - VM physical address
998  *
999  * Output Args: None
1000  *
1001  * Return:
1002  *   Equivalent host virtual address
1003  *
1004  * Locates the memory region containing the VM physical address given
1005  * by gpa, within the VM given by vm.  When found, the host virtual
1006  * address providing the memory to the vm physical address is returned.
1007  * A TEST_ASSERT failure occurs if no region containing gpa exists.
1008  */
addr_gpa2hva(struct kvm_vm * vm,vm_paddr_t gpa)1009 void *addr_gpa2hva(struct kvm_vm *vm, vm_paddr_t gpa)
1010 {
1011 	struct userspace_mem_region *region;
1012 	for (region = vm->userspace_mem_region_head; region;
1013 	     region = region->next) {
1014 		if ((gpa >= region->region.guest_phys_addr)
1015 			&& (gpa <= (region->region.guest_phys_addr
1016 				+ region->region.memory_size - 1)))
1017 			return (void *) ((uintptr_t) region->host_mem
1018 				+ (gpa - region->region.guest_phys_addr));
1019 	}
1020 
1021 	TEST_ASSERT(false, "No vm physical memory at 0x%lx", gpa);
1022 	return NULL;
1023 }
1024 
1025 /* Address Host Virtual to VM Physical
1026  *
1027  * Input Args:
1028  *   vm - Virtual Machine
1029  *   hva - Host virtual address
1030  *
1031  * Output Args: None
1032  *
1033  * Return:
1034  *   Equivalent VM physical address
1035  *
1036  * Locates the memory region containing the host virtual address given
1037  * by hva, within the VM given by vm.  When found, the equivalent
1038  * VM physical address is returned. A TEST_ASSERT failure occurs if no
1039  * region containing hva exists.
1040  */
addr_hva2gpa(struct kvm_vm * vm,void * hva)1041 vm_paddr_t addr_hva2gpa(struct kvm_vm *vm, void *hva)
1042 {
1043 	struct userspace_mem_region *region;
1044 	for (region = vm->userspace_mem_region_head; region;
1045 	     region = region->next) {
1046 		if ((hva >= region->host_mem)
1047 			&& (hva <= (region->host_mem
1048 				+ region->region.memory_size - 1)))
1049 			return (vm_paddr_t) ((uintptr_t)
1050 				region->region.guest_phys_addr
1051 				+ (hva - (uintptr_t) region->host_mem));
1052 	}
1053 
1054 	TEST_ASSERT(false, "No mapping to a guest physical address, "
1055 		"hva: %p", hva);
1056 	return -1;
1057 }
1058 
1059 /* VM Create IRQ Chip
1060  *
1061  * Input Args:
1062  *   vm - Virtual Machine
1063  *
1064  * Output Args: None
1065  *
1066  * Return: None
1067  *
1068  * Creates an interrupt controller chip for the VM specified by vm.
1069  */
vm_create_irqchip(struct kvm_vm * vm)1070 void vm_create_irqchip(struct kvm_vm *vm)
1071 {
1072 	int ret;
1073 
1074 	ret = ioctl(vm->fd, KVM_CREATE_IRQCHIP, 0);
1075 	TEST_ASSERT(ret == 0, "KVM_CREATE_IRQCHIP IOCTL failed, "
1076 		"rc: %i errno: %i", ret, errno);
1077 
1078 	vm->has_irqchip = true;
1079 }
1080 
1081 /* VM VCPU State
1082  *
1083  * Input Args:
1084  *   vm - Virtual Machine
1085  *   vcpuid - VCPU ID
1086  *
1087  * Output Args: None
1088  *
1089  * Return:
1090  *   Pointer to structure that describes the state of the VCPU.
1091  *
1092  * Locates and returns a pointer to a structure that describes the
1093  * state of the VCPU with the given vcpuid.
1094  */
vcpu_state(struct kvm_vm * vm,uint32_t vcpuid)1095 struct kvm_run *vcpu_state(struct kvm_vm *vm, uint32_t vcpuid)
1096 {
1097 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1098 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1099 
1100 	return vcpu->state;
1101 }
1102 
1103 /* VM VCPU Run
1104  *
1105  * Input Args:
1106  *   vm - Virtual Machine
1107  *   vcpuid - VCPU ID
1108  *
1109  * Output Args: None
1110  *
1111  * Return: None
1112  *
1113  * Switch to executing the code for the VCPU given by vcpuid, within the VM
1114  * given by vm.
1115  */
vcpu_run(struct kvm_vm * vm,uint32_t vcpuid)1116 void vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)
1117 {
1118 	int ret = _vcpu_run(vm, vcpuid);
1119 	TEST_ASSERT(ret == 0, "KVM_RUN IOCTL failed, "
1120 		"rc: %i errno: %i", ret, errno);
1121 }
1122 
_vcpu_run(struct kvm_vm * vm,uint32_t vcpuid)1123 int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)
1124 {
1125 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1126 	int rc;
1127 
1128 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1129         do {
1130 		rc = ioctl(vcpu->fd, KVM_RUN, NULL);
1131 	} while (rc == -1 && errno == EINTR);
1132 	return rc;
1133 }
1134 
1135 /* VM VCPU Set MP State
1136  *
1137  * Input Args:
1138  *   vm - Virtual Machine
1139  *   vcpuid - VCPU ID
1140  *   mp_state - mp_state to be set
1141  *
1142  * Output Args: None
1143  *
1144  * Return: None
1145  *
1146  * Sets the MP state of the VCPU given by vcpuid, to the state given
1147  * by mp_state.
1148  */
vcpu_set_mp_state(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_mp_state * mp_state)1149 void vcpu_set_mp_state(struct kvm_vm *vm, uint32_t vcpuid,
1150 	struct kvm_mp_state *mp_state)
1151 {
1152 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1153 	int ret;
1154 
1155 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1156 
1157 	ret = ioctl(vcpu->fd, KVM_SET_MP_STATE, mp_state);
1158 	TEST_ASSERT(ret == 0, "KVM_SET_MP_STATE IOCTL failed, "
1159 		"rc: %i errno: %i", ret, errno);
1160 }
1161 
1162 /* VM VCPU Regs Get
1163  *
1164  * Input Args:
1165  *   vm - Virtual Machine
1166  *   vcpuid - VCPU ID
1167  *
1168  * Output Args:
1169  *   regs - current state of VCPU regs
1170  *
1171  * Return: None
1172  *
1173  * Obtains the current register state for the VCPU specified by vcpuid
1174  * and stores it at the location given by regs.
1175  */
vcpu_regs_get(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_regs * regs)1176 void vcpu_regs_get(struct kvm_vm *vm,
1177 	uint32_t vcpuid, struct kvm_regs *regs)
1178 {
1179 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1180 	int ret;
1181 
1182 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1183 
1184 	/* Get the regs. */
1185 	ret = ioctl(vcpu->fd, KVM_GET_REGS, regs);
1186 	TEST_ASSERT(ret == 0, "KVM_GET_REGS failed, rc: %i errno: %i",
1187 		ret, errno);
1188 }
1189 
1190 /* VM VCPU Regs Set
1191  *
1192  * Input Args:
1193  *   vm - Virtual Machine
1194  *   vcpuid - VCPU ID
1195  *   regs - Values to set VCPU regs to
1196  *
1197  * Output Args: None
1198  *
1199  * Return: None
1200  *
1201  * Sets the regs of the VCPU specified by vcpuid to the values
1202  * given by regs.
1203  */
vcpu_regs_set(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_regs * regs)1204 void vcpu_regs_set(struct kvm_vm *vm,
1205 	uint32_t vcpuid, struct kvm_regs *regs)
1206 {
1207 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1208 	int ret;
1209 
1210 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1211 
1212 	/* Set the regs. */
1213 	ret = ioctl(vcpu->fd, KVM_SET_REGS, regs);
1214 	TEST_ASSERT(ret == 0, "KVM_SET_REGS failed, rc: %i errno: %i",
1215 		ret, errno);
1216 }
1217 
vcpu_events_get(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_vcpu_events * events)1218 void vcpu_events_get(struct kvm_vm *vm, uint32_t vcpuid,
1219 			  struct kvm_vcpu_events *events)
1220 {
1221 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1222 	int ret;
1223 
1224 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1225 
1226 	/* Get the regs. */
1227 	ret = ioctl(vcpu->fd, KVM_GET_VCPU_EVENTS, events);
1228 	TEST_ASSERT(ret == 0, "KVM_GET_VCPU_EVENTS, failed, rc: %i errno: %i",
1229 		ret, errno);
1230 }
1231 
vcpu_events_set(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_vcpu_events * events)1232 void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid,
1233 			  struct kvm_vcpu_events *events)
1234 {
1235 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1236 	int ret;
1237 
1238 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1239 
1240 	/* Set the regs. */
1241 	ret = ioctl(vcpu->fd, KVM_SET_VCPU_EVENTS, events);
1242 	TEST_ASSERT(ret == 0, "KVM_SET_VCPU_EVENTS, failed, rc: %i errno: %i",
1243 		ret, errno);
1244 }
1245 
1246 /* VCPU Get MSR
1247  *
1248  * Input Args:
1249  *   vm - Virtual Machine
1250  *   vcpuid - VCPU ID
1251  *   msr_index - Index of MSR
1252  *
1253  * Output Args: None
1254  *
1255  * Return: On success, value of the MSR. On failure a TEST_ASSERT is produced.
1256  *
1257  * Get value of MSR for VCPU.
1258  */
vcpu_get_msr(struct kvm_vm * vm,uint32_t vcpuid,uint64_t msr_index)1259 uint64_t vcpu_get_msr(struct kvm_vm *vm, uint32_t vcpuid, uint64_t msr_index)
1260 {
1261 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1262 	struct {
1263 		struct kvm_msrs header;
1264 		struct kvm_msr_entry entry;
1265 	} buffer = {};
1266 	int r;
1267 
1268 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1269 	buffer.header.nmsrs = 1;
1270 	buffer.entry.index = msr_index;
1271 	r = ioctl(vcpu->fd, KVM_GET_MSRS, &buffer.header);
1272 	TEST_ASSERT(r == 1, "KVM_GET_MSRS IOCTL failed,\n"
1273 		"  rc: %i errno: %i", r, errno);
1274 
1275 	return buffer.entry.data;
1276 }
1277 
1278 /* VCPU Set MSR
1279  *
1280  * Input Args:
1281  *   vm - Virtual Machine
1282  *   vcpuid - VCPU ID
1283  *   msr_index - Index of MSR
1284  *   msr_value - New value of MSR
1285  *
1286  * Output Args: None
1287  *
1288  * Return: On success, nothing. On failure a TEST_ASSERT is produced.
1289  *
1290  * Set value of MSR for VCPU.
1291  */
vcpu_set_msr(struct kvm_vm * vm,uint32_t vcpuid,uint64_t msr_index,uint64_t msr_value)1292 void vcpu_set_msr(struct kvm_vm *vm, uint32_t vcpuid, uint64_t msr_index,
1293 	uint64_t msr_value)
1294 {
1295 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1296 	struct {
1297 		struct kvm_msrs header;
1298 		struct kvm_msr_entry entry;
1299 	} buffer = {};
1300 	int r;
1301 
1302 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1303 	memset(&buffer, 0, sizeof(buffer));
1304 	buffer.header.nmsrs = 1;
1305 	buffer.entry.index = msr_index;
1306 	buffer.entry.data = msr_value;
1307 	r = ioctl(vcpu->fd, KVM_SET_MSRS, &buffer.header);
1308 	TEST_ASSERT(r == 1, "KVM_SET_MSRS IOCTL failed,\n"
1309 		"  rc: %i errno: %i", r, errno);
1310 }
1311 
1312 /* VM VCPU Args Set
1313  *
1314  * Input Args:
1315  *   vm - Virtual Machine
1316  *   vcpuid - VCPU ID
1317  *   num - number of arguments
1318  *   ... - arguments, each of type uint64_t
1319  *
1320  * Output Args: None
1321  *
1322  * Return: None
1323  *
1324  * Sets the first num function input arguments to the values
1325  * given as variable args.  Each of the variable args is expected to
1326  * be of type uint64_t.
1327  */
vcpu_args_set(struct kvm_vm * vm,uint32_t vcpuid,unsigned int num,...)1328 void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
1329 {
1330 	va_list ap;
1331 	struct kvm_regs regs;
1332 
1333 	TEST_ASSERT(num >= 1 && num <= 6, "Unsupported number of args,\n"
1334 		    "  num: %u\n",
1335 		    num);
1336 
1337 	va_start(ap, num);
1338 	vcpu_regs_get(vm, vcpuid, &regs);
1339 
1340 	if (num >= 1)
1341 		regs.rdi = va_arg(ap, uint64_t);
1342 
1343 	if (num >= 2)
1344 		regs.rsi = va_arg(ap, uint64_t);
1345 
1346 	if (num >= 3)
1347 		regs.rdx = va_arg(ap, uint64_t);
1348 
1349 	if (num >= 4)
1350 		regs.rcx = va_arg(ap, uint64_t);
1351 
1352 	if (num >= 5)
1353 		regs.r8 = va_arg(ap, uint64_t);
1354 
1355 	if (num >= 6)
1356 		regs.r9 = va_arg(ap, uint64_t);
1357 
1358 	vcpu_regs_set(vm, vcpuid, &regs);
1359 	va_end(ap);
1360 }
1361 
1362 /* VM VCPU System Regs Get
1363  *
1364  * Input Args:
1365  *   vm - Virtual Machine
1366  *   vcpuid - VCPU ID
1367  *
1368  * Output Args:
1369  *   sregs - current state of VCPU system regs
1370  *
1371  * Return: None
1372  *
1373  * Obtains the current system register state for the VCPU specified by
1374  * vcpuid and stores it at the location given by sregs.
1375  */
vcpu_sregs_get(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_sregs * sregs)1376 void vcpu_sregs_get(struct kvm_vm *vm,
1377 	uint32_t vcpuid, struct kvm_sregs *sregs)
1378 {
1379 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1380 	int ret;
1381 
1382 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1383 
1384 	/* Get the regs. */
1385 	/* Get the regs. */
1386 	ret = ioctl(vcpu->fd, KVM_GET_SREGS, sregs);
1387 	TEST_ASSERT(ret == 0, "KVM_GET_SREGS failed, rc: %i errno: %i",
1388 		ret, errno);
1389 }
1390 
1391 /* VM VCPU System Regs Set
1392  *
1393  * Input Args:
1394  *   vm - Virtual Machine
1395  *   vcpuid - VCPU ID
1396  *   sregs - Values to set VCPU system regs to
1397  *
1398  * Output Args: None
1399  *
1400  * Return: None
1401  *
1402  * Sets the system regs of the VCPU specified by vcpuid to the values
1403  * given by sregs.
1404  */
vcpu_sregs_set(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_sregs * sregs)1405 void vcpu_sregs_set(struct kvm_vm *vm,
1406 	uint32_t vcpuid, struct kvm_sregs *sregs)
1407 {
1408 	int ret = _vcpu_sregs_set(vm, vcpuid, sregs);
1409 	TEST_ASSERT(ret == 0, "KVM_RUN IOCTL failed, "
1410 		"rc: %i errno: %i", ret, errno);
1411 }
1412 
_vcpu_sregs_set(struct kvm_vm * vm,uint32_t vcpuid,struct kvm_sregs * sregs)1413 int _vcpu_sregs_set(struct kvm_vm *vm,
1414 	uint32_t vcpuid, struct kvm_sregs *sregs)
1415 {
1416 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1417 	int ret;
1418 
1419 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1420 
1421 	/* Get the regs. */
1422 	return ioctl(vcpu->fd, KVM_SET_SREGS, sregs);
1423 }
1424 
1425 /* VCPU Ioctl
1426  *
1427  * Input Args:
1428  *   vm - Virtual Machine
1429  *   vcpuid - VCPU ID
1430  *   cmd - Ioctl number
1431  *   arg - Argument to pass to the ioctl
1432  *
1433  * Return: None
1434  *
1435  * Issues an arbitrary ioctl on a VCPU fd.
1436  */
vcpu_ioctl(struct kvm_vm * vm,uint32_t vcpuid,unsigned long cmd,void * arg)1437 void vcpu_ioctl(struct kvm_vm *vm,
1438 	uint32_t vcpuid, unsigned long cmd, void *arg)
1439 {
1440 	struct vcpu *vcpu = vcpu_find(vm, vcpuid);
1441 	int ret;
1442 
1443 	TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
1444 
1445 	ret = ioctl(vcpu->fd, cmd, arg);
1446 	TEST_ASSERT(ret == 0, "vcpu ioctl %lu failed, rc: %i errno: %i (%s)",
1447 		cmd, ret, errno, strerror(errno));
1448 }
1449 
1450 /* VM Ioctl
1451  *
1452  * Input Args:
1453  *   vm - Virtual Machine
1454  *   cmd - Ioctl number
1455  *   arg - Argument to pass to the ioctl
1456  *
1457  * Return: None
1458  *
1459  * Issues an arbitrary ioctl on a VM fd.
1460  */
vm_ioctl(struct kvm_vm * vm,unsigned long cmd,void * arg)1461 void vm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg)
1462 {
1463 	int ret;
1464 
1465 	ret = ioctl(vm->fd, cmd, arg);
1466 	TEST_ASSERT(ret == 0, "vm ioctl %lu failed, rc: %i errno: %i (%s)",
1467 		cmd, ret, errno, strerror(errno));
1468 }
1469 
1470 /* VM Dump
1471  *
1472  * Input Args:
1473  *   vm - Virtual Machine
1474  *   indent - Left margin indent amount
1475  *
1476  * Output Args:
1477  *   stream - Output FILE stream
1478  *
1479  * Return: None
1480  *
1481  * Dumps the current state of the VM given by vm, to the FILE stream
1482  * given by stream.
1483  */
vm_dump(FILE * stream,struct kvm_vm * vm,uint8_t indent)1484 void vm_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
1485 {
1486 	struct userspace_mem_region *region;
1487 	struct vcpu *vcpu;
1488 
1489 	fprintf(stream, "%*smode: 0x%x\n", indent, "", vm->mode);
1490 	fprintf(stream, "%*sfd: %i\n", indent, "", vm->fd);
1491 	fprintf(stream, "%*spage_size: 0x%x\n", indent, "", vm->page_size);
1492 	fprintf(stream, "%*sMem Regions:\n", indent, "");
1493 	for (region = vm->userspace_mem_region_head; region;
1494 		region = region->next) {
1495 		fprintf(stream, "%*sguest_phys: 0x%lx size: 0x%lx "
1496 			"host_virt: %p\n", indent + 2, "",
1497 			(uint64_t) region->region.guest_phys_addr,
1498 			(uint64_t) region->region.memory_size,
1499 			region->host_mem);
1500 		fprintf(stream, "%*sunused_phy_pages: ", indent + 2, "");
1501 		sparsebit_dump(stream, region->unused_phy_pages, 0);
1502 	}
1503 	fprintf(stream, "%*sMapped Virtual Pages:\n", indent, "");
1504 	sparsebit_dump(stream, vm->vpages_mapped, indent + 2);
1505 	fprintf(stream, "%*spgd_created: %u\n", indent, "",
1506 		vm->pgd_created);
1507 	if (vm->pgd_created) {
1508 		fprintf(stream, "%*sVirtual Translation Tables:\n",
1509 			indent + 2, "");
1510 		virt_dump(stream, vm, indent + 4);
1511 	}
1512 	fprintf(stream, "%*sVCPUs:\n", indent, "");
1513 	for (vcpu = vm->vcpu_head; vcpu; vcpu = vcpu->next)
1514 		vcpu_dump(stream, vm, vcpu->id, indent + 2);
1515 }
1516 
1517 /* VM VCPU Dump
1518  *
1519  * Input Args:
1520  *   vm - Virtual Machine
1521  *   vcpuid - VCPU ID
1522  *   indent - Left margin indent amount
1523  *
1524  * Output Args:
1525  *   stream - Output FILE stream
1526  *
1527  * Return: None
1528  *
1529  * Dumps the current state of the VCPU specified by vcpuid, within the VM
1530  * given by vm, to the FILE stream given by stream.
1531  */
vcpu_dump(FILE * stream,struct kvm_vm * vm,uint32_t vcpuid,uint8_t indent)1532 void vcpu_dump(FILE *stream, struct kvm_vm *vm,
1533 	uint32_t vcpuid, uint8_t indent)
1534 {
1535 		struct kvm_regs regs;
1536 		struct kvm_sregs sregs;
1537 
1538 		fprintf(stream, "%*scpuid: %u\n", indent, "", vcpuid);
1539 
1540 		fprintf(stream, "%*sregs:\n", indent + 2, "");
1541 		vcpu_regs_get(vm, vcpuid, &regs);
1542 		regs_dump(stream, &regs, indent + 4);
1543 
1544 		fprintf(stream, "%*ssregs:\n", indent + 2, "");
1545 		vcpu_sregs_get(vm, vcpuid, &sregs);
1546 		sregs_dump(stream, &sregs, indent + 4);
1547 }
1548 
1549 /* Known KVM exit reasons */
1550 static struct exit_reason {
1551 	unsigned int reason;
1552 	const char *name;
1553 } exit_reasons_known[] = {
1554 	{KVM_EXIT_UNKNOWN, "UNKNOWN"},
1555 	{KVM_EXIT_EXCEPTION, "EXCEPTION"},
1556 	{KVM_EXIT_IO, "IO"},
1557 	{KVM_EXIT_HYPERCALL, "HYPERCALL"},
1558 	{KVM_EXIT_DEBUG, "DEBUG"},
1559 	{KVM_EXIT_HLT, "HLT"},
1560 	{KVM_EXIT_MMIO, "MMIO"},
1561 	{KVM_EXIT_IRQ_WINDOW_OPEN, "IRQ_WINDOW_OPEN"},
1562 	{KVM_EXIT_SHUTDOWN, "SHUTDOWN"},
1563 	{KVM_EXIT_FAIL_ENTRY, "FAIL_ENTRY"},
1564 	{KVM_EXIT_INTR, "INTR"},
1565 	{KVM_EXIT_SET_TPR, "SET_TPR"},
1566 	{KVM_EXIT_TPR_ACCESS, "TPR_ACCESS"},
1567 	{KVM_EXIT_S390_SIEIC, "S390_SIEIC"},
1568 	{KVM_EXIT_S390_RESET, "S390_RESET"},
1569 	{KVM_EXIT_DCR, "DCR"},
1570 	{KVM_EXIT_NMI, "NMI"},
1571 	{KVM_EXIT_INTERNAL_ERROR, "INTERNAL_ERROR"},
1572 	{KVM_EXIT_OSI, "OSI"},
1573 	{KVM_EXIT_PAPR_HCALL, "PAPR_HCALL"},
1574 #ifdef KVM_EXIT_MEMORY_NOT_PRESENT
1575 	{KVM_EXIT_MEMORY_NOT_PRESENT, "MEMORY_NOT_PRESENT"},
1576 #endif
1577 };
1578 
1579 /* Exit Reason String
1580  *
1581  * Input Args:
1582  *   exit_reason - Exit reason
1583  *
1584  * Output Args: None
1585  *
1586  * Return:
1587  *   Constant string pointer describing the exit reason.
1588  *
1589  * Locates and returns a constant string that describes the KVM exit
1590  * reason given by exit_reason.  If no such string is found, a constant
1591  * string of "Unknown" is returned.
1592  */
exit_reason_str(unsigned int exit_reason)1593 const char *exit_reason_str(unsigned int exit_reason)
1594 {
1595 	unsigned int n1;
1596 
1597 	for (n1 = 0; n1 < ARRAY_SIZE(exit_reasons_known); n1++) {
1598 		if (exit_reason == exit_reasons_known[n1].reason)
1599 			return exit_reasons_known[n1].name;
1600 	}
1601 
1602 	return "Unknown";
1603 }
1604 
1605 /* Physical Page Allocate
1606  *
1607  * Input Args:
1608  *   vm - Virtual Machine
1609  *   paddr_min - Physical address minimum
1610  *   memslot - Memory region to allocate page from
1611  *
1612  * Output Args: None
1613  *
1614  * Return:
1615  *   Starting physical address
1616  *
1617  * Within the VM specified by vm, locates an available physical page
1618  * at or above paddr_min.  If found, the page is marked as in use
1619  * and its address is returned.  A TEST_ASSERT failure occurs if no
1620  * page is available at or above paddr_min.
1621  */
vm_phy_page_alloc(struct kvm_vm * vm,vm_paddr_t paddr_min,uint32_t memslot)1622 vm_paddr_t vm_phy_page_alloc(struct kvm_vm *vm,
1623 	vm_paddr_t paddr_min, uint32_t memslot)
1624 {
1625 	struct userspace_mem_region *region;
1626 	sparsebit_idx_t pg;
1627 
1628 	TEST_ASSERT((paddr_min % vm->page_size) == 0, "Min physical address "
1629 		"not divisible by page size.\n"
1630 		"  paddr_min: 0x%lx page_size: 0x%x",
1631 		paddr_min, vm->page_size);
1632 
1633 	/* Locate memory region. */
1634 	region = memslot2region(vm, memslot);
1635 
1636 	/* Locate next available physical page at or above paddr_min. */
1637 	pg = paddr_min >> vm->page_shift;
1638 
1639 	if (!sparsebit_is_set(region->unused_phy_pages, pg)) {
1640 		pg = sparsebit_next_set(region->unused_phy_pages, pg);
1641 		if (pg == 0) {
1642 			fprintf(stderr, "No guest physical page available, "
1643 				"paddr_min: 0x%lx page_size: 0x%x memslot: %u",
1644 				paddr_min, vm->page_size, memslot);
1645 			fputs("---- vm dump ----\n", stderr);
1646 			vm_dump(stderr, vm, 2);
1647 			abort();
1648 		}
1649 	}
1650 
1651 	/* Specify page as in use and return its address. */
1652 	sparsebit_clear(region->unused_phy_pages, pg);
1653 
1654 	return pg * vm->page_size;
1655 }
1656 
1657 /* Address Guest Virtual to Host Virtual
1658  *
1659  * Input Args:
1660  *   vm - Virtual Machine
1661  *   gva - VM virtual address
1662  *
1663  * Output Args: None
1664  *
1665  * Return:
1666  *   Equivalent host virtual address
1667  */
addr_gva2hva(struct kvm_vm * vm,vm_vaddr_t gva)1668 void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva)
1669 {
1670 	return addr_gpa2hva(vm, addr_gva2gpa(vm, gva));
1671 }
1672 
guest_args_read(struct kvm_vm * vm,uint32_t vcpu_id,struct guest_args * args)1673 void guest_args_read(struct kvm_vm *vm, uint32_t vcpu_id,
1674 		     struct guest_args *args)
1675 {
1676 	struct kvm_run *run = vcpu_state(vm, vcpu_id);
1677 	struct kvm_regs regs;
1678 
1679 	memset(&regs, 0, sizeof(regs));
1680 	vcpu_regs_get(vm, vcpu_id, &regs);
1681 
1682 	args->port = run->io.port;
1683 	args->arg0 = regs.rdi;
1684 	args->arg1 = regs.rsi;
1685 }
1686