• Home
  • Raw
  • Download

Lines Matching full:vm

230 void virt_pgd_alloc(struct kvm_vm *vm, uint32_t pgd_memslot)  in virt_pgd_alloc()  argument
234 TEST_ASSERT(vm->mode == VM_MODE_FLAT48PG, "Attempt to use " in virt_pgd_alloc()
235 "unknown or unsupported guest mode, mode: 0x%x", vm->mode); in virt_pgd_alloc()
238 if (!vm->pgd_created) { in virt_pgd_alloc()
239 vm_paddr_t paddr = vm_phy_page_alloc(vm, in virt_pgd_alloc()
241 vm->pgd = paddr; in virt_pgd_alloc()
242 vm->pgd_created = true; in virt_pgd_alloc()
246 /* VM Virtual Page Map
249 * vm - Virtual Machine
250 * vaddr - VM Virtual Address
251 * paddr - VM Physical Address
258 * Within the VM given by vm, creates a virtual translation for the page
261 void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr, in virt_pg_map() argument
267 TEST_ASSERT(vm->mode == VM_MODE_FLAT48PG, "Attempt to use " in virt_pg_map()
268 "unknown or unsupported guest mode, mode: 0x%x", vm->mode); in virt_pg_map()
270 TEST_ASSERT((vaddr % vm->page_size) == 0, in virt_pg_map()
272 " vaddr: 0x%lx vm->page_size: 0x%x", in virt_pg_map()
273 vaddr, vm->page_size); in virt_pg_map()
274 TEST_ASSERT(sparsebit_is_set(vm->vpages_valid, in virt_pg_map()
275 (vaddr >> vm->page_shift)), in virt_pg_map()
278 TEST_ASSERT((paddr % vm->page_size) == 0, in virt_pg_map()
280 " paddr: 0x%lx vm->page_size: 0x%x", in virt_pg_map()
281 paddr, vm->page_size); in virt_pg_map()
282 TEST_ASSERT((paddr >> vm->page_shift) <= vm->max_gfn, in virt_pg_map()
284 " paddr: 0x%lx vm->max_gfn: 0x%lx vm->page_size: 0x%x", in virt_pg_map()
285 paddr, vm->max_gfn, vm->page_size); in virt_pg_map()
293 pml4e = addr_gpa2hva(vm, vm->pgd); in virt_pg_map()
295 pml4e[index[3]].address = vm_phy_page_alloc(vm, in virt_pg_map()
297 >> vm->page_shift; in virt_pg_map()
304 pdpe = addr_gpa2hva(vm, pml4e[index[3]].address * vm->page_size); in virt_pg_map()
306 pdpe[index[2]].address = vm_phy_page_alloc(vm, in virt_pg_map()
308 >> vm->page_shift; in virt_pg_map()
315 pde = addr_gpa2hva(vm, pdpe[index[2]].address * vm->page_size); in virt_pg_map()
317 pde[index[1]].address = vm_phy_page_alloc(vm, in virt_pg_map()
319 >> vm->page_shift; in virt_pg_map()
326 pte = addr_gpa2hva(vm, pde[index[1]].address * vm->page_size); in virt_pg_map()
327 pte[index[0]].address = paddr >> vm->page_shift; in virt_pg_map()
335 * vm - Virtual Machine
344 * virtual translation tables for the VM given by vm.
346 void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent) in virt_dump() argument
353 if (!vm->pgd_created) in virt_dump()
361 pml4e_start = (struct pageMapL4Entry *) addr_gpa2hva(vm, in virt_dump()
362 vm->pgd); in virt_dump()
371 addr_hva2gpa(vm, pml4e), (uint64_t) pml4e->address, in virt_dump()
374 pdpe_start = addr_gpa2hva(vm, pml4e->address in virt_dump()
375 * vm->page_size); in virt_dump()
384 addr_hva2gpa(vm, pdpe), in virt_dump()
388 pde_start = addr_gpa2hva(vm, in virt_dump()
389 pdpe->address * vm->page_size); in virt_dump()
397 addr_hva2gpa(vm, pde), in virt_dump()
401 pte_start = addr_gpa2hva(vm, in virt_dump()
402 pde->address * vm->page_size); in virt_dump()
412 addr_hva2gpa(vm, pte), in virt_dump()
444 static void kvm_seg_fill_gdt_64bit(struct kvm_vm *vm, struct kvm_segment *segp) in kvm_seg_fill_gdt_64bit() argument
446 void *gdt = addr_gva2hva(vm, vm->gdt); in kvm_seg_fill_gdt_64bit()
469 * vm - VM whose GDT is being filled, or NULL to only write segp
480 static void kvm_seg_set_kernel_code_64bit(struct kvm_vm *vm, uint16_t selector, in kvm_seg_set_kernel_code_64bit() argument
493 if (vm) in kvm_seg_set_kernel_code_64bit()
494 kvm_seg_fill_gdt_64bit(vm, segp); in kvm_seg_set_kernel_code_64bit()
500 * vm - VM whose GDT is being filled, or NULL to only write segp
511 static void kvm_seg_set_kernel_data_64bit(struct kvm_vm *vm, uint16_t selector, in kvm_seg_set_kernel_data_64bit() argument
523 if (vm) in kvm_seg_set_kernel_data_64bit()
524 kvm_seg_fill_gdt_64bit(vm, segp); in kvm_seg_set_kernel_data_64bit()
530 * vm - Virtual Machine
531 * gpa - VM virtual address
536 * Equivalent VM physical address
538 * Translates the VM virtual address given by gva to a VM physical
539 * address and then locates the memory region containing the VM
540 * physical address, within the VM given by vm. When found, the host
541 * virtual address providing the memory to the vm physical address is returned.
543 * VM virtual address exists.
545 vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva) in addr_gva2gpa() argument
554 TEST_ASSERT(vm->mode == VM_MODE_FLAT48PG, "Attempt to use " in addr_gva2gpa()
555 "unknown or unsupported guest mode, mode: 0x%x", vm->mode); in addr_gva2gpa()
562 if (!vm->pgd_created) in addr_gva2gpa()
564 pml4e = addr_gpa2hva(vm, vm->pgd); in addr_gva2gpa()
568 pdpe = addr_gpa2hva(vm, pml4e[index[3]].address * vm->page_size); in addr_gva2gpa()
572 pde = addr_gpa2hva(vm, pdpe[index[2]].address * vm->page_size); in addr_gva2gpa()
576 pte = addr_gpa2hva(vm, pde[index[1]].address * vm->page_size); in addr_gva2gpa()
580 return (pte[index[0]].address * vm->page_size) + (gva & 0xfffu); in addr_gva2gpa()
583 TEST_ASSERT(false, "No mapping for vm virtual address, " in addr_gva2gpa()
587 static void kvm_setup_gdt(struct kvm_vm *vm, struct kvm_dtable *dt, int gdt_memslot, in kvm_setup_gdt() argument
590 if (!vm->gdt) in kvm_setup_gdt()
591 vm->gdt = vm_vaddr_alloc(vm, getpagesize(), in kvm_setup_gdt()
594 dt->base = vm->gdt; in kvm_setup_gdt()
598 static void kvm_setup_tss_64bit(struct kvm_vm *vm, struct kvm_segment *segp, in kvm_setup_tss_64bit() argument
602 if (!vm->tss) in kvm_setup_tss_64bit()
603 vm->tss = vm_vaddr_alloc(vm, getpagesize(), in kvm_setup_tss_64bit()
607 segp->base = vm->tss; in kvm_setup_tss_64bit()
612 kvm_seg_fill_gdt_64bit(vm, segp); in kvm_setup_tss_64bit()
615 void vcpu_setup(struct kvm_vm *vm, int vcpuid, int pgd_memslot, int gdt_memslot) in vcpu_setup() argument
620 vcpu_sregs_get(vm, vcpuid, &sregs); in vcpu_setup()
624 kvm_setup_gdt(vm, &sregs.gdt, gdt_memslot, pgd_memslot); in vcpu_setup()
626 switch (vm->mode) { in vcpu_setup()
633 kvm_seg_set_kernel_code_64bit(vm, 0x8, &sregs.cs); in vcpu_setup()
634 kvm_seg_set_kernel_data_64bit(vm, 0x10, &sregs.ds); in vcpu_setup()
635 kvm_seg_set_kernel_data_64bit(vm, 0x10, &sregs.es); in vcpu_setup()
636 kvm_setup_tss_64bit(vm, &sregs.tr, 0x18, gdt_memslot, pgd_memslot); in vcpu_setup()
640 TEST_ASSERT(false, "Unknown guest mode, mode: 0x%x", vm->mode); in vcpu_setup()
643 sregs.cr3 = vm->pgd; in vcpu_setup()
644 vcpu_sregs_set(vm, vcpuid, &sregs); in vcpu_setup()
649 * vcpuid - The id of the VCPU to add to the VM.
652 void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code) in vm_vcpu_add_default() argument
657 stack_vaddr = vm_vaddr_alloc(vm, DEFAULT_STACK_PGS * getpagesize(), in vm_vcpu_add_default()
661 vm_vcpu_add(vm, vcpuid, 0, 0); in vm_vcpu_add_default()
664 vcpu_regs_get(vm, vcpuid, &regs); in vm_vcpu_add_default()
668 vcpu_regs_set(vm, vcpuid, &regs); in vm_vcpu_add_default()
672 vcpu_set_mp_state(vm, vcpuid, &mp_state); in vm_vcpu_add_default()
675 /* VM VCPU CPUID Set
678 * vm - Virtual Machine
688 void vcpu_set_cpuid(struct kvm_vm *vm, in vcpu_set_cpuid() argument
691 struct vcpu *vcpu = vcpu_find(vm, vcpuid); in vcpu_set_cpuid()
701 /* Create a VM with reasonable defaults
704 * vcpuid - The id of the single VCPU to add to the VM.
713 * Pointer to opaque structure that describes the created VM.
718 struct kvm_vm *vm; in vm_create_default() local
728 /* Create VM */ in vm_create_default()
729 vm = vm_create(VM_MODE_FLAT48PG, in vm_create_default()
734 kvm_vm_elf_load(vm, program_invocation_name, 0, 0); in vm_create_default()
737 vm_create_irqchip(vm); in vm_create_default()
740 vm_vcpu_add_default(vm, vcpuid, guest_code); in vm_create_default()
742 return vm; in vm_create_default()
760 static int kvm_get_num_msrs(struct kvm_vm *vm) in kvm_get_num_msrs() argument
766 r = ioctl(vm->kvm_fd, KVM_GET_MSR_INDEX_LIST, &nmsrs); in kvm_get_num_msrs()
773 struct kvm_x86_state *vcpu_save_state(struct kvm_vm *vm, uint32_t vcpuid) in vcpu_save_state() argument
775 struct vcpu *vcpu = vcpu_find(vm, vcpuid); in vcpu_save_state()
788 nmsrs = kvm_get_num_msrs(vm); in vcpu_save_state()
791 r = ioctl(vm->kvm_fd, KVM_GET_MSR_INDEX_LIST, list); in vcpu_save_state()
848 void vcpu_load_state(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_x86_state *state) in vcpu_load_state() argument
850 struct vcpu *vcpu = vcpu_find(vm, vcpuid); in vcpu_load_state()