Lines Matching +full:memory +full:- +full:region
1 // SPDX-License-Identifier: GPL-2.0-only
26 size_t mask = size - 1; in align()
27 TEST_ASSERT(size != 0 && !(size & (size - 1)), in align()
36 * cap - Capability
58 TEST_ASSERT(ret != -1, "KVM_CHECK_EXTENSION IOCTL failed,\n" in kvm_check_cap()
69 * vm - Virtual Machine
70 * cap - Capability
82 ret = ioctl(vm->fd, KVM_ENABLE_CAP, cap); in vm_enable_cap()
92 * vm - Virtual Machine
93 * vcpu_id - VCPU
94 * cap - Capability
110 r = ioctl(vcpu->fd, KVM_ENABLE_CAP, cap); in vcpu_enable_cap()
119 vm->kvm_fd = open(KVM_DEV_PATH, perm); in vm_open()
120 if (vm->kvm_fd < 0) in vm_open()
128 vm->fd = ioctl(vm->kvm_fd, KVM_CREATE_VM, vm->type); in vm_open()
129 TEST_ASSERT(vm->fd >= 0, "KVM_CREATE_VM ioctl failed, " in vm_open()
130 "rc: %i errno: %i", vm->fd, errno); in vm_open()
134 "PA-bits:52, VA-bits:48, 4K pages",
135 "PA-bits:52, VA-bits:48, 64K pages",
136 "PA-bits:48, VA-bits:48, 4K pages",
137 "PA-bits:48, VA-bits:48, 64K pages",
138 "PA-bits:40, VA-bits:48, 4K pages",
139 "PA-bits:40, VA-bits:48, 64K pages",
140 "PA-bits:ANY, VA-bits:48, 4K pages",
168 * mode - VM Mode (e.g. VM_MODE_P52V48_4K)
169 * phy_pages - Physical memory pages
170 * perm - permission
178 * When phy_pages is non-zero, a memory region of phy_pages physical pages
191 TEST_ASSERT(vm != NULL, "Insufficient Memory"); in vm_create()
193 INIT_LIST_HEAD(&vm->vcpus); in vm_create()
194 INIT_LIST_HEAD(&vm->userspace_mem_regions); in vm_create()
196 vm->mode = mode; in vm_create()
197 vm->type = 0; in vm_create()
199 vm->pa_bits = vm_guest_mode_params[mode].pa_bits; in vm_create()
200 vm->va_bits = vm_guest_mode_params[mode].va_bits; in vm_create()
201 vm->page_size = vm_guest_mode_params[mode].page_size; in vm_create()
202 vm->page_shift = vm_guest_mode_params[mode].page_shift; in vm_create()
205 switch (vm->mode) { in vm_create()
207 vm->pgtable_levels = 4; in vm_create()
210 vm->pgtable_levels = 3; in vm_create()
213 vm->pgtable_levels = 4; in vm_create()
216 vm->pgtable_levels = 3; in vm_create()
219 vm->pgtable_levels = 4; in vm_create()
222 vm->pgtable_levels = 3; in vm_create()
226 kvm_get_cpu_address_width(&vm->pa_bits, &vm->va_bits); in vm_create()
228 * Ignore KVM support for 5-level paging (vm->va_bits == 57), in vm_create()
232 TEST_ASSERT(vm->va_bits == 48 || vm->va_bits == 57, in vm_create()
234 vm->va_bits); in vm_create()
236 vm->pa_bits); in vm_create()
237 vm->pgtable_levels = 4; in vm_create()
238 vm->va_bits = 48; in vm_create()
240 TEST_FAIL("VM_MODE_PXXV48_4K not supported on non-x86 platforms"); in vm_create()
248 if (vm->pa_bits != 40) in vm_create()
249 vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits); in vm_create()
254 /* Limit to VA-bit canonical virtual addresses. */ in vm_create()
255 vm->vpages_valid = sparsebit_alloc(); in vm_create()
256 sparsebit_set_num(vm->vpages_valid, in vm_create()
257 0, (1ULL << (vm->va_bits - 1)) >> vm->page_shift); in vm_create()
258 sparsebit_set_num(vm->vpages_valid, in vm_create()
259 (~((1ULL << (vm->va_bits - 1)) - 1)) >> vm->page_shift, in vm_create()
260 (1ULL << (vm->va_bits - 1)) >> vm->page_shift); in vm_create()
262 /* Limit physical addresses to PA-bits. */ in vm_create()
263 vm->max_gfn = ((1ULL << vm->pa_bits) >> vm->page_shift) - 1; in vm_create()
265 /* Allocate and setup memory for guest. */ in vm_create()
266 vm->vpages_mapped = sparsebit_alloc(); in vm_create()
278 * vm - VM that has been released before
279 * perm - permission
284 * global state, such as the irqchip and the memory regions that are mapped
289 struct userspace_mem_region *region; in kvm_vm_restart() local
292 if (vmp->has_irqchip) in kvm_vm_restart()
295 list_for_each_entry(region, &vmp->userspace_mem_regions, list) { in kvm_vm_restart()
296 int ret = ioctl(vmp->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region); in kvm_vm_restart()
301 ret, errno, region->region.slot, in kvm_vm_restart()
302 region->region.flags, in kvm_vm_restart()
303 region->region.guest_phys_addr, in kvm_vm_restart()
304 region->region.memory_size); in kvm_vm_restart()
313 ret = ioctl(vm->fd, KVM_GET_DIRTY_LOG, &args); in kvm_vm_get_dirty_log()
315 __func__, strerror(-ret)); in kvm_vm_get_dirty_log()
326 ret = ioctl(vm->fd, KVM_CLEAR_DIRTY_LOG, &args); in kvm_vm_clear_dirty_log()
328 __func__, strerror(-ret)); in kvm_vm_clear_dirty_log()
332 * Userspace Memory Region Find
335 * vm - Virtual Machine
336 * start - Starting VM physical address
337 * end - Ending VM physical address, inclusive.
342 * Pointer to overlapping region, NULL if no such region.
344 * Searches for a region with any physical memory that overlaps with
348 * region exists.
353 struct userspace_mem_region *region; in userspace_mem_region_find() local
355 list_for_each_entry(region, &vm->userspace_mem_regions, list) { in userspace_mem_region_find()
356 uint64_t existing_start = region->region.guest_phys_addr; in userspace_mem_region_find()
357 uint64_t existing_end = region->region.guest_phys_addr in userspace_mem_region_find()
358 + region->region.memory_size - 1; in userspace_mem_region_find()
360 return region; in userspace_mem_region_find()
367 * KVM Userspace Memory Region Find
370 * vm - Virtual Machine
371 * start - Starting VM physical address
372 * end - Ending VM physical address, inclusive.
377 * Pointer to overlapping region, NULL if no such region.
380 * the memslot datastructure for a given range of guest physical memory.
386 struct userspace_mem_region *region; in kvm_userspace_memory_region_find() local
388 region = userspace_mem_region_find(vm, start, end); in kvm_userspace_memory_region_find()
389 if (!region) in kvm_userspace_memory_region_find()
392 return ®ion->region; in kvm_userspace_memory_region_find()
399 * vm - Virtual Machine
400 * vcpuid - VCPU ID
415 list_for_each_entry(vcpu, &vm->vcpus, list) { in vcpu_find()
416 if (vcpu->id == vcpuid) in vcpu_find()
427 * vcpu - VCPU to remove
439 ret = munmap(vcpu->state, sizeof(*vcpu->state)); in vm_vcpu_rm()
442 close(vcpu->fd); in vm_vcpu_rm()
446 list_del(&vcpu->list); in vm_vcpu_rm()
455 list_for_each_entry_safe(vcpu, tmp, &vmp->vcpus, list) in kvm_vm_release()
458 ret = close(vmp->fd); in kvm_vm_release()
460 " vmp->fd: %i rc: %i errno: %i", vmp->fd, ret, errno); in kvm_vm_release()
462 close(vmp->kvm_fd); in kvm_vm_release()
464 " vmp->kvm_fd: %i rc: %i errno: %i", vmp->kvm_fd, ret, errno); in kvm_vm_release()
468 struct userspace_mem_region *region) in __vm_mem_region_delete() argument
472 list_del(®ion->list); in __vm_mem_region_delete()
474 region->region.memory_size = 0; in __vm_mem_region_delete()
475 ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region); in __vm_mem_region_delete()
479 sparsebit_free(®ion->unused_phy_pages); in __vm_mem_region_delete()
480 ret = munmap(region->mmap_start, region->mmap_size); in __vm_mem_region_delete()
483 free(region); in __vm_mem_region_delete()
491 struct userspace_mem_region *region, *tmp; in kvm_vm_free() local
497 list_for_each_entry_safe(region, tmp, &vmp->userspace_mem_regions, list) in kvm_vm_free()
498 __vm_mem_region_delete(vmp, region); in kvm_vm_free()
501 sparsebit_free(&vmp->vpages_valid); in kvm_vm_free()
502 sparsebit_free(&vmp->vpages_mapped); in kvm_vm_free()
511 * Memory Compare, host virtual to guest virtual
514 * hva - Starting host virtual address
515 * vm - Virtual Machine
516 * gva - Starting guest virtual address
517 * len - number of bytes to compare
554 amt = len - offset; in kvm_memcmp_hva_gva()
555 if ((ptr1 >> vm->page_shift) != ((ptr1 + amt) >> vm->page_shift)) in kvm_memcmp_hva_gva()
556 amt = vm->page_size - (ptr1 % vm->page_size); in kvm_memcmp_hva_gva()
557 if ((ptr2 >> vm->page_shift) != ((ptr2 + amt) >> vm->page_shift)) in kvm_memcmp_hva_gva()
558 amt = vm->page_size - (ptr2 % vm->page_size); in kvm_memcmp_hva_gva()
560 assert((ptr1 >> vm->page_shift) == ((ptr1 + amt - 1) >> vm->page_shift)); in kvm_memcmp_hva_gva()
561 assert((ptr2 >> vm->page_shift) == ((ptr2 + amt - 1) >> vm->page_shift)); in kvm_memcmp_hva_gva()
574 * No mismatch found. Let the caller know the two memory in kvm_memcmp_hva_gva()
581 * VM Userspace Memory Region Add
584 * vm - Virtual Machine
585 * backing_src - Storage source for this region.
586 * NULL to use anonymous memory.
587 * guest_paddr - Starting guest physical address
588 * slot - KVM region slot
589 * npages - Number of physical pages
590 * flags - KVM memory region flags (e.g. KVM_MEM_LOG_DIRTY_PAGES)
596 * Allocates a memory area of the number of pages specified by npages
598 * given by guest_paddr. The region is created with a KVM region slot
600 * region is created with the flags given by flags.
608 struct userspace_mem_region *region; in vm_userspace_mem_region_add() local
609 size_t huge_page_size = KVM_UTIL_PGS_PER_HUGEPG * vm->page_size; in vm_userspace_mem_region_add()
612 TEST_ASSERT(vm_adjust_num_guest_pages(vm->mode, npages) == npages, in vm_userspace_mem_region_add()
614 "Try npages=%d", vm_adjust_num_guest_pages(vm->mode, npages)); in vm_userspace_mem_region_add()
616 TEST_ASSERT((guest_paddr % vm->page_size) == 0, "Guest physical " in vm_userspace_mem_region_add()
618 " guest_paddr: 0x%lx vm->page_size: 0x%x", in vm_userspace_mem_region_add()
619 guest_paddr, vm->page_size); in vm_userspace_mem_region_add()
620 TEST_ASSERT((((guest_paddr >> vm->page_shift) + npages) - 1) in vm_userspace_mem_region_add()
621 <= vm->max_gfn, "Physical range beyond maximum " in vm_userspace_mem_region_add()
624 " vm->max_gfn: 0x%lx vm->page_size: 0x%x", in vm_userspace_mem_region_add()
625 guest_paddr, npages, vm->max_gfn, vm->page_size); in vm_userspace_mem_region_add()
628 * Confirm a mem region with an overlapping address doesn't in vm_userspace_mem_region_add()
631 region = (struct userspace_mem_region *) userspace_mem_region_find( in vm_userspace_mem_region_add()
632 vm, guest_paddr, (guest_paddr + npages * vm->page_size) - 1); in vm_userspace_mem_region_add()
633 if (region != NULL) in vm_userspace_mem_region_add()
639 guest_paddr, npages, vm->page_size, in vm_userspace_mem_region_add()
640 (uint64_t) region->region.guest_phys_addr, in vm_userspace_mem_region_add()
641 (uint64_t) region->region.memory_size); in vm_userspace_mem_region_add()
643 /* Confirm no region with the requested slot already exists. */ in vm_userspace_mem_region_add()
644 list_for_each_entry(region, &vm->userspace_mem_regions, list) { in vm_userspace_mem_region_add()
645 if (region->region.slot != slot) in vm_userspace_mem_region_add()
648 TEST_FAIL("A mem region with the requested slot " in vm_userspace_mem_region_add()
653 region->region.slot, in vm_userspace_mem_region_add()
654 (uint64_t) region->region.guest_phys_addr, in vm_userspace_mem_region_add()
655 (uint64_t) region->region.memory_size); in vm_userspace_mem_region_add()
658 /* Allocate and initialize new mem region structure. */ in vm_userspace_mem_region_add()
659 region = calloc(1, sizeof(*region)); in vm_userspace_mem_region_add()
660 TEST_ASSERT(region != NULL, "Insufficient Memory"); in vm_userspace_mem_region_add()
661 region->mmap_size = npages * vm->page_size; in vm_userspace_mem_region_add()
673 /* Add enough memory to align up if necessary */ in vm_userspace_mem_region_add()
675 region->mmap_size += alignment; in vm_userspace_mem_region_add()
677 region->mmap_start = mmap(NULL, region->mmap_size, in vm_userspace_mem_region_add()
681 -1, 0); in vm_userspace_mem_region_add()
682 TEST_ASSERT(region->mmap_start != MAP_FAILED, in vm_userspace_mem_region_add()
684 region->mmap_start, errno); in vm_userspace_mem_region_add()
687 region->host_mem = align(region->mmap_start, alignment); in vm_userspace_mem_region_add()
694 TEST_ASSERT(ret == 0 || (ret == -1 && errno == ENOENT), in vm_userspace_mem_region_add()
701 ret = madvise(region->host_mem, npages * vm->page_size, in vm_userspace_mem_region_add()
704 region->host_mem, npages * vm->page_size, src_type); in vm_userspace_mem_region_add()
708 region->unused_phy_pages = sparsebit_alloc(); in vm_userspace_mem_region_add()
709 sparsebit_set_num(region->unused_phy_pages, in vm_userspace_mem_region_add()
710 guest_paddr >> vm->page_shift, npages); in vm_userspace_mem_region_add()
711 region->region.slot = slot; in vm_userspace_mem_region_add()
712 region->region.flags = flags; in vm_userspace_mem_region_add()
713 region->region.guest_phys_addr = guest_paddr; in vm_userspace_mem_region_add()
714 region->region.memory_size = npages * vm->page_size; in vm_userspace_mem_region_add()
715 region->region.userspace_addr = (uintptr_t) region->host_mem; in vm_userspace_mem_region_add()
716 ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region); in vm_userspace_mem_region_add()
722 guest_paddr, (uint64_t) region->region.memory_size); in vm_userspace_mem_region_add()
724 /* Add to linked-list of memory regions. */ in vm_userspace_mem_region_add()
725 list_add(®ion->list, &vm->userspace_mem_regions); in vm_userspace_mem_region_add()
729 * Memslot to region
732 * vm - Virtual Machine
733 * memslot - KVM memory slot ID
738 * Pointer to memory region structure that describe memory region
739 * using kvm memory slot ID given by memslot. TEST_ASSERT failure
740 * on error (e.g. currently no memory region using memslot as a KVM
741 * memory slot ID).
746 struct userspace_mem_region *region; in memslot2region() local
748 list_for_each_entry(region, &vm->userspace_mem_regions, list) { in memslot2region()
749 if (region->region.slot == memslot) in memslot2region()
750 return region; in memslot2region()
753 fprintf(stderr, "No mem region with the requested slot found,\n" in memslot2region()
755 fputs("---- vm dump ----\n", stderr); in memslot2region()
757 TEST_FAIL("Mem region not found"); in memslot2region()
762 * VM Memory Region Flags Set
765 * vm - Virtual Machine
766 * flags - Starting guest physical address
772 * Sets the flags of the memory region specified by the value of slot,
778 struct userspace_mem_region *region; in vm_mem_region_set_flags() local
780 region = memslot2region(vm, slot); in vm_mem_region_set_flags()
782 region->region.flags = flags; in vm_mem_region_set_flags()
784 ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region); in vm_mem_region_set_flags()
792 * VM Memory Region Move
795 * vm - Virtual Machine
796 * slot - Slot of the memory region to move
797 * new_gpa - Starting guest physical address
803 * Change the gpa of a memory region.
807 struct userspace_mem_region *region; in vm_mem_region_move() local
810 region = memslot2region(vm, slot); in vm_mem_region_move()
812 region->region.guest_phys_addr = new_gpa; in vm_mem_region_move()
814 ret = ioctl(vm->fd, KVM_SET_USER_MEMORY_REGION, ®ion->region); in vm_mem_region_move()
822 * VM Memory Region Delete
825 * vm - Virtual Machine
826 * slot - Slot of the memory region to delete
832 * Delete a memory region.
874 * vm - Virtual Machine
875 * vcpuid - VCPU ID
895 vcpuid, vcpu->id, vcpu->state); in vm_vcpu_add()
899 TEST_ASSERT(vcpu != NULL, "Insufficient Memory"); in vm_vcpu_add()
900 vcpu->id = vcpuid; in vm_vcpu_add()
901 vcpu->fd = ioctl(vm->fd, KVM_CREATE_VCPU, vcpuid); in vm_vcpu_add()
902 TEST_ASSERT(vcpu->fd >= 0, "KVM_CREATE_VCPU failed, rc: %i errno: %i", in vm_vcpu_add()
903 vcpu->fd, errno); in vm_vcpu_add()
905 TEST_ASSERT(vcpu_mmap_sz() >= sizeof(*vcpu->state), "vcpu mmap size " in vm_vcpu_add()
907 vcpu_mmap_sz(), sizeof(*vcpu->state)); in vm_vcpu_add()
908 vcpu->state = (struct kvm_run *) mmap(NULL, sizeof(*vcpu->state), in vm_vcpu_add()
909 PROT_READ | PROT_WRITE, MAP_SHARED, vcpu->fd, 0); in vm_vcpu_add()
910 TEST_ASSERT(vcpu->state != MAP_FAILED, "mmap vcpu_state failed, " in vm_vcpu_add()
913 /* Add to linked-list of VCPUs. */ in vm_vcpu_add()
914 list_add(&vcpu->list, &vm->vcpus); in vm_vcpu_add()
921 * vm - Virtual Machine
922 * sz - Size (bytes)
923 * vaddr_min - Minimum Virtual Address
940 uint64_t pages = (sz + vm->page_size - 1) >> vm->page_shift; in vm_vaddr_unused_gap()
943 uint64_t pgidx_start = (vaddr_min + vm->page_size - 1) >> vm->page_shift; in vm_vaddr_unused_gap()
944 if ((pgidx_start * vm->page_size) < vaddr_min) in vm_vaddr_unused_gap()
948 if (!sparsebit_is_set_num(vm->vpages_valid, in vm_vaddr_unused_gap()
950 pgidx_start = sparsebit_next_set_num(vm->vpages_valid, in vm_vaddr_unused_gap()
959 if (sparsebit_is_clear_num(vm->vpages_mapped, in vm_vaddr_unused_gap()
962 pgidx_start = sparsebit_next_clear_num(vm->vpages_mapped, in vm_vaddr_unused_gap()
971 if (!sparsebit_is_set_num(vm->vpages_valid, in vm_vaddr_unused_gap()
974 vm->vpages_valid, pgidx_start, pages); in vm_vaddr_unused_gap()
984 return -1; in vm_vaddr_unused_gap()
987 TEST_ASSERT(sparsebit_is_set_num(vm->vpages_valid, in vm_vaddr_unused_gap()
993 TEST_ASSERT(sparsebit_is_clear_num(vm->vpages_mapped, in vm_vaddr_unused_gap()
1000 return pgidx_start * vm->page_size; in vm_vaddr_unused_gap()
1007 * vm - Virtual Machine
1008 * sz - Size in bytes
1009 * vaddr_min - Minimum starting virtual address
1010 * data_memslot - Memory region slot for data pages
1011 * pgd_memslot - Memory region slot for new virtual translation tables
1027 uint64_t pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0); in vm_vaddr_alloc()
1039 pages--, vaddr += vm->page_size) { in vm_vaddr_alloc()
1043 KVM_UTIL_MIN_PFN * vm->page_size, data_memslot); in vm_vaddr_alloc()
1047 sparsebit_set(vm->vpages_mapped, in vm_vaddr_alloc()
1048 vaddr >> vm->page_shift); in vm_vaddr_alloc()
1058 * vm - Virtual Machine
1059 * vaddr - Virtuall address to map
1060 * paddr - VM Physical Address
1061 * npages - The number of pages to map
1062 * pgd_memslot - Memory region slot for new virtual translation tables
1074 size_t page_size = vm->page_size; in virt_map()
1080 while (npages--) { in virt_map()
1091 * vm - Virtual Machine
1092 * gpa - VM physical address
1099 * Locates the memory region containing the VM physical address given
1101 * address providing the memory to the vm physical address is returned.
1102 * A TEST_ASSERT failure occurs if no region containing gpa exists.
1106 struct userspace_mem_region *region; in addr_gpa2hva() local
1108 list_for_each_entry(region, &vm->userspace_mem_regions, list) { in addr_gpa2hva()
1109 if ((gpa >= region->region.guest_phys_addr) in addr_gpa2hva()
1110 && (gpa <= (region->region.guest_phys_addr in addr_gpa2hva()
1111 + region->region.memory_size - 1))) in addr_gpa2hva()
1112 return (void *) ((uintptr_t) region->host_mem in addr_gpa2hva()
1113 + (gpa - region->region.guest_phys_addr)); in addr_gpa2hva()
1116 TEST_FAIL("No vm physical memory at 0x%lx", gpa); in addr_gpa2hva()
1124 * vm - Virtual Machine
1125 * hva - Host virtual address
1132 * Locates the memory region containing the host virtual address given
1135 * region containing hva exists.
1139 struct userspace_mem_region *region; in addr_hva2gpa() local
1141 list_for_each_entry(region, &vm->userspace_mem_regions, list) { in addr_hva2gpa()
1142 if ((hva >= region->host_mem) in addr_hva2gpa()
1143 && (hva <= (region->host_mem in addr_hva2gpa()
1144 + region->region.memory_size - 1))) in addr_hva2gpa()
1146 region->region.guest_phys_addr in addr_hva2gpa()
1147 + (hva - (uintptr_t) region->host_mem)); in addr_hva2gpa()
1151 return -1; in addr_hva2gpa()
1158 * vm - Virtual Machine
1170 ret = ioctl(vm->fd, KVM_CREATE_IRQCHIP, 0); in vm_create_irqchip()
1174 vm->has_irqchip = true; in vm_create_irqchip()
1181 * vm - Virtual Machine
1182 * vcpuid - VCPU ID
1197 return vcpu->state; in vcpu_state()
1204 * vm - Virtual Machine
1205 * vcpuid - VCPU ID
1228 rc = ioctl(vcpu->fd, KVM_RUN, NULL); in _vcpu_run()
1229 } while (rc == -1 && errno == EINTR); in _vcpu_run()
1243 vcpu->state->immediate_exit = 1; in vcpu_run_complete_io()
1244 ret = ioctl(vcpu->fd, KVM_RUN, NULL); in vcpu_run_complete_io()
1245 vcpu->state->immediate_exit = 0; in vcpu_run_complete_io()
1247 TEST_ASSERT(ret == -1 && errno == EINTR, in vcpu_run_complete_io()
1256 int ret = ioctl(vcpu->fd, KVM_SET_GUEST_DEBUG, debug); in vcpu_set_guest_debug()
1265 * vm - Virtual Machine
1266 * vcpuid - VCPU ID
1267 * mp_state - mp_state to be set
1284 ret = ioctl(vcpu->fd, KVM_SET_MP_STATE, mp_state); in vcpu_set_mp_state()
1293 * vm - Virtual Machine
1294 * vcpuid - VCPU ID
1311 TEST_ASSERT(ret == -1 && errno == E2BIG, "KVM_GET_REG_LIST n=0"); in vcpu_get_reg_list()
1313 reg_list->n = reg_list_n.n; in vcpu_get_reg_list()
1322 * vm - Virtual Machine
1323 * vcpuid - VCPU ID
1326 * regs - current state of VCPU regs
1340 ret = ioctl(vcpu->fd, KVM_GET_REGS, regs); in vcpu_regs_get()
1349 * vm - Virtual Machine
1350 * vcpuid - VCPU ID
1351 * regs - Values to set VCPU regs to
1367 ret = ioctl(vcpu->fd, KVM_SET_REGS, regs); in vcpu_regs_set()
1381 ret = ioctl(vcpu->fd, KVM_GET_VCPU_EVENTS, events); in vcpu_events_get()
1394 ret = ioctl(vcpu->fd, KVM_SET_VCPU_EVENTS, events); in vcpu_events_set()
1409 ret = ioctl(vcpu->fd, KVM_GET_NESTED_STATE, state); in vcpu_nested_state_get()
1423 ret = ioctl(vcpu->fd, KVM_SET_NESTED_STATE, state); in vcpu_nested_state_set()
1438 * vm - Virtual Machine
1439 * vcpuid - VCPU ID
1442 * sregs - current state of VCPU system regs
1456 ret = ioctl(vcpu->fd, KVM_GET_SREGS, sregs); in vcpu_sregs_get()
1465 * vm - Virtual Machine
1466 * vcpuid - VCPU ID
1467 * sregs - Values to set VCPU system regs to
1489 return ioctl(vcpu->fd, KVM_SET_SREGS, sregs); in _vcpu_sregs_set()
1532 * vm - Virtual Machine
1533 * vcpuid - VCPU ID
1534 * cmd - Ioctl number
1535 * arg - Argument to pass to the ioctl
1559 ret = ioctl(vcpu->fd, cmd, arg); in _vcpu_ioctl()
1568 * vm - Virtual Machine
1569 * cmd - Ioctl number
1570 * arg - Argument to pass to the ioctl
1580 ret = ioctl(vm->fd, cmd, arg); in vm_ioctl()
1589 * vm - Virtual Machine
1590 * indent - Left margin indent amount
1593 * stream - Output FILE stream
1602 struct userspace_mem_region *region; in vm_dump() local
1605 fprintf(stream, "%*smode: 0x%x\n", indent, "", vm->mode); in vm_dump()
1606 fprintf(stream, "%*sfd: %i\n", indent, "", vm->fd); in vm_dump()
1607 fprintf(stream, "%*spage_size: 0x%x\n", indent, "", vm->page_size); in vm_dump()
1609 list_for_each_entry(region, &vm->userspace_mem_regions, list) { in vm_dump()
1612 (uint64_t) region->region.guest_phys_addr, in vm_dump()
1613 (uint64_t) region->region.memory_size, in vm_dump()
1614 region->host_mem); in vm_dump()
1616 sparsebit_dump(stream, region->unused_phy_pages, 0); in vm_dump()
1619 sparsebit_dump(stream, vm->vpages_mapped, indent + 2); in vm_dump()
1621 vm->pgd_created); in vm_dump()
1622 if (vm->pgd_created) { in vm_dump()
1628 list_for_each_entry(vcpu, &vm->vcpus, list) in vm_dump()
1629 vcpu_dump(stream, vm, vcpu->id, indent + 2); in vm_dump()
1666 * exit_reason - Exit reason
1693 * vm - Virtual Machine
1694 * num - number of pages
1695 * paddr_min - Physical address minimum
1696 * memslot - Memory region to allocate page from
1711 struct userspace_mem_region *region; in vm_phy_pages_alloc() local
1716 TEST_ASSERT((paddr_min % vm->page_size) == 0, "Min physical address " in vm_phy_pages_alloc()
1719 paddr_min, vm->page_size); in vm_phy_pages_alloc()
1721 region = memslot2region(vm, memslot); in vm_phy_pages_alloc()
1722 base = pg = paddr_min >> vm->page_shift; in vm_phy_pages_alloc()
1726 if (!sparsebit_is_set(region->unused_phy_pages, pg)) { in vm_phy_pages_alloc()
1727 base = pg = sparsebit_next_set(region->unused_phy_pages, pg); in vm_phy_pages_alloc()
1736 paddr_min, vm->page_size, memslot); in vm_phy_pages_alloc()
1737 fputs("---- vm dump ----\n", stderr); in vm_phy_pages_alloc()
1743 sparsebit_clear(region->unused_phy_pages, pg); in vm_phy_pages_alloc()
1745 return base * vm->page_size; in vm_phy_pages_alloc()
1758 * vm - Virtual Machine
1759 * gva - VM virtual address
1775 * vm - Virtual Machine
1790 /* Ensure that the KVM vendor-specific module is loaded. */ in vm_is_unrestricted_guest()
1809 return vm->page_size; in vm_get_page_size()
1814 return vm->page_shift; in vm_get_page_shift()
1819 return vm->max_gfn; in vm_get_max_gfn()
1824 return vm->fd; in vm_get_fd()
1832 unsigned int n = 1 << (new_page_shift - page_shift); in vm_calc_num_pages()
1835 return num_pages * (1 << (page_shift - new_page_shift)); in vm_calc_num_pages()
1842 return __builtin_ffs(getpagesize()) - 1; in getpageshift()