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