1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * tools/testing/selftests/kvm/lib/kvm_util.c
4 *
5 * Copyright (C) 2018, Google LLC.
6 */
7
8 #define _GNU_SOURCE /* for program_invocation_name */
9 #include "test_util.h"
10 #include "kvm_util.h"
11 #include "processor.h"
12
13 #include <assert.h>
14 #include <sched.h>
15 #include <sys/mman.h>
16 #include <sys/types.h>
17 #include <sys/stat.h>
18 #include <unistd.h>
19 #include <linux/kernel.h>
20
21 #define KVM_UTIL_MIN_PFN 2
22
23 static int vcpu_mmap_sz(void);
24
open_path_or_exit(const char * path,int flags)25 int open_path_or_exit(const char *path, int flags)
26 {
27 int fd;
28
29 fd = open(path, flags);
30 __TEST_REQUIRE(fd >= 0, "%s not available (errno: %d)", path, errno);
31
32 return fd;
33 }
34
35 /*
36 * Open KVM_DEV_PATH if available, otherwise exit the entire program.
37 *
38 * Input Args:
39 * flags - The flags to pass when opening KVM_DEV_PATH.
40 *
41 * Return:
42 * The opened file descriptor of /dev/kvm.
43 */
_open_kvm_dev_path_or_exit(int flags)44 static int _open_kvm_dev_path_or_exit(int flags)
45 {
46 return open_path_or_exit(KVM_DEV_PATH, flags);
47 }
48
open_kvm_dev_path_or_exit(void)49 int open_kvm_dev_path_or_exit(void)
50 {
51 return _open_kvm_dev_path_or_exit(O_RDONLY);
52 }
53
get_module_param_bool(const char * module_name,const char * param)54 static bool get_module_param_bool(const char *module_name, const char *param)
55 {
56 const int path_size = 128;
57 char path[path_size];
58 char value;
59 ssize_t r;
60 int fd;
61
62 r = snprintf(path, path_size, "/sys/module/%s/parameters/%s",
63 module_name, param);
64 TEST_ASSERT(r < path_size,
65 "Failed to construct sysfs path in %d bytes.", path_size);
66
67 fd = open_path_or_exit(path, O_RDONLY);
68
69 r = read(fd, &value, 1);
70 TEST_ASSERT(r == 1, "read(%s) failed", path);
71
72 r = close(fd);
73 TEST_ASSERT(!r, "close(%s) failed", path);
74
75 if (value == 'Y')
76 return true;
77 else if (value == 'N')
78 return false;
79
80 TEST_FAIL("Unrecognized value '%c' for boolean module param", value);
81 }
82
get_kvm_param_bool(const char * param)83 bool get_kvm_param_bool(const char *param)
84 {
85 return get_module_param_bool("kvm", param);
86 }
87
get_kvm_intel_param_bool(const char * param)88 bool get_kvm_intel_param_bool(const char *param)
89 {
90 return get_module_param_bool("kvm_intel", param);
91 }
92
get_kvm_amd_param_bool(const char * param)93 bool get_kvm_amd_param_bool(const char *param)
94 {
95 return get_module_param_bool("kvm_amd", param);
96 }
97
98 /*
99 * Capability
100 *
101 * Input Args:
102 * cap - Capability
103 *
104 * Output Args: None
105 *
106 * Return:
107 * On success, the Value corresponding to the capability (KVM_CAP_*)
108 * specified by the value of cap. On failure a TEST_ASSERT failure
109 * is produced.
110 *
111 * Looks up and returns the value corresponding to the capability
112 * (KVM_CAP_*) given by cap.
113 */
kvm_check_cap(long cap)114 unsigned int kvm_check_cap(long cap)
115 {
116 int ret;
117 int kvm_fd;
118
119 kvm_fd = open_kvm_dev_path_or_exit();
120 ret = __kvm_ioctl(kvm_fd, KVM_CHECK_EXTENSION, (void *)cap);
121 TEST_ASSERT(ret >= 0, KVM_IOCTL_ERROR(KVM_CHECK_EXTENSION, ret));
122
123 close(kvm_fd);
124
125 return (unsigned int)ret;
126 }
127
vm_enable_dirty_ring(struct kvm_vm * vm,uint32_t ring_size)128 void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size)
129 {
130 if (vm_check_cap(vm, KVM_CAP_DIRTY_LOG_RING_ACQ_REL))
131 vm_enable_cap(vm, KVM_CAP_DIRTY_LOG_RING_ACQ_REL, ring_size);
132 else
133 vm_enable_cap(vm, KVM_CAP_DIRTY_LOG_RING, ring_size);
134 vm->dirty_ring_size = ring_size;
135 }
136
vm_open(struct kvm_vm * vm)137 static void vm_open(struct kvm_vm *vm)
138 {
139 vm->kvm_fd = _open_kvm_dev_path_or_exit(O_RDWR);
140
141 TEST_REQUIRE(kvm_has_cap(KVM_CAP_IMMEDIATE_EXIT));
142
143 vm->fd = __kvm_ioctl(vm->kvm_fd, KVM_CREATE_VM, (void *)vm->type);
144 TEST_ASSERT(vm->fd >= 0, KVM_IOCTL_ERROR(KVM_CREATE_VM, vm->fd));
145 }
146
vm_guest_mode_string(uint32_t i)147 const char *vm_guest_mode_string(uint32_t i)
148 {
149 static const char * const strings[] = {
150 [VM_MODE_P52V48_4K] = "PA-bits:52, VA-bits:48, 4K pages",
151 [VM_MODE_P52V48_64K] = "PA-bits:52, VA-bits:48, 64K pages",
152 [VM_MODE_P48V48_4K] = "PA-bits:48, VA-bits:48, 4K pages",
153 [VM_MODE_P48V48_16K] = "PA-bits:48, VA-bits:48, 16K pages",
154 [VM_MODE_P48V48_64K] = "PA-bits:48, VA-bits:48, 64K pages",
155 [VM_MODE_P40V48_4K] = "PA-bits:40, VA-bits:48, 4K pages",
156 [VM_MODE_P40V48_16K] = "PA-bits:40, VA-bits:48, 16K pages",
157 [VM_MODE_P40V48_64K] = "PA-bits:40, VA-bits:48, 64K pages",
158 [VM_MODE_PXXV48_4K] = "PA-bits:ANY, VA-bits:48, 4K pages",
159 [VM_MODE_P47V64_4K] = "PA-bits:47, VA-bits:64, 4K pages",
160 [VM_MODE_P44V64_4K] = "PA-bits:44, VA-bits:64, 4K pages",
161 [VM_MODE_P36V48_4K] = "PA-bits:36, VA-bits:48, 4K pages",
162 [VM_MODE_P36V48_16K] = "PA-bits:36, VA-bits:48, 16K pages",
163 [VM_MODE_P36V48_64K] = "PA-bits:36, VA-bits:48, 64K pages",
164 [VM_MODE_P36V47_16K] = "PA-bits:36, VA-bits:47, 16K pages",
165 };
166 _Static_assert(sizeof(strings)/sizeof(char *) == NUM_VM_MODES,
167 "Missing new mode strings?");
168
169 TEST_ASSERT(i < NUM_VM_MODES, "Guest mode ID %d too big", i);
170
171 return strings[i];
172 }
173
174 const struct vm_guest_mode_params vm_guest_mode_params[] = {
175 [VM_MODE_P52V48_4K] = { 52, 48, 0x1000, 12 },
176 [VM_MODE_P52V48_64K] = { 52, 48, 0x10000, 16 },
177 [VM_MODE_P48V48_4K] = { 48, 48, 0x1000, 12 },
178 [VM_MODE_P48V48_16K] = { 48, 48, 0x4000, 14 },
179 [VM_MODE_P48V48_64K] = { 48, 48, 0x10000, 16 },
180 [VM_MODE_P40V48_4K] = { 40, 48, 0x1000, 12 },
181 [VM_MODE_P40V48_16K] = { 40, 48, 0x4000, 14 },
182 [VM_MODE_P40V48_64K] = { 40, 48, 0x10000, 16 },
183 [VM_MODE_PXXV48_4K] = { 0, 0, 0x1000, 12 },
184 [VM_MODE_P47V64_4K] = { 47, 64, 0x1000, 12 },
185 [VM_MODE_P44V64_4K] = { 44, 64, 0x1000, 12 },
186 [VM_MODE_P36V48_4K] = { 36, 48, 0x1000, 12 },
187 [VM_MODE_P36V48_16K] = { 36, 48, 0x4000, 14 },
188 [VM_MODE_P36V48_64K] = { 36, 48, 0x10000, 16 },
189 [VM_MODE_P36V47_16K] = { 36, 47, 0x4000, 14 },
190 };
191 _Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct vm_guest_mode_params) == NUM_VM_MODES,
192 "Missing new mode params?");
193
194 /*
195 * Initializes vm->vpages_valid to match the canonical VA space of the
196 * architecture.
197 *
198 * The default implementation is valid for architectures which split the
199 * range addressed by a single page table into a low and high region
200 * based on the MSB of the VA. On architectures with this behavior
201 * the VA region spans [0, 2^(va_bits - 1)), [-(2^(va_bits - 1), -1].
202 */
vm_vaddr_populate_bitmap(struct kvm_vm * vm)203 __weak void vm_vaddr_populate_bitmap(struct kvm_vm *vm)
204 {
205 sparsebit_set_num(vm->vpages_valid,
206 0, (1ULL << (vm->va_bits - 1)) >> vm->page_shift);
207 sparsebit_set_num(vm->vpages_valid,
208 (~((1ULL << (vm->va_bits - 1)) - 1)) >> vm->page_shift,
209 (1ULL << (vm->va_bits - 1)) >> vm->page_shift);
210 }
211
____vm_create(enum vm_guest_mode mode)212 struct kvm_vm *____vm_create(enum vm_guest_mode mode)
213 {
214 struct kvm_vm *vm;
215
216 vm = calloc(1, sizeof(*vm));
217 TEST_ASSERT(vm != NULL, "Insufficient Memory");
218
219 INIT_LIST_HEAD(&vm->vcpus);
220 vm->regions.gpa_tree = RB_ROOT;
221 vm->regions.hva_tree = RB_ROOT;
222 hash_init(vm->regions.slot_hash);
223
224 vm->mode = mode;
225 vm->type = 0;
226
227 vm->pa_bits = vm_guest_mode_params[mode].pa_bits;
228 vm->va_bits = vm_guest_mode_params[mode].va_bits;
229 vm->page_size = vm_guest_mode_params[mode].page_size;
230 vm->page_shift = vm_guest_mode_params[mode].page_shift;
231
232 /* Setup mode specific traits. */
233 switch (vm->mode) {
234 case VM_MODE_P52V48_4K:
235 vm->pgtable_levels = 4;
236 break;
237 case VM_MODE_P52V48_64K:
238 vm->pgtable_levels = 3;
239 break;
240 case VM_MODE_P48V48_4K:
241 vm->pgtable_levels = 4;
242 break;
243 case VM_MODE_P48V48_64K:
244 vm->pgtable_levels = 3;
245 break;
246 case VM_MODE_P40V48_4K:
247 case VM_MODE_P36V48_4K:
248 vm->pgtable_levels = 4;
249 break;
250 case VM_MODE_P40V48_64K:
251 case VM_MODE_P36V48_64K:
252 vm->pgtable_levels = 3;
253 break;
254 case VM_MODE_P48V48_16K:
255 case VM_MODE_P40V48_16K:
256 case VM_MODE_P36V48_16K:
257 vm->pgtable_levels = 4;
258 break;
259 case VM_MODE_P36V47_16K:
260 vm->pgtable_levels = 3;
261 break;
262 case VM_MODE_PXXV48_4K:
263 #ifdef __x86_64__
264 kvm_get_cpu_address_width(&vm->pa_bits, &vm->va_bits);
265 /*
266 * Ignore KVM support for 5-level paging (vm->va_bits == 57),
267 * it doesn't take effect unless a CR4.LA57 is set, which it
268 * isn't for this VM_MODE.
269 */
270 TEST_ASSERT(vm->va_bits == 48 || vm->va_bits == 57,
271 "Linear address width (%d bits) not supported",
272 vm->va_bits);
273 pr_debug("Guest physical address width detected: %d\n",
274 vm->pa_bits);
275 vm->pgtable_levels = 4;
276 vm->va_bits = 48;
277 #else
278 TEST_FAIL("VM_MODE_PXXV48_4K not supported on non-x86 platforms");
279 #endif
280 break;
281 case VM_MODE_P47V64_4K:
282 vm->pgtable_levels = 5;
283 break;
284 case VM_MODE_P44V64_4K:
285 vm->pgtable_levels = 5;
286 break;
287 default:
288 TEST_FAIL("Unknown guest mode, mode: 0x%x", mode);
289 }
290
291 #ifdef __aarch64__
292 if (vm->pa_bits != 40)
293 vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits);
294 #endif
295
296 vm_open(vm);
297
298 /* Limit to VA-bit canonical virtual addresses. */
299 vm->vpages_valid = sparsebit_alloc();
300 vm_vaddr_populate_bitmap(vm);
301
302 /* Limit physical addresses to PA-bits. */
303 vm->max_gfn = vm_compute_max_gfn(vm);
304
305 /* Allocate and setup memory for guest. */
306 vm->vpages_mapped = sparsebit_alloc();
307
308 return vm;
309 }
310
vm_nr_pages_required(enum vm_guest_mode mode,uint32_t nr_runnable_vcpus,uint64_t extra_mem_pages)311 static uint64_t vm_nr_pages_required(enum vm_guest_mode mode,
312 uint32_t nr_runnable_vcpus,
313 uint64_t extra_mem_pages)
314 {
315 uint64_t page_size = vm_guest_mode_params[mode].page_size;
316 uint64_t nr_pages;
317
318 TEST_ASSERT(nr_runnable_vcpus,
319 "Use vm_create_barebones() for VMs that _never_ have vCPUs\n");
320
321 TEST_ASSERT(nr_runnable_vcpus <= kvm_check_cap(KVM_CAP_MAX_VCPUS),
322 "nr_vcpus = %d too large for host, max-vcpus = %d",
323 nr_runnable_vcpus, kvm_check_cap(KVM_CAP_MAX_VCPUS));
324
325 /*
326 * Arbitrarily allocate 512 pages (2mb when page size is 4kb) for the
327 * test code and other per-VM assets that will be loaded into memslot0.
328 */
329 nr_pages = 512;
330
331 /* Account for the per-vCPU stacks on behalf of the test. */
332 nr_pages += nr_runnable_vcpus * DEFAULT_STACK_PGS;
333
334 /*
335 * Account for the number of pages needed for the page tables. The
336 * maximum page table size for a memory region will be when the
337 * smallest page size is used. Considering each page contains x page
338 * table descriptors, the total extra size for page tables (for extra
339 * N pages) will be: N/x+N/x^2+N/x^3+... which is definitely smaller
340 * than N/x*2.
341 */
342 nr_pages += (nr_pages + extra_mem_pages) / PTES_PER_MIN_PAGE * 2;
343
344 /* Account for the number of pages needed by ucall. */
345 nr_pages += ucall_nr_pages_required(page_size);
346
347 return vm_adjust_num_guest_pages(mode, nr_pages);
348 }
349
__vm_create(enum vm_guest_mode mode,uint32_t nr_runnable_vcpus,uint64_t nr_extra_pages)350 struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint32_t nr_runnable_vcpus,
351 uint64_t nr_extra_pages)
352 {
353 uint64_t nr_pages = vm_nr_pages_required(mode, nr_runnable_vcpus,
354 nr_extra_pages);
355 struct userspace_mem_region *slot0;
356 struct kvm_vm *vm;
357 int i;
358
359 pr_debug("%s: mode='%s' pages='%ld'\n", __func__,
360 vm_guest_mode_string(mode), nr_pages);
361
362 vm = ____vm_create(mode);
363
364 vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, 0);
365 for (i = 0; i < NR_MEM_REGIONS; i++)
366 vm->memslots[i] = 0;
367
368 kvm_vm_elf_load(vm, program_invocation_name);
369
370 /*
371 * TODO: Add proper defines to protect the library's memslots, and then
372 * carve out memslot1 for the ucall MMIO address. KVM treats writes to
373 * read-only memslots as MMIO, and creating a read-only memslot for the
374 * MMIO region would prevent silently clobbering the MMIO region.
375 */
376 slot0 = memslot2region(vm, 0);
377 ucall_init(vm, slot0->region.guest_phys_addr + slot0->region.memory_size);
378
379 kvm_arch_vm_post_create(vm);
380
381 return vm;
382 }
383
384 /*
385 * VM Create with customized parameters
386 *
387 * Input Args:
388 * mode - VM Mode (e.g. VM_MODE_P52V48_4K)
389 * nr_vcpus - VCPU count
390 * extra_mem_pages - Non-slot0 physical memory total size
391 * guest_code - Guest entry point
392 * vcpuids - VCPU IDs
393 *
394 * Output Args: None
395 *
396 * Return:
397 * Pointer to opaque structure that describes the created VM.
398 *
399 * Creates a VM with the mode specified by mode (e.g. VM_MODE_P52V48_4K).
400 * extra_mem_pages is only used to calculate the maximum page table size,
401 * no real memory allocation for non-slot0 memory in this function.
402 */
__vm_create_with_vcpus(enum vm_guest_mode mode,uint32_t nr_vcpus,uint64_t extra_mem_pages,void * guest_code,struct kvm_vcpu * vcpus[])403 struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
404 uint64_t extra_mem_pages,
405 void *guest_code, struct kvm_vcpu *vcpus[])
406 {
407 struct kvm_vm *vm;
408 int i;
409
410 TEST_ASSERT(!nr_vcpus || vcpus, "Must provide vCPU array");
411
412 vm = __vm_create(mode, nr_vcpus, extra_mem_pages);
413
414 for (i = 0; i < nr_vcpus; ++i)
415 vcpus[i] = vm_vcpu_add(vm, i, guest_code);
416
417 return vm;
418 }
419
__vm_create_with_one_vcpu(struct kvm_vcpu ** vcpu,uint64_t extra_mem_pages,void * guest_code)420 struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu,
421 uint64_t extra_mem_pages,
422 void *guest_code)
423 {
424 struct kvm_vcpu *vcpus[1];
425 struct kvm_vm *vm;
426
427 vm = __vm_create_with_vcpus(VM_MODE_DEFAULT, 1, extra_mem_pages,
428 guest_code, vcpus);
429
430 *vcpu = vcpus[0];
431 return vm;
432 }
433
434 /*
435 * VM Restart
436 *
437 * Input Args:
438 * vm - VM that has been released before
439 *
440 * Output Args: None
441 *
442 * Reopens the file descriptors associated to the VM and reinstates the
443 * global state, such as the irqchip and the memory regions that are mapped
444 * into the guest.
445 */
kvm_vm_restart(struct kvm_vm * vmp)446 void kvm_vm_restart(struct kvm_vm *vmp)
447 {
448 int ctr;
449 struct userspace_mem_region *region;
450
451 vm_open(vmp);
452 if (vmp->has_irqchip)
453 vm_create_irqchip(vmp);
454
455 hash_for_each(vmp->regions.slot_hash, ctr, region, slot_node) {
456 int ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region);
457 TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n"
458 " rc: %i errno: %i\n"
459 " slot: %u flags: 0x%x\n"
460 " guest_phys_addr: 0x%llx size: 0x%llx",
461 ret, errno, region->region.slot,
462 region->region.flags,
463 region->region.guest_phys_addr,
464 region->region.memory_size);
465 }
466 }
467
vm_arch_vcpu_recreate(struct kvm_vm * vm,uint32_t vcpu_id)468 __weak struct kvm_vcpu *vm_arch_vcpu_recreate(struct kvm_vm *vm,
469 uint32_t vcpu_id)
470 {
471 return __vm_vcpu_add(vm, vcpu_id);
472 }
473
vm_recreate_with_one_vcpu(struct kvm_vm * vm)474 struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm)
475 {
476 kvm_vm_restart(vm);
477
478 return vm_vcpu_recreate(vm, 0);
479 }
480
kvm_pin_this_task_to_pcpu(uint32_t pcpu)481 void kvm_pin_this_task_to_pcpu(uint32_t pcpu)
482 {
483 cpu_set_t mask;
484 int r;
485
486 CPU_ZERO(&mask);
487 CPU_SET(pcpu, &mask);
488 r = sched_setaffinity(0, sizeof(mask), &mask);
489 TEST_ASSERT(!r, "sched_setaffinity() failed for pCPU '%u'.\n", pcpu);
490 }
491
parse_pcpu(const char * cpu_str,const cpu_set_t * allowed_mask)492 static uint32_t parse_pcpu(const char *cpu_str, const cpu_set_t *allowed_mask)
493 {
494 uint32_t pcpu = atoi_non_negative("CPU number", cpu_str);
495
496 TEST_ASSERT(CPU_ISSET(pcpu, allowed_mask),
497 "Not allowed to run on pCPU '%d', check cgroups?\n", pcpu);
498 return pcpu;
499 }
500
kvm_print_vcpu_pinning_help(void)501 void kvm_print_vcpu_pinning_help(void)
502 {
503 const char *name = program_invocation_name;
504
505 printf(" -c: Pin tasks to physical CPUs. Takes a list of comma separated\n"
506 " values (target pCPU), one for each vCPU, plus an optional\n"
507 " entry for the main application task (specified via entry\n"
508 " <nr_vcpus + 1>). If used, entries must be provided for all\n"
509 " vCPUs, i.e. pinning vCPUs is all or nothing.\n\n"
510 " E.g. to create 3 vCPUs, pin vCPU0=>pCPU22, vCPU1=>pCPU23,\n"
511 " vCPU2=>pCPU24, and pin the application task to pCPU50:\n\n"
512 " %s -v 3 -c 22,23,24,50\n\n"
513 " To leave the application task unpinned, drop the final entry:\n\n"
514 " %s -v 3 -c 22,23,24\n\n"
515 " (default: no pinning)\n", name, name);
516 }
517
kvm_parse_vcpu_pinning(const char * pcpus_string,uint32_t vcpu_to_pcpu[],int nr_vcpus)518 void kvm_parse_vcpu_pinning(const char *pcpus_string, uint32_t vcpu_to_pcpu[],
519 int nr_vcpus)
520 {
521 cpu_set_t allowed_mask;
522 char *cpu, *cpu_list;
523 char delim[2] = ",";
524 int i, r;
525
526 cpu_list = strdup(pcpus_string);
527 TEST_ASSERT(cpu_list, "strdup() allocation failed.\n");
528
529 r = sched_getaffinity(0, sizeof(allowed_mask), &allowed_mask);
530 TEST_ASSERT(!r, "sched_getaffinity() failed");
531
532 cpu = strtok(cpu_list, delim);
533
534 /* 1. Get all pcpus for vcpus. */
535 for (i = 0; i < nr_vcpus; i++) {
536 TEST_ASSERT(cpu, "pCPU not provided for vCPU '%d'\n", i);
537 vcpu_to_pcpu[i] = parse_pcpu(cpu, &allowed_mask);
538 cpu = strtok(NULL, delim);
539 }
540
541 /* 2. Check if the main worker needs to be pinned. */
542 if (cpu) {
543 kvm_pin_this_task_to_pcpu(parse_pcpu(cpu, &allowed_mask));
544 cpu = strtok(NULL, delim);
545 }
546
547 TEST_ASSERT(!cpu, "pCPU list contains trailing garbage characters '%s'", cpu);
548 free(cpu_list);
549 }
550
551 /*
552 * Userspace Memory Region Find
553 *
554 * Input Args:
555 * vm - Virtual Machine
556 * start - Starting VM physical address
557 * end - Ending VM physical address, inclusive.
558 *
559 * Output Args: None
560 *
561 * Return:
562 * Pointer to overlapping region, NULL if no such region.
563 *
564 * Searches for a region with any physical memory that overlaps with
565 * any portion of the guest physical addresses from start to end
566 * inclusive. If multiple overlapping regions exist, a pointer to any
567 * of the regions is returned. Null is returned only when no overlapping
568 * region exists.
569 */
570 static struct userspace_mem_region *
userspace_mem_region_find(struct kvm_vm * vm,uint64_t start,uint64_t end)571 userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end)
572 {
573 struct rb_node *node;
574
575 for (node = vm->regions.gpa_tree.rb_node; node; ) {
576 struct userspace_mem_region *region =
577 container_of(node, struct userspace_mem_region, gpa_node);
578 uint64_t existing_start = region->region.guest_phys_addr;
579 uint64_t existing_end = region->region.guest_phys_addr
580 + region->region.memory_size - 1;
581 if (start <= existing_end && end >= existing_start)
582 return region;
583
584 if (start < existing_start)
585 node = node->rb_left;
586 else
587 node = node->rb_right;
588 }
589
590 return NULL;
591 }
592
593 /*
594 * KVM Userspace Memory Region Find
595 *
596 * Input Args:
597 * vm - Virtual Machine
598 * start - Starting VM physical address
599 * end - Ending VM physical address, inclusive.
600 *
601 * Output Args: None
602 *
603 * Return:
604 * Pointer to overlapping region, NULL if no such region.
605 *
606 * Public interface to userspace_mem_region_find. Allows tests to look up
607 * the memslot datastructure for a given range of guest physical memory.
608 */
609 struct kvm_userspace_memory_region *
kvm_userspace_memory_region_find(struct kvm_vm * vm,uint64_t start,uint64_t end)610 kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start,
611 uint64_t end)
612 {
613 struct userspace_mem_region *region;
614
615 region = userspace_mem_region_find(vm, start, end);
616 if (!region)
617 return NULL;
618
619 return ®ion->region;
620 }
621
vcpu_arch_free(struct kvm_vcpu * vcpu)622 __weak void vcpu_arch_free(struct kvm_vcpu *vcpu)
623 {
624
625 }
626
627 /*
628 * VM VCPU Remove
629 *
630 * Input Args:
631 * vcpu - VCPU to remove
632 *
633 * Output Args: None
634 *
635 * Return: None, TEST_ASSERT failures for all error conditions
636 *
637 * Removes a vCPU from a VM and frees its resources.
638 */
vm_vcpu_rm(struct kvm_vm * vm,struct kvm_vcpu * vcpu)639 static void vm_vcpu_rm(struct kvm_vm *vm, struct kvm_vcpu *vcpu)
640 {
641 int ret;
642
643 if (vcpu->dirty_gfns) {
644 ret = munmap(vcpu->dirty_gfns, vm->dirty_ring_size);
645 TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret));
646 vcpu->dirty_gfns = NULL;
647 }
648
649 ret = munmap(vcpu->run, vcpu_mmap_sz());
650 TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret));
651
652 ret = close(vcpu->fd);
653 TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret));
654
655 list_del(&vcpu->list);
656
657 vcpu_arch_free(vcpu);
658 free(vcpu);
659 }
660
kvm_vm_release(struct kvm_vm * vmp)661 void kvm_vm_release(struct kvm_vm *vmp)
662 {
663 struct kvm_vcpu *vcpu, *tmp;
664 int ret;
665
666 list_for_each_entry_safe(vcpu, tmp, &vmp->vcpus, list)
667 vm_vcpu_rm(vmp, vcpu);
668
669 ret = close(vmp->fd);
670 TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret));
671
672 ret = close(vmp->kvm_fd);
673 TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret));
674 }
675
__vm_mem_region_delete(struct kvm_vm * vm,struct userspace_mem_region * region,bool unlink)676 static void __vm_mem_region_delete(struct kvm_vm *vm,
677 struct userspace_mem_region *region,
678 bool unlink)
679 {
680 int ret;
681
682 if (unlink) {
683 rb_erase(®ion->gpa_node, &vm->regions.gpa_tree);
684 rb_erase(®ion->hva_node, &vm->regions.hva_tree);
685 hash_del(®ion->slot_node);
686 }
687
688 region->region.memory_size = 0;
689 vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region);
690
691 sparsebit_free(®ion->unused_phy_pages);
692 ret = munmap(region->mmap_start, region->mmap_size);
693 TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret));
694 if (region->fd >= 0) {
695 /* There's an extra map when using shared memory. */
696 ret = munmap(region->mmap_alias, region->mmap_size);
697 TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("munmap()", ret));
698 close(region->fd);
699 }
700
701 free(region);
702 }
703
704 /*
705 * Destroys and frees the VM pointed to by vmp.
706 */
kvm_vm_free(struct kvm_vm * vmp)707 void kvm_vm_free(struct kvm_vm *vmp)
708 {
709 int ctr;
710 struct hlist_node *node;
711 struct userspace_mem_region *region;
712
713 if (vmp == NULL)
714 return;
715
716 /* Free cached stats metadata and close FD */
717 if (vmp->stats_fd) {
718 free(vmp->stats_desc);
719 close(vmp->stats_fd);
720 }
721
722 /* Free userspace_mem_regions. */
723 hash_for_each_safe(vmp->regions.slot_hash, ctr, node, region, slot_node)
724 __vm_mem_region_delete(vmp, region, false);
725
726 /* Free sparsebit arrays. */
727 sparsebit_free(&vmp->vpages_valid);
728 sparsebit_free(&vmp->vpages_mapped);
729
730 kvm_vm_release(vmp);
731
732 /* Free the structure describing the VM. */
733 free(vmp);
734 }
735
kvm_memfd_alloc(size_t size,bool hugepages)736 int kvm_memfd_alloc(size_t size, bool hugepages)
737 {
738 int memfd_flags = MFD_CLOEXEC;
739 int fd, r;
740
741 if (hugepages)
742 memfd_flags |= MFD_HUGETLB;
743
744 fd = memfd_create("kvm_selftest", memfd_flags);
745 TEST_ASSERT(fd != -1, __KVM_SYSCALL_ERROR("memfd_create()", fd));
746
747 r = ftruncate(fd, size);
748 TEST_ASSERT(!r, __KVM_SYSCALL_ERROR("ftruncate()", r));
749
750 r = fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, size);
751 TEST_ASSERT(!r, __KVM_SYSCALL_ERROR("fallocate()", r));
752
753 return fd;
754 }
755
756 /*
757 * Memory Compare, host virtual to guest virtual
758 *
759 * Input Args:
760 * hva - Starting host virtual address
761 * vm - Virtual Machine
762 * gva - Starting guest virtual address
763 * len - number of bytes to compare
764 *
765 * Output Args: None
766 *
767 * Input/Output Args: None
768 *
769 * Return:
770 * Returns 0 if the bytes starting at hva for a length of len
771 * are equal the guest virtual bytes starting at gva. Returns
772 * a value < 0, if bytes at hva are less than those at gva.
773 * Otherwise a value > 0 is returned.
774 *
775 * Compares the bytes starting at the host virtual address hva, for
776 * a length of len, to the guest bytes starting at the guest virtual
777 * address given by gva.
778 */
kvm_memcmp_hva_gva(void * hva,struct kvm_vm * vm,vm_vaddr_t gva,size_t len)779 int kvm_memcmp_hva_gva(void *hva, struct kvm_vm *vm, vm_vaddr_t gva, size_t len)
780 {
781 size_t amt;
782
783 /*
784 * Compare a batch of bytes until either a match is found
785 * or all the bytes have been compared.
786 */
787 for (uintptr_t offset = 0; offset < len; offset += amt) {
788 uintptr_t ptr1 = (uintptr_t)hva + offset;
789
790 /*
791 * Determine host address for guest virtual address
792 * at offset.
793 */
794 uintptr_t ptr2 = (uintptr_t)addr_gva2hva(vm, gva + offset);
795
796 /*
797 * Determine amount to compare on this pass.
798 * Don't allow the comparsion to cross a page boundary.
799 */
800 amt = len - offset;
801 if ((ptr1 >> vm->page_shift) != ((ptr1 + amt) >> vm->page_shift))
802 amt = vm->page_size - (ptr1 % vm->page_size);
803 if ((ptr2 >> vm->page_shift) != ((ptr2 + amt) >> vm->page_shift))
804 amt = vm->page_size - (ptr2 % vm->page_size);
805
806 assert((ptr1 >> vm->page_shift) == ((ptr1 + amt - 1) >> vm->page_shift));
807 assert((ptr2 >> vm->page_shift) == ((ptr2 + amt - 1) >> vm->page_shift));
808
809 /*
810 * Perform the comparison. If there is a difference
811 * return that result to the caller, otherwise need
812 * to continue on looking for a mismatch.
813 */
814 int ret = memcmp((void *)ptr1, (void *)ptr2, amt);
815 if (ret != 0)
816 return ret;
817 }
818
819 /*
820 * No mismatch found. Let the caller know the two memory
821 * areas are equal.
822 */
823 return 0;
824 }
825
vm_userspace_mem_region_gpa_insert(struct rb_root * gpa_tree,struct userspace_mem_region * region)826 static void vm_userspace_mem_region_gpa_insert(struct rb_root *gpa_tree,
827 struct userspace_mem_region *region)
828 {
829 struct rb_node **cur, *parent;
830
831 for (cur = &gpa_tree->rb_node, parent = NULL; *cur; ) {
832 struct userspace_mem_region *cregion;
833
834 cregion = container_of(*cur, typeof(*cregion), gpa_node);
835 parent = *cur;
836 if (region->region.guest_phys_addr <
837 cregion->region.guest_phys_addr)
838 cur = &(*cur)->rb_left;
839 else {
840 TEST_ASSERT(region->region.guest_phys_addr !=
841 cregion->region.guest_phys_addr,
842 "Duplicate GPA in region tree");
843
844 cur = &(*cur)->rb_right;
845 }
846 }
847
848 rb_link_node(®ion->gpa_node, parent, cur);
849 rb_insert_color(®ion->gpa_node, gpa_tree);
850 }
851
vm_userspace_mem_region_hva_insert(struct rb_root * hva_tree,struct userspace_mem_region * region)852 static void vm_userspace_mem_region_hva_insert(struct rb_root *hva_tree,
853 struct userspace_mem_region *region)
854 {
855 struct rb_node **cur, *parent;
856
857 for (cur = &hva_tree->rb_node, parent = NULL; *cur; ) {
858 struct userspace_mem_region *cregion;
859
860 cregion = container_of(*cur, typeof(*cregion), hva_node);
861 parent = *cur;
862 if (region->host_mem < cregion->host_mem)
863 cur = &(*cur)->rb_left;
864 else {
865 TEST_ASSERT(region->host_mem !=
866 cregion->host_mem,
867 "Duplicate HVA in region tree");
868
869 cur = &(*cur)->rb_right;
870 }
871 }
872
873 rb_link_node(®ion->hva_node, parent, cur);
874 rb_insert_color(®ion->hva_node, hva_tree);
875 }
876
877
__vm_set_user_memory_region(struct kvm_vm * vm,uint32_t slot,uint32_t flags,uint64_t gpa,uint64_t size,void * hva)878 int __vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags,
879 uint64_t gpa, uint64_t size, void *hva)
880 {
881 struct kvm_userspace_memory_region region = {
882 .slot = slot,
883 .flags = flags,
884 .guest_phys_addr = gpa,
885 .memory_size = size,
886 .userspace_addr = (uintptr_t)hva,
887 };
888
889 return ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, ®ion);
890 }
891
vm_set_user_memory_region(struct kvm_vm * vm,uint32_t slot,uint32_t flags,uint64_t gpa,uint64_t size,void * hva)892 void vm_set_user_memory_region(struct kvm_vm *vm, uint32_t slot, uint32_t flags,
893 uint64_t gpa, uint64_t size, void *hva)
894 {
895 int ret = __vm_set_user_memory_region(vm, slot, flags, gpa, size, hva);
896
897 TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed, errno = %d (%s)",
898 errno, strerror(errno));
899 }
900
901 /*
902 * VM Userspace Memory Region Add
903 *
904 * Input Args:
905 * vm - Virtual Machine
906 * src_type - Storage source for this region.
907 * NULL to use anonymous memory.
908 * guest_paddr - Starting guest physical address
909 * slot - KVM region slot
910 * npages - Number of physical pages
911 * flags - KVM memory region flags (e.g. KVM_MEM_LOG_DIRTY_PAGES)
912 *
913 * Output Args: None
914 *
915 * Return: None
916 *
917 * Allocates a memory area of the number of pages specified by npages
918 * and maps it to the VM specified by vm, at a starting physical address
919 * given by guest_paddr. The region is created with a KVM region slot
920 * given by slot, which must be unique and < KVM_MEM_SLOTS_NUM. The
921 * region is created with the flags given by flags.
922 */
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)923 void vm_userspace_mem_region_add(struct kvm_vm *vm,
924 enum vm_mem_backing_src_type src_type,
925 uint64_t guest_paddr, uint32_t slot, uint64_t npages,
926 uint32_t flags)
927 {
928 int ret;
929 struct userspace_mem_region *region;
930 size_t backing_src_pagesz = get_backing_src_pagesz(src_type);
931 size_t alignment;
932
933 TEST_ASSERT(vm_adjust_num_guest_pages(vm->mode, npages) == npages,
934 "Number of guest pages is not compatible with the host. "
935 "Try npages=%d", vm_adjust_num_guest_pages(vm->mode, npages));
936
937 TEST_ASSERT((guest_paddr % vm->page_size) == 0, "Guest physical "
938 "address not on a page boundary.\n"
939 " guest_paddr: 0x%lx vm->page_size: 0x%x",
940 guest_paddr, vm->page_size);
941 TEST_ASSERT((((guest_paddr >> vm->page_shift) + npages) - 1)
942 <= vm->max_gfn, "Physical range beyond maximum "
943 "supported physical address,\n"
944 " guest_paddr: 0x%lx npages: 0x%lx\n"
945 " vm->max_gfn: 0x%lx vm->page_size: 0x%x",
946 guest_paddr, npages, vm->max_gfn, vm->page_size);
947
948 /*
949 * Confirm a mem region with an overlapping address doesn't
950 * already exist.
951 */
952 region = (struct userspace_mem_region *) userspace_mem_region_find(
953 vm, guest_paddr, (guest_paddr + npages * vm->page_size) - 1);
954 if (region != NULL)
955 TEST_FAIL("overlapping userspace_mem_region already "
956 "exists\n"
957 " requested guest_paddr: 0x%lx npages: 0x%lx "
958 "page_size: 0x%x\n"
959 " existing guest_paddr: 0x%lx size: 0x%lx",
960 guest_paddr, npages, vm->page_size,
961 (uint64_t) region->region.guest_phys_addr,
962 (uint64_t) region->region.memory_size);
963
964 /* Confirm no region with the requested slot already exists. */
965 hash_for_each_possible(vm->regions.slot_hash, region, slot_node,
966 slot) {
967 if (region->region.slot != slot)
968 continue;
969
970 TEST_FAIL("A mem region with the requested slot "
971 "already exists.\n"
972 " requested slot: %u paddr: 0x%lx npages: 0x%lx\n"
973 " existing slot: %u paddr: 0x%lx size: 0x%lx",
974 slot, guest_paddr, npages,
975 region->region.slot,
976 (uint64_t) region->region.guest_phys_addr,
977 (uint64_t) region->region.memory_size);
978 }
979
980 /* Allocate and initialize new mem region structure. */
981 region = calloc(1, sizeof(*region));
982 TEST_ASSERT(region != NULL, "Insufficient Memory");
983 region->mmap_size = npages * vm->page_size;
984
985 #ifdef __s390x__
986 /* On s390x, the host address must be aligned to 1M (due to PGSTEs) */
987 alignment = 0x100000;
988 #else
989 alignment = 1;
990 #endif
991
992 /*
993 * When using THP mmap is not guaranteed to returned a hugepage aligned
994 * address so we have to pad the mmap. Padding is not needed for HugeTLB
995 * because mmap will always return an address aligned to the HugeTLB
996 * page size.
997 */
998 if (src_type == VM_MEM_SRC_ANONYMOUS_THP)
999 alignment = max(backing_src_pagesz, alignment);
1000
1001 TEST_ASSERT_EQ(guest_paddr, align_up(guest_paddr, backing_src_pagesz));
1002
1003 /* Add enough memory to align up if necessary */
1004 if (alignment > 1)
1005 region->mmap_size += alignment;
1006
1007 region->fd = -1;
1008 if (backing_src_is_shared(src_type))
1009 region->fd = kvm_memfd_alloc(region->mmap_size,
1010 src_type == VM_MEM_SRC_SHARED_HUGETLB);
1011
1012 region->mmap_start = mmap(NULL, region->mmap_size,
1013 PROT_READ | PROT_WRITE,
1014 vm_mem_backing_src_alias(src_type)->flag,
1015 region->fd, 0);
1016 TEST_ASSERT(region->mmap_start != MAP_FAILED,
1017 __KVM_SYSCALL_ERROR("mmap()", (int)(unsigned long)MAP_FAILED));
1018
1019 TEST_ASSERT(!is_backing_src_hugetlb(src_type) ||
1020 region->mmap_start == align_ptr_up(region->mmap_start, backing_src_pagesz),
1021 "mmap_start %p is not aligned to HugeTLB page size 0x%lx",
1022 region->mmap_start, backing_src_pagesz);
1023
1024 /* Align host address */
1025 region->host_mem = align_ptr_up(region->mmap_start, alignment);
1026
1027 /* As needed perform madvise */
1028 if ((src_type == VM_MEM_SRC_ANONYMOUS ||
1029 src_type == VM_MEM_SRC_ANONYMOUS_THP) && thp_configured()) {
1030 ret = madvise(region->host_mem, npages * vm->page_size,
1031 src_type == VM_MEM_SRC_ANONYMOUS ? MADV_NOHUGEPAGE : MADV_HUGEPAGE);
1032 TEST_ASSERT(ret == 0, "madvise failed, addr: %p length: 0x%lx src_type: %s",
1033 region->host_mem, npages * vm->page_size,
1034 vm_mem_backing_src_alias(src_type)->name);
1035 }
1036
1037 region->backing_src_type = src_type;
1038 region->unused_phy_pages = sparsebit_alloc();
1039 sparsebit_set_num(region->unused_phy_pages,
1040 guest_paddr >> vm->page_shift, npages);
1041 region->region.slot = slot;
1042 region->region.flags = flags;
1043 region->region.guest_phys_addr = guest_paddr;
1044 region->region.memory_size = npages * vm->page_size;
1045 region->region.userspace_addr = (uintptr_t) region->host_mem;
1046 ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region);
1047 TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n"
1048 " rc: %i errno: %i\n"
1049 " slot: %u flags: 0x%x\n"
1050 " guest_phys_addr: 0x%lx size: 0x%lx",
1051 ret, errno, slot, flags,
1052 guest_paddr, (uint64_t) region->region.memory_size);
1053
1054 /* Add to quick lookup data structures */
1055 vm_userspace_mem_region_gpa_insert(&vm->regions.gpa_tree, region);
1056 vm_userspace_mem_region_hva_insert(&vm->regions.hva_tree, region);
1057 hash_add(vm->regions.slot_hash, ®ion->slot_node, slot);
1058
1059 /* If shared memory, create an alias. */
1060 if (region->fd >= 0) {
1061 region->mmap_alias = mmap(NULL, region->mmap_size,
1062 PROT_READ | PROT_WRITE,
1063 vm_mem_backing_src_alias(src_type)->flag,
1064 region->fd, 0);
1065 TEST_ASSERT(region->mmap_alias != MAP_FAILED,
1066 __KVM_SYSCALL_ERROR("mmap()", (int)(unsigned long)MAP_FAILED));
1067
1068 /* Align host alias address */
1069 region->host_alias = align_ptr_up(region->mmap_alias, alignment);
1070 }
1071 }
1072
1073 /*
1074 * Memslot to region
1075 *
1076 * Input Args:
1077 * vm - Virtual Machine
1078 * memslot - KVM memory slot ID
1079 *
1080 * Output Args: None
1081 *
1082 * Return:
1083 * Pointer to memory region structure that describe memory region
1084 * using kvm memory slot ID given by memslot. TEST_ASSERT failure
1085 * on error (e.g. currently no memory region using memslot as a KVM
1086 * memory slot ID).
1087 */
1088 struct userspace_mem_region *
memslot2region(struct kvm_vm * vm,uint32_t memslot)1089 memslot2region(struct kvm_vm *vm, uint32_t memslot)
1090 {
1091 struct userspace_mem_region *region;
1092
1093 hash_for_each_possible(vm->regions.slot_hash, region, slot_node,
1094 memslot)
1095 if (region->region.slot == memslot)
1096 return region;
1097
1098 fprintf(stderr, "No mem region with the requested slot found,\n"
1099 " requested slot: %u\n", memslot);
1100 fputs("---- vm dump ----\n", stderr);
1101 vm_dump(stderr, vm, 2);
1102 TEST_FAIL("Mem region not found");
1103 return NULL;
1104 }
1105
1106 /*
1107 * VM Memory Region Flags Set
1108 *
1109 * Input Args:
1110 * vm - Virtual Machine
1111 * flags - Starting guest physical address
1112 *
1113 * Output Args: None
1114 *
1115 * Return: None
1116 *
1117 * Sets the flags of the memory region specified by the value of slot,
1118 * to the values given by flags.
1119 */
vm_mem_region_set_flags(struct kvm_vm * vm,uint32_t slot,uint32_t flags)1120 void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags)
1121 {
1122 int ret;
1123 struct userspace_mem_region *region;
1124
1125 region = memslot2region(vm, slot);
1126
1127 region->region.flags = flags;
1128
1129 ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region);
1130
1131 TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION IOCTL failed,\n"
1132 " rc: %i errno: %i slot: %u flags: 0x%x",
1133 ret, errno, slot, flags);
1134 }
1135
1136 /*
1137 * VM Memory Region Move
1138 *
1139 * Input Args:
1140 * vm - Virtual Machine
1141 * slot - Slot of the memory region to move
1142 * new_gpa - Starting guest physical address
1143 *
1144 * Output Args: None
1145 *
1146 * Return: None
1147 *
1148 * Change the gpa of a memory region.
1149 */
vm_mem_region_move(struct kvm_vm * vm,uint32_t slot,uint64_t new_gpa)1150 void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa)
1151 {
1152 struct userspace_mem_region *region;
1153 int ret;
1154
1155 region = memslot2region(vm, slot);
1156
1157 region->region.guest_phys_addr = new_gpa;
1158
1159 ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION, ®ion->region);
1160
1161 TEST_ASSERT(!ret, "KVM_SET_USER_MEMORY_REGION failed\n"
1162 "ret: %i errno: %i slot: %u new_gpa: 0x%lx",
1163 ret, errno, slot, new_gpa);
1164 }
1165
1166 /*
1167 * VM Memory Region Delete
1168 *
1169 * Input Args:
1170 * vm - Virtual Machine
1171 * slot - Slot of the memory region to delete
1172 *
1173 * Output Args: None
1174 *
1175 * Return: None
1176 *
1177 * Delete a memory region.
1178 */
vm_mem_region_delete(struct kvm_vm * vm,uint32_t slot)1179 void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot)
1180 {
1181 __vm_mem_region_delete(vm, memslot2region(vm, slot), true);
1182 }
1183
1184 /* Returns the size of a vCPU's kvm_run structure. */
vcpu_mmap_sz(void)1185 static int vcpu_mmap_sz(void)
1186 {
1187 int dev_fd, ret;
1188
1189 dev_fd = open_kvm_dev_path_or_exit();
1190
1191 ret = ioctl(dev_fd, KVM_GET_VCPU_MMAP_SIZE, NULL);
1192 TEST_ASSERT(ret >= sizeof(struct kvm_run),
1193 KVM_IOCTL_ERROR(KVM_GET_VCPU_MMAP_SIZE, ret));
1194
1195 close(dev_fd);
1196
1197 return ret;
1198 }
1199
vcpu_exists(struct kvm_vm * vm,uint32_t vcpu_id)1200 static bool vcpu_exists(struct kvm_vm *vm, uint32_t vcpu_id)
1201 {
1202 struct kvm_vcpu *vcpu;
1203
1204 list_for_each_entry(vcpu, &vm->vcpus, list) {
1205 if (vcpu->id == vcpu_id)
1206 return true;
1207 }
1208
1209 return false;
1210 }
1211
1212 /*
1213 * Adds a virtual CPU to the VM specified by vm with the ID given by vcpu_id.
1214 * No additional vCPU setup is done. Returns the vCPU.
1215 */
__vm_vcpu_add(struct kvm_vm * vm,uint32_t vcpu_id)1216 struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id)
1217 {
1218 struct kvm_vcpu *vcpu;
1219
1220 /* Confirm a vcpu with the specified id doesn't already exist. */
1221 TEST_ASSERT(!vcpu_exists(vm, vcpu_id), "vCPU%d already exists\n", vcpu_id);
1222
1223 /* Allocate and initialize new vcpu structure. */
1224 vcpu = calloc(1, sizeof(*vcpu));
1225 TEST_ASSERT(vcpu != NULL, "Insufficient Memory");
1226
1227 vcpu->vm = vm;
1228 vcpu->id = vcpu_id;
1229 vcpu->fd = __vm_ioctl(vm, KVM_CREATE_VCPU, (void *)(unsigned long)vcpu_id);
1230 TEST_ASSERT(vcpu->fd >= 0, KVM_IOCTL_ERROR(KVM_CREATE_VCPU, vcpu->fd));
1231
1232 TEST_ASSERT(vcpu_mmap_sz() >= sizeof(*vcpu->run), "vcpu mmap size "
1233 "smaller than expected, vcpu_mmap_sz: %i expected_min: %zi",
1234 vcpu_mmap_sz(), sizeof(*vcpu->run));
1235 vcpu->run = (struct kvm_run *) mmap(NULL, vcpu_mmap_sz(),
1236 PROT_READ | PROT_WRITE, MAP_SHARED, vcpu->fd, 0);
1237 TEST_ASSERT(vcpu->run != MAP_FAILED,
1238 __KVM_SYSCALL_ERROR("mmap()", (int)(unsigned long)MAP_FAILED));
1239
1240 /* Add to linked-list of VCPUs. */
1241 list_add(&vcpu->list, &vm->vcpus);
1242
1243 return vcpu;
1244 }
1245
1246 /*
1247 * VM Virtual Address Unused Gap
1248 *
1249 * Input Args:
1250 * vm - Virtual Machine
1251 * sz - Size (bytes)
1252 * vaddr_min - Minimum Virtual Address
1253 *
1254 * Output Args: None
1255 *
1256 * Return:
1257 * Lowest virtual address at or below vaddr_min, with at least
1258 * sz unused bytes. TEST_ASSERT failure if no area of at least
1259 * size sz is available.
1260 *
1261 * Within the VM specified by vm, locates the lowest starting virtual
1262 * address >= vaddr_min, that has at least sz unallocated bytes. A
1263 * TEST_ASSERT failure occurs for invalid input or no area of at least
1264 * sz unallocated bytes >= vaddr_min is available.
1265 */
vm_vaddr_unused_gap(struct kvm_vm * vm,size_t sz,vm_vaddr_t vaddr_min)1266 vm_vaddr_t vm_vaddr_unused_gap(struct kvm_vm *vm, size_t sz,
1267 vm_vaddr_t vaddr_min)
1268 {
1269 uint64_t pages = (sz + vm->page_size - 1) >> vm->page_shift;
1270
1271 /* Determine lowest permitted virtual page index. */
1272 uint64_t pgidx_start = (vaddr_min + vm->page_size - 1) >> vm->page_shift;
1273 if ((pgidx_start * vm->page_size) < vaddr_min)
1274 goto no_va_found;
1275
1276 /* Loop over section with enough valid virtual page indexes. */
1277 if (!sparsebit_is_set_num(vm->vpages_valid,
1278 pgidx_start, pages))
1279 pgidx_start = sparsebit_next_set_num(vm->vpages_valid,
1280 pgidx_start, pages);
1281 do {
1282 /*
1283 * Are there enough unused virtual pages available at
1284 * the currently proposed starting virtual page index.
1285 * If not, adjust proposed starting index to next
1286 * possible.
1287 */
1288 if (sparsebit_is_clear_num(vm->vpages_mapped,
1289 pgidx_start, pages))
1290 goto va_found;
1291 pgidx_start = sparsebit_next_clear_num(vm->vpages_mapped,
1292 pgidx_start, pages);
1293 if (pgidx_start == 0)
1294 goto no_va_found;
1295
1296 /*
1297 * If needed, adjust proposed starting virtual address,
1298 * to next range of valid virtual addresses.
1299 */
1300 if (!sparsebit_is_set_num(vm->vpages_valid,
1301 pgidx_start, pages)) {
1302 pgidx_start = sparsebit_next_set_num(
1303 vm->vpages_valid, pgidx_start, pages);
1304 if (pgidx_start == 0)
1305 goto no_va_found;
1306 }
1307 } while (pgidx_start != 0);
1308
1309 no_va_found:
1310 TEST_FAIL("No vaddr of specified pages available, pages: 0x%lx", pages);
1311
1312 /* NOT REACHED */
1313 return -1;
1314
1315 va_found:
1316 TEST_ASSERT(sparsebit_is_set_num(vm->vpages_valid,
1317 pgidx_start, pages),
1318 "Unexpected, invalid virtual page index range,\n"
1319 " pgidx_start: 0x%lx\n"
1320 " pages: 0x%lx",
1321 pgidx_start, pages);
1322 TEST_ASSERT(sparsebit_is_clear_num(vm->vpages_mapped,
1323 pgidx_start, pages),
1324 "Unexpected, pages already mapped,\n"
1325 " pgidx_start: 0x%lx\n"
1326 " pages: 0x%lx",
1327 pgidx_start, pages);
1328
1329 return pgidx_start * vm->page_size;
1330 }
1331
__vm_vaddr_alloc(struct kvm_vm * vm,size_t sz,vm_vaddr_t vaddr_min,enum kvm_mem_region_type type)1332 vm_vaddr_t __vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
1333 enum kvm_mem_region_type type)
1334 {
1335 uint64_t pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0);
1336
1337 virt_pgd_alloc(vm);
1338 vm_paddr_t paddr = vm_phy_pages_alloc(vm, pages,
1339 KVM_UTIL_MIN_PFN * vm->page_size,
1340 vm->memslots[type]);
1341
1342 /*
1343 * Find an unused range of virtual page addresses of at least
1344 * pages in length.
1345 */
1346 vm_vaddr_t vaddr_start = vm_vaddr_unused_gap(vm, sz, vaddr_min);
1347
1348 /* Map the virtual pages. */
1349 for (vm_vaddr_t vaddr = vaddr_start; pages > 0;
1350 pages--, vaddr += vm->page_size, paddr += vm->page_size) {
1351
1352 virt_pg_map(vm, vaddr, paddr);
1353
1354 sparsebit_set(vm->vpages_mapped, vaddr >> vm->page_shift);
1355 }
1356
1357 return vaddr_start;
1358 }
1359
1360 /*
1361 * VM Virtual Address Allocate
1362 *
1363 * Input Args:
1364 * vm - Virtual Machine
1365 * sz - Size in bytes
1366 * vaddr_min - Minimum starting virtual address
1367 *
1368 * Output Args: None
1369 *
1370 * Return:
1371 * Starting guest virtual address
1372 *
1373 * Allocates at least sz bytes within the virtual address space of the vm
1374 * given by vm. The allocated bytes are mapped to a virtual address >=
1375 * the address given by vaddr_min. Note that each allocation uses a
1376 * a unique set of pages, with the minimum real allocation being at least
1377 * a page. The allocated physical space comes from the TEST_DATA memory region.
1378 */
vm_vaddr_alloc(struct kvm_vm * vm,size_t sz,vm_vaddr_t vaddr_min)1379 vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min)
1380 {
1381 return __vm_vaddr_alloc(vm, sz, vaddr_min, MEM_REGION_TEST_DATA);
1382 }
1383
1384 /*
1385 * VM Virtual Address Allocate Pages
1386 *
1387 * Input Args:
1388 * vm - Virtual Machine
1389 *
1390 * Output Args: None
1391 *
1392 * Return:
1393 * Starting guest virtual address
1394 *
1395 * Allocates at least N system pages worth of bytes within the virtual address
1396 * space of the vm.
1397 */
vm_vaddr_alloc_pages(struct kvm_vm * vm,int nr_pages)1398 vm_vaddr_t vm_vaddr_alloc_pages(struct kvm_vm *vm, int nr_pages)
1399 {
1400 return vm_vaddr_alloc(vm, nr_pages * getpagesize(), KVM_UTIL_MIN_VADDR);
1401 }
1402
__vm_vaddr_alloc_page(struct kvm_vm * vm,enum kvm_mem_region_type type)1403 vm_vaddr_t __vm_vaddr_alloc_page(struct kvm_vm *vm, enum kvm_mem_region_type type)
1404 {
1405 return __vm_vaddr_alloc(vm, getpagesize(), KVM_UTIL_MIN_VADDR, type);
1406 }
1407
1408 /*
1409 * VM Virtual Address Allocate Page
1410 *
1411 * Input Args:
1412 * vm - Virtual Machine
1413 *
1414 * Output Args: None
1415 *
1416 * Return:
1417 * Starting guest virtual address
1418 *
1419 * Allocates at least one system page worth of bytes within the virtual address
1420 * space of the vm.
1421 */
vm_vaddr_alloc_page(struct kvm_vm * vm)1422 vm_vaddr_t vm_vaddr_alloc_page(struct kvm_vm *vm)
1423 {
1424 return vm_vaddr_alloc_pages(vm, 1);
1425 }
1426
1427 /*
1428 * Map a range of VM virtual address to the VM's physical address
1429 *
1430 * Input Args:
1431 * vm - Virtual Machine
1432 * vaddr - Virtuall address to map
1433 * paddr - VM Physical Address
1434 * npages - The number of pages to map
1435 *
1436 * Output Args: None
1437 *
1438 * Return: None
1439 *
1440 * Within the VM given by @vm, creates a virtual translation for
1441 * @npages starting at @vaddr to the page range starting at @paddr.
1442 */
virt_map(struct kvm_vm * vm,uint64_t vaddr,uint64_t paddr,unsigned int npages)1443 void virt_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
1444 unsigned int npages)
1445 {
1446 size_t page_size = vm->page_size;
1447 size_t size = npages * page_size;
1448
1449 TEST_ASSERT(vaddr + size > vaddr, "Vaddr overflow");
1450 TEST_ASSERT(paddr + size > paddr, "Paddr overflow");
1451
1452 while (npages--) {
1453 virt_pg_map(vm, vaddr, paddr);
1454 sparsebit_set(vm->vpages_mapped, vaddr >> vm->page_shift);
1455
1456 vaddr += page_size;
1457 paddr += page_size;
1458 }
1459 }
1460
1461 /*
1462 * Address VM Physical to Host Virtual
1463 *
1464 * Input Args:
1465 * vm - Virtual Machine
1466 * gpa - VM physical address
1467 *
1468 * Output Args: None
1469 *
1470 * Return:
1471 * Equivalent host virtual address
1472 *
1473 * Locates the memory region containing the VM physical address given
1474 * by gpa, within the VM given by vm. When found, the host virtual
1475 * address providing the memory to the vm physical address is returned.
1476 * A TEST_ASSERT failure occurs if no region containing gpa exists.
1477 */
addr_gpa2hva(struct kvm_vm * vm,vm_paddr_t gpa)1478 void *addr_gpa2hva(struct kvm_vm *vm, vm_paddr_t gpa)
1479 {
1480 struct userspace_mem_region *region;
1481
1482 region = userspace_mem_region_find(vm, gpa, gpa);
1483 if (!region) {
1484 TEST_FAIL("No vm physical memory at 0x%lx", gpa);
1485 return NULL;
1486 }
1487
1488 return (void *)((uintptr_t)region->host_mem
1489 + (gpa - region->region.guest_phys_addr));
1490 }
1491
1492 /*
1493 * Address Host Virtual to VM Physical
1494 *
1495 * Input Args:
1496 * vm - Virtual Machine
1497 * hva - Host virtual address
1498 *
1499 * Output Args: None
1500 *
1501 * Return:
1502 * Equivalent VM physical address
1503 *
1504 * Locates the memory region containing the host virtual address given
1505 * by hva, within the VM given by vm. When found, the equivalent
1506 * VM physical address is returned. A TEST_ASSERT failure occurs if no
1507 * region containing hva exists.
1508 */
addr_hva2gpa(struct kvm_vm * vm,void * hva)1509 vm_paddr_t addr_hva2gpa(struct kvm_vm *vm, void *hva)
1510 {
1511 struct rb_node *node;
1512
1513 for (node = vm->regions.hva_tree.rb_node; node; ) {
1514 struct userspace_mem_region *region =
1515 container_of(node, struct userspace_mem_region, hva_node);
1516
1517 if (hva >= region->host_mem) {
1518 if (hva <= (region->host_mem
1519 + region->region.memory_size - 1))
1520 return (vm_paddr_t)((uintptr_t)
1521 region->region.guest_phys_addr
1522 + (hva - (uintptr_t)region->host_mem));
1523
1524 node = node->rb_right;
1525 } else
1526 node = node->rb_left;
1527 }
1528
1529 TEST_FAIL("No mapping to a guest physical address, hva: %p", hva);
1530 return -1;
1531 }
1532
1533 /*
1534 * Address VM physical to Host Virtual *alias*.
1535 *
1536 * Input Args:
1537 * vm - Virtual Machine
1538 * gpa - VM physical address
1539 *
1540 * Output Args: None
1541 *
1542 * Return:
1543 * Equivalent address within the host virtual *alias* area, or NULL
1544 * (without failing the test) if the guest memory is not shared (so
1545 * no alias exists).
1546 *
1547 * Create a writable, shared virtual=>physical alias for the specific GPA.
1548 * The primary use case is to allow the host selftest to manipulate guest
1549 * memory without mapping said memory in the guest's address space. And, for
1550 * userfaultfd-based demand paging, to do so without triggering userfaults.
1551 */
addr_gpa2alias(struct kvm_vm * vm,vm_paddr_t gpa)1552 void *addr_gpa2alias(struct kvm_vm *vm, vm_paddr_t gpa)
1553 {
1554 struct userspace_mem_region *region;
1555 uintptr_t offset;
1556
1557 region = userspace_mem_region_find(vm, gpa, gpa);
1558 if (!region)
1559 return NULL;
1560
1561 if (!region->host_alias)
1562 return NULL;
1563
1564 offset = gpa - region->region.guest_phys_addr;
1565 return (void *) ((uintptr_t) region->host_alias + offset);
1566 }
1567
1568 /* Create an interrupt controller chip for the specified VM. */
vm_create_irqchip(struct kvm_vm * vm)1569 void vm_create_irqchip(struct kvm_vm *vm)
1570 {
1571 vm_ioctl(vm, KVM_CREATE_IRQCHIP, NULL);
1572
1573 vm->has_irqchip = true;
1574 }
1575
_vcpu_run(struct kvm_vcpu * vcpu)1576 int _vcpu_run(struct kvm_vcpu *vcpu)
1577 {
1578 int rc;
1579
1580 do {
1581 rc = __vcpu_run(vcpu);
1582 } while (rc == -1 && errno == EINTR);
1583
1584 assert_on_unhandled_exception(vcpu);
1585
1586 return rc;
1587 }
1588
1589 /*
1590 * Invoke KVM_RUN on a vCPU until KVM returns something other than -EINTR.
1591 * Assert if the KVM returns an error (other than -EINTR).
1592 */
vcpu_run(struct kvm_vcpu * vcpu)1593 void vcpu_run(struct kvm_vcpu *vcpu)
1594 {
1595 int ret = _vcpu_run(vcpu);
1596
1597 TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_RUN, ret));
1598 }
1599
vcpu_run_complete_io(struct kvm_vcpu * vcpu)1600 void vcpu_run_complete_io(struct kvm_vcpu *vcpu)
1601 {
1602 int ret;
1603
1604 vcpu->run->immediate_exit = 1;
1605 ret = __vcpu_run(vcpu);
1606 vcpu->run->immediate_exit = 0;
1607
1608 TEST_ASSERT(ret == -1 && errno == EINTR,
1609 "KVM_RUN IOCTL didn't exit immediately, rc: %i, errno: %i",
1610 ret, errno);
1611 }
1612
1613 /*
1614 * Get the list of guest registers which are supported for
1615 * KVM_GET_ONE_REG/KVM_SET_ONE_REG ioctls. Returns a kvm_reg_list pointer,
1616 * it is the caller's responsibility to free the list.
1617 */
vcpu_get_reg_list(struct kvm_vcpu * vcpu)1618 struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vcpu *vcpu)
1619 {
1620 struct kvm_reg_list reg_list_n = { .n = 0 }, *reg_list;
1621 int ret;
1622
1623 ret = __vcpu_ioctl(vcpu, KVM_GET_REG_LIST, ®_list_n);
1624 TEST_ASSERT(ret == -1 && errno == E2BIG, "KVM_GET_REG_LIST n=0");
1625
1626 reg_list = calloc(1, sizeof(*reg_list) + reg_list_n.n * sizeof(__u64));
1627 reg_list->n = reg_list_n.n;
1628 vcpu_ioctl(vcpu, KVM_GET_REG_LIST, reg_list);
1629 return reg_list;
1630 }
1631
vcpu_map_dirty_ring(struct kvm_vcpu * vcpu)1632 void *vcpu_map_dirty_ring(struct kvm_vcpu *vcpu)
1633 {
1634 uint32_t page_size = getpagesize();
1635 uint32_t size = vcpu->vm->dirty_ring_size;
1636
1637 TEST_ASSERT(size > 0, "Should enable dirty ring first");
1638
1639 if (!vcpu->dirty_gfns) {
1640 void *addr;
1641
1642 addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, vcpu->fd,
1643 page_size * KVM_DIRTY_LOG_PAGE_OFFSET);
1644 TEST_ASSERT(addr == MAP_FAILED, "Dirty ring mapped private");
1645
1646 addr = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_PRIVATE, vcpu->fd,
1647 page_size * KVM_DIRTY_LOG_PAGE_OFFSET);
1648 TEST_ASSERT(addr == MAP_FAILED, "Dirty ring mapped exec");
1649
1650 addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, vcpu->fd,
1651 page_size * KVM_DIRTY_LOG_PAGE_OFFSET);
1652 TEST_ASSERT(addr != MAP_FAILED, "Dirty ring map failed");
1653
1654 vcpu->dirty_gfns = addr;
1655 vcpu->dirty_gfns_count = size / sizeof(struct kvm_dirty_gfn);
1656 }
1657
1658 return vcpu->dirty_gfns;
1659 }
1660
1661 /*
1662 * Device Ioctl
1663 */
1664
__kvm_has_device_attr(int dev_fd,uint32_t group,uint64_t attr)1665 int __kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
1666 {
1667 struct kvm_device_attr attribute = {
1668 .group = group,
1669 .attr = attr,
1670 .flags = 0,
1671 };
1672
1673 return ioctl(dev_fd, KVM_HAS_DEVICE_ATTR, &attribute);
1674 }
1675
__kvm_test_create_device(struct kvm_vm * vm,uint64_t type)1676 int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type)
1677 {
1678 struct kvm_create_device create_dev = {
1679 .type = type,
1680 .flags = KVM_CREATE_DEVICE_TEST,
1681 };
1682
1683 return __vm_ioctl(vm, KVM_CREATE_DEVICE, &create_dev);
1684 }
1685
__kvm_create_device(struct kvm_vm * vm,uint64_t type)1686 int __kvm_create_device(struct kvm_vm *vm, uint64_t type)
1687 {
1688 struct kvm_create_device create_dev = {
1689 .type = type,
1690 .fd = -1,
1691 .flags = 0,
1692 };
1693 int err;
1694
1695 err = __vm_ioctl(vm, KVM_CREATE_DEVICE, &create_dev);
1696 TEST_ASSERT(err <= 0, "KVM_CREATE_DEVICE shouldn't return a positive value");
1697 return err ? : create_dev.fd;
1698 }
1699
__kvm_device_attr_get(int dev_fd,uint32_t group,uint64_t attr,void * val)1700 int __kvm_device_attr_get(int dev_fd, uint32_t group, uint64_t attr, void *val)
1701 {
1702 struct kvm_device_attr kvmattr = {
1703 .group = group,
1704 .attr = attr,
1705 .flags = 0,
1706 .addr = (uintptr_t)val,
1707 };
1708
1709 return __kvm_ioctl(dev_fd, KVM_GET_DEVICE_ATTR, &kvmattr);
1710 }
1711
__kvm_device_attr_set(int dev_fd,uint32_t group,uint64_t attr,void * val)1712 int __kvm_device_attr_set(int dev_fd, uint32_t group, uint64_t attr, void *val)
1713 {
1714 struct kvm_device_attr kvmattr = {
1715 .group = group,
1716 .attr = attr,
1717 .flags = 0,
1718 .addr = (uintptr_t)val,
1719 };
1720
1721 return __kvm_ioctl(dev_fd, KVM_SET_DEVICE_ATTR, &kvmattr);
1722 }
1723
1724 /*
1725 * IRQ related functions.
1726 */
1727
_kvm_irq_line(struct kvm_vm * vm,uint32_t irq,int level)1728 int _kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level)
1729 {
1730 struct kvm_irq_level irq_level = {
1731 .irq = irq,
1732 .level = level,
1733 };
1734
1735 return __vm_ioctl(vm, KVM_IRQ_LINE, &irq_level);
1736 }
1737
kvm_irq_line(struct kvm_vm * vm,uint32_t irq,int level)1738 void kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level)
1739 {
1740 int ret = _kvm_irq_line(vm, irq, level);
1741
1742 TEST_ASSERT(ret >= 0, KVM_IOCTL_ERROR(KVM_IRQ_LINE, ret));
1743 }
1744
kvm_gsi_routing_create(void)1745 struct kvm_irq_routing *kvm_gsi_routing_create(void)
1746 {
1747 struct kvm_irq_routing *routing;
1748 size_t size;
1749
1750 size = sizeof(struct kvm_irq_routing);
1751 /* Allocate space for the max number of entries: this wastes 196 KBs. */
1752 size += KVM_MAX_IRQ_ROUTES * sizeof(struct kvm_irq_routing_entry);
1753 routing = calloc(1, size);
1754 assert(routing);
1755
1756 return routing;
1757 }
1758
kvm_gsi_routing_irqchip_add(struct kvm_irq_routing * routing,uint32_t gsi,uint32_t pin)1759 void kvm_gsi_routing_irqchip_add(struct kvm_irq_routing *routing,
1760 uint32_t gsi, uint32_t pin)
1761 {
1762 int i;
1763
1764 assert(routing);
1765 assert(routing->nr < KVM_MAX_IRQ_ROUTES);
1766
1767 i = routing->nr;
1768 routing->entries[i].gsi = gsi;
1769 routing->entries[i].type = KVM_IRQ_ROUTING_IRQCHIP;
1770 routing->entries[i].flags = 0;
1771 routing->entries[i].u.irqchip.irqchip = 0;
1772 routing->entries[i].u.irqchip.pin = pin;
1773 routing->nr++;
1774 }
1775
_kvm_gsi_routing_write(struct kvm_vm * vm,struct kvm_irq_routing * routing)1776 int _kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing)
1777 {
1778 int ret;
1779
1780 assert(routing);
1781 ret = __vm_ioctl(vm, KVM_SET_GSI_ROUTING, routing);
1782 free(routing);
1783
1784 return ret;
1785 }
1786
kvm_gsi_routing_write(struct kvm_vm * vm,struct kvm_irq_routing * routing)1787 void kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing)
1788 {
1789 int ret;
1790
1791 ret = _kvm_gsi_routing_write(vm, routing);
1792 TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_SET_GSI_ROUTING, ret));
1793 }
1794
1795 /*
1796 * VM Dump
1797 *
1798 * Input Args:
1799 * vm - Virtual Machine
1800 * indent - Left margin indent amount
1801 *
1802 * Output Args:
1803 * stream - Output FILE stream
1804 *
1805 * Return: None
1806 *
1807 * Dumps the current state of the VM given by vm, to the FILE stream
1808 * given by stream.
1809 */
vm_dump(FILE * stream,struct kvm_vm * vm,uint8_t indent)1810 void vm_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
1811 {
1812 int ctr;
1813 struct userspace_mem_region *region;
1814 struct kvm_vcpu *vcpu;
1815
1816 fprintf(stream, "%*smode: 0x%x\n", indent, "", vm->mode);
1817 fprintf(stream, "%*sfd: %i\n", indent, "", vm->fd);
1818 fprintf(stream, "%*spage_size: 0x%x\n", indent, "", vm->page_size);
1819 fprintf(stream, "%*sMem Regions:\n", indent, "");
1820 hash_for_each(vm->regions.slot_hash, ctr, region, slot_node) {
1821 fprintf(stream, "%*sguest_phys: 0x%lx size: 0x%lx "
1822 "host_virt: %p\n", indent + 2, "",
1823 (uint64_t) region->region.guest_phys_addr,
1824 (uint64_t) region->region.memory_size,
1825 region->host_mem);
1826 fprintf(stream, "%*sunused_phy_pages: ", indent + 2, "");
1827 sparsebit_dump(stream, region->unused_phy_pages, 0);
1828 }
1829 fprintf(stream, "%*sMapped Virtual Pages:\n", indent, "");
1830 sparsebit_dump(stream, vm->vpages_mapped, indent + 2);
1831 fprintf(stream, "%*spgd_created: %u\n", indent, "",
1832 vm->pgd_created);
1833 if (vm->pgd_created) {
1834 fprintf(stream, "%*sVirtual Translation Tables:\n",
1835 indent + 2, "");
1836 virt_dump(stream, vm, indent + 4);
1837 }
1838 fprintf(stream, "%*sVCPUs:\n", indent, "");
1839
1840 list_for_each_entry(vcpu, &vm->vcpus, list)
1841 vcpu_dump(stream, vcpu, indent + 2);
1842 }
1843
1844 #define KVM_EXIT_STRING(x) {KVM_EXIT_##x, #x}
1845
1846 /* Known KVM exit reasons */
1847 static struct exit_reason {
1848 unsigned int reason;
1849 const char *name;
1850 } exit_reasons_known[] = {
1851 KVM_EXIT_STRING(UNKNOWN),
1852 KVM_EXIT_STRING(EXCEPTION),
1853 KVM_EXIT_STRING(IO),
1854 KVM_EXIT_STRING(HYPERCALL),
1855 KVM_EXIT_STRING(DEBUG),
1856 KVM_EXIT_STRING(HLT),
1857 KVM_EXIT_STRING(MMIO),
1858 KVM_EXIT_STRING(IRQ_WINDOW_OPEN),
1859 KVM_EXIT_STRING(SHUTDOWN),
1860 KVM_EXIT_STRING(FAIL_ENTRY),
1861 KVM_EXIT_STRING(INTR),
1862 KVM_EXIT_STRING(SET_TPR),
1863 KVM_EXIT_STRING(TPR_ACCESS),
1864 KVM_EXIT_STRING(S390_SIEIC),
1865 KVM_EXIT_STRING(S390_RESET),
1866 KVM_EXIT_STRING(DCR),
1867 KVM_EXIT_STRING(NMI),
1868 KVM_EXIT_STRING(INTERNAL_ERROR),
1869 KVM_EXIT_STRING(OSI),
1870 KVM_EXIT_STRING(PAPR_HCALL),
1871 KVM_EXIT_STRING(S390_UCONTROL),
1872 KVM_EXIT_STRING(WATCHDOG),
1873 KVM_EXIT_STRING(S390_TSCH),
1874 KVM_EXIT_STRING(EPR),
1875 KVM_EXIT_STRING(SYSTEM_EVENT),
1876 KVM_EXIT_STRING(S390_STSI),
1877 KVM_EXIT_STRING(IOAPIC_EOI),
1878 KVM_EXIT_STRING(HYPERV),
1879 KVM_EXIT_STRING(ARM_NISV),
1880 KVM_EXIT_STRING(X86_RDMSR),
1881 KVM_EXIT_STRING(X86_WRMSR),
1882 KVM_EXIT_STRING(DIRTY_RING_FULL),
1883 KVM_EXIT_STRING(AP_RESET_HOLD),
1884 KVM_EXIT_STRING(X86_BUS_LOCK),
1885 KVM_EXIT_STRING(XEN),
1886 KVM_EXIT_STRING(RISCV_SBI),
1887 KVM_EXIT_STRING(RISCV_CSR),
1888 KVM_EXIT_STRING(NOTIFY),
1889 #ifdef KVM_EXIT_MEMORY_NOT_PRESENT
1890 KVM_EXIT_STRING(MEMORY_NOT_PRESENT),
1891 #endif
1892 };
1893
1894 /*
1895 * Exit Reason String
1896 *
1897 * Input Args:
1898 * exit_reason - Exit reason
1899 *
1900 * Output Args: None
1901 *
1902 * Return:
1903 * Constant string pointer describing the exit reason.
1904 *
1905 * Locates and returns a constant string that describes the KVM exit
1906 * reason given by exit_reason. If no such string is found, a constant
1907 * string of "Unknown" is returned.
1908 */
exit_reason_str(unsigned int exit_reason)1909 const char *exit_reason_str(unsigned int exit_reason)
1910 {
1911 unsigned int n1;
1912
1913 for (n1 = 0; n1 < ARRAY_SIZE(exit_reasons_known); n1++) {
1914 if (exit_reason == exit_reasons_known[n1].reason)
1915 return exit_reasons_known[n1].name;
1916 }
1917
1918 return "Unknown";
1919 }
1920
1921 /*
1922 * Physical Contiguous Page Allocator
1923 *
1924 * Input Args:
1925 * vm - Virtual Machine
1926 * num - number of pages
1927 * paddr_min - Physical address minimum
1928 * memslot - Memory region to allocate page from
1929 *
1930 * Output Args: None
1931 *
1932 * Return:
1933 * Starting physical address
1934 *
1935 * Within the VM specified by vm, locates a range of available physical
1936 * pages at or above paddr_min. If found, the pages are marked as in use
1937 * and their base address is returned. A TEST_ASSERT failure occurs if
1938 * not enough pages are available at or above paddr_min.
1939 */
vm_phy_pages_alloc(struct kvm_vm * vm,size_t num,vm_paddr_t paddr_min,uint32_t memslot)1940 vm_paddr_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t num,
1941 vm_paddr_t paddr_min, uint32_t memslot)
1942 {
1943 struct userspace_mem_region *region;
1944 sparsebit_idx_t pg, base;
1945
1946 TEST_ASSERT(num > 0, "Must allocate at least one page");
1947
1948 TEST_ASSERT((paddr_min % vm->page_size) == 0, "Min physical address "
1949 "not divisible by page size.\n"
1950 " paddr_min: 0x%lx page_size: 0x%x",
1951 paddr_min, vm->page_size);
1952
1953 region = memslot2region(vm, memslot);
1954 base = pg = paddr_min >> vm->page_shift;
1955
1956 do {
1957 for (; pg < base + num; ++pg) {
1958 if (!sparsebit_is_set(region->unused_phy_pages, pg)) {
1959 base = pg = sparsebit_next_set(region->unused_phy_pages, pg);
1960 break;
1961 }
1962 }
1963 } while (pg && pg != base + num);
1964
1965 if (pg == 0) {
1966 fprintf(stderr, "No guest physical page available, "
1967 "paddr_min: 0x%lx page_size: 0x%x memslot: %u\n",
1968 paddr_min, vm->page_size, memslot);
1969 fputs("---- vm dump ----\n", stderr);
1970 vm_dump(stderr, vm, 2);
1971 abort();
1972 }
1973
1974 for (pg = base; pg < base + num; ++pg)
1975 sparsebit_clear(region->unused_phy_pages, pg);
1976
1977 return base * vm->page_size;
1978 }
1979
vm_phy_page_alloc(struct kvm_vm * vm,vm_paddr_t paddr_min,uint32_t memslot)1980 vm_paddr_t vm_phy_page_alloc(struct kvm_vm *vm, vm_paddr_t paddr_min,
1981 uint32_t memslot)
1982 {
1983 return vm_phy_pages_alloc(vm, 1, paddr_min, memslot);
1984 }
1985
vm_alloc_page_table(struct kvm_vm * vm)1986 vm_paddr_t vm_alloc_page_table(struct kvm_vm *vm)
1987 {
1988 return vm_phy_page_alloc(vm, KVM_GUEST_PAGE_TABLE_MIN_PADDR,
1989 vm->memslots[MEM_REGION_PT]);
1990 }
1991
1992 /*
1993 * Address Guest Virtual to Host Virtual
1994 *
1995 * Input Args:
1996 * vm - Virtual Machine
1997 * gva - VM virtual address
1998 *
1999 * Output Args: None
2000 *
2001 * Return:
2002 * Equivalent host virtual address
2003 */
addr_gva2hva(struct kvm_vm * vm,vm_vaddr_t gva)2004 void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva)
2005 {
2006 return addr_gpa2hva(vm, addr_gva2gpa(vm, gva));
2007 }
2008
vm_compute_max_gfn(struct kvm_vm * vm)2009 unsigned long __weak vm_compute_max_gfn(struct kvm_vm *vm)
2010 {
2011 return ((1ULL << vm->pa_bits) >> vm->page_shift) - 1;
2012 }
2013
vm_calc_num_pages(unsigned int num_pages,unsigned int page_shift,unsigned int new_page_shift,bool ceil)2014 static unsigned int vm_calc_num_pages(unsigned int num_pages,
2015 unsigned int page_shift,
2016 unsigned int new_page_shift,
2017 bool ceil)
2018 {
2019 unsigned int n = 1 << (new_page_shift - page_shift);
2020
2021 if (page_shift >= new_page_shift)
2022 return num_pages * (1 << (page_shift - new_page_shift));
2023
2024 return num_pages / n + !!(ceil && num_pages % n);
2025 }
2026
getpageshift(void)2027 static inline int getpageshift(void)
2028 {
2029 return __builtin_ffs(getpagesize()) - 1;
2030 }
2031
2032 unsigned int
vm_num_host_pages(enum vm_guest_mode mode,unsigned int num_guest_pages)2033 vm_num_host_pages(enum vm_guest_mode mode, unsigned int num_guest_pages)
2034 {
2035 return vm_calc_num_pages(num_guest_pages,
2036 vm_guest_mode_params[mode].page_shift,
2037 getpageshift(), true);
2038 }
2039
2040 unsigned int
vm_num_guest_pages(enum vm_guest_mode mode,unsigned int num_host_pages)2041 vm_num_guest_pages(enum vm_guest_mode mode, unsigned int num_host_pages)
2042 {
2043 return vm_calc_num_pages(num_host_pages, getpageshift(),
2044 vm_guest_mode_params[mode].page_shift, false);
2045 }
2046
vm_calc_num_guest_pages(enum vm_guest_mode mode,size_t size)2047 unsigned int vm_calc_num_guest_pages(enum vm_guest_mode mode, size_t size)
2048 {
2049 unsigned int n;
2050 n = DIV_ROUND_UP(size, vm_guest_mode_params[mode].page_size);
2051 return vm_adjust_num_guest_pages(mode, n);
2052 }
2053
2054 /*
2055 * Read binary stats descriptors
2056 *
2057 * Input Args:
2058 * stats_fd - the file descriptor for the binary stats file from which to read
2059 * header - the binary stats metadata header corresponding to the given FD
2060 *
2061 * Output Args: None
2062 *
2063 * Return:
2064 * A pointer to a newly allocated series of stat descriptors.
2065 * Caller is responsible for freeing the returned kvm_stats_desc.
2066 *
2067 * Read the stats descriptors from the binary stats interface.
2068 */
read_stats_descriptors(int stats_fd,struct kvm_stats_header * header)2069 struct kvm_stats_desc *read_stats_descriptors(int stats_fd,
2070 struct kvm_stats_header *header)
2071 {
2072 struct kvm_stats_desc *stats_desc;
2073 ssize_t desc_size, total_size, ret;
2074
2075 desc_size = get_stats_descriptor_size(header);
2076 total_size = header->num_desc * desc_size;
2077
2078 stats_desc = calloc(header->num_desc, desc_size);
2079 TEST_ASSERT(stats_desc, "Allocate memory for stats descriptors");
2080
2081 ret = pread(stats_fd, stats_desc, total_size, header->desc_offset);
2082 TEST_ASSERT(ret == total_size, "Read KVM stats descriptors");
2083
2084 return stats_desc;
2085 }
2086
2087 /*
2088 * Read stat data for a particular stat
2089 *
2090 * Input Args:
2091 * stats_fd - the file descriptor for the binary stats file from which to read
2092 * header - the binary stats metadata header corresponding to the given FD
2093 * desc - the binary stat metadata for the particular stat to be read
2094 * max_elements - the maximum number of 8-byte values to read into data
2095 *
2096 * Output Args:
2097 * data - the buffer into which stat data should be read
2098 *
2099 * Read the data values of a specified stat from the binary stats interface.
2100 */
read_stat_data(int stats_fd,struct kvm_stats_header * header,struct kvm_stats_desc * desc,uint64_t * data,size_t max_elements)2101 void read_stat_data(int stats_fd, struct kvm_stats_header *header,
2102 struct kvm_stats_desc *desc, uint64_t *data,
2103 size_t max_elements)
2104 {
2105 size_t nr_elements = min_t(ssize_t, desc->size, max_elements);
2106 size_t size = nr_elements * sizeof(*data);
2107 ssize_t ret;
2108
2109 TEST_ASSERT(desc->size, "No elements in stat '%s'", desc->name);
2110 TEST_ASSERT(max_elements, "Zero elements requested for stat '%s'", desc->name);
2111
2112 ret = pread(stats_fd, data, size,
2113 header->data_offset + desc->offset);
2114
2115 TEST_ASSERT(ret >= 0, "pread() failed on stat '%s', errno: %i (%s)",
2116 desc->name, errno, strerror(errno));
2117 TEST_ASSERT(ret == size,
2118 "pread() on stat '%s' read %ld bytes, wanted %lu bytes",
2119 desc->name, size, ret);
2120 }
2121
2122 /*
2123 * Read the data of the named stat
2124 *
2125 * Input Args:
2126 * vm - the VM for which the stat should be read
2127 * stat_name - the name of the stat to read
2128 * max_elements - the maximum number of 8-byte values to read into data
2129 *
2130 * Output Args:
2131 * data - the buffer into which stat data should be read
2132 *
2133 * Read the data values of a specified stat from the binary stats interface.
2134 */
__vm_get_stat(struct kvm_vm * vm,const char * stat_name,uint64_t * data,size_t max_elements)2135 void __vm_get_stat(struct kvm_vm *vm, const char *stat_name, uint64_t *data,
2136 size_t max_elements)
2137 {
2138 struct kvm_stats_desc *desc;
2139 size_t size_desc;
2140 int i;
2141
2142 if (!vm->stats_fd) {
2143 vm->stats_fd = vm_get_stats_fd(vm);
2144 read_stats_header(vm->stats_fd, &vm->stats_header);
2145 vm->stats_desc = read_stats_descriptors(vm->stats_fd,
2146 &vm->stats_header);
2147 }
2148
2149 size_desc = get_stats_descriptor_size(&vm->stats_header);
2150
2151 for (i = 0; i < vm->stats_header.num_desc; ++i) {
2152 desc = (void *)vm->stats_desc + (i * size_desc);
2153
2154 if (strcmp(desc->name, stat_name))
2155 continue;
2156
2157 read_stat_data(vm->stats_fd, &vm->stats_header, desc,
2158 data, max_elements);
2159
2160 break;
2161 }
2162 }
2163
kvm_arch_vm_post_create(struct kvm_vm * vm)2164 __weak void kvm_arch_vm_post_create(struct kvm_vm *vm)
2165 {
2166 }
2167
kvm_selftest_arch_init(void)2168 __weak void kvm_selftest_arch_init(void)
2169 {
2170 }
2171
kvm_selftest_init(void)2172 void __attribute((constructor)) kvm_selftest_init(void)
2173 {
2174 /* Tell stdout not to buffer its content. */
2175 setbuf(stdout, NULL);
2176
2177 kvm_selftest_arch_init();
2178 }
2179