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. */ 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 */ 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 */ 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 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 */ 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 */ 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, ®ion->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 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 */ 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 * 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 ®ion->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 */ 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 */ 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 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 */ 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 ®ion->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(®ion->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 */ 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 */ 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 */ 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 * 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 */ 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, ®ion->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 */ 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 */ 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, ®ion->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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 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 */ 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 */ 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 */ 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 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 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 */ 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 */ 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 */ 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, ®s); 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, ®s); 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 */ 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 */ 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 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 */ 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 */ 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 */ 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 */ 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, ®s); 1542 regs_dump(stream, ®s, 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 */ 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 */ 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 */ 1668 void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva) 1669 { 1670 return addr_gpa2hva(vm, addr_gva2gpa(vm, gva)); 1671 } 1672 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(®s, 0, sizeof(regs)); 1680 vcpu_regs_get(vm, vcpu_id, ®s); 1681 1682 args->port = run->io.port; 1683 args->arg0 = regs.rdi; 1684 args->arg1 = regs.rsi; 1685 } 1686