Lines Matching refs:vmm

59 struct vmm {  struct
76 vmm_update_ncpu(vmm_t *vmm) in vmm_update_ncpu() argument
80 assert(vm_active_cpus(vmm->vmm_ctx, &cpuset) == 0); in vmm_update_ncpu()
82 for (vmm->vmm_ncpu = 0; in vmm_update_ncpu()
83 CPU_ISSET(vmm->vmm_ncpu, &cpuset) == 1; in vmm_update_ncpu()
84 vmm->vmm_ncpu++) in vmm_update_ncpu()
91 vmm_t *vmm = NULL; in vmm_open_vm() local
95 vmm = malloc(sizeof (vmm_t)); in vmm_open_vm()
96 if (vmm == NULL) in vmm_open_vm()
99 bzero(vmm, sizeof (vmm_t)); in vmm_open_vm()
100 vmm->vmm_mem = MAP_FAILED; in vmm_open_vm()
102 list_create(&vmm->vmm_memlist, sizeof (vmm_memseg_t), in vmm_open_vm()
105 vmm->vmm_ctx = vm_open(name); in vmm_open_vm()
106 if (vmm->vmm_ctx == NULL) { in vmm_open_vm()
107 list_destroy(&vmm->vmm_memlist); in vmm_open_vm()
108 free(vmm); in vmm_open_vm()
112 vmm_update_ncpu(vmm); in vmm_open_vm()
119 if (vmm->vmm_ncpu == 0) { in vmm_open_vm()
122 vmm_update_ncpu(vmm); in vmm_open_vm()
123 } while (vmm->vmm_ncpu == 0); in vmm_open_vm()
126 vmm->vmm_vcpu = calloc(vmm->vmm_ncpu, sizeof (struct vcpu *)); in vmm_open_vm()
127 if (vmm->vmm_vcpu == NULL) in vmm_open_vm()
129 for (i = 0; i < vmm->vmm_ncpu; i++) { in vmm_open_vm()
130 vmm->vmm_vcpu[i] = vm_vcpu_open(vmm->vmm_ctx, i); in vmm_open_vm()
131 if (vmm->vmm_vcpu[i] == NULL) { in vmm_open_vm()
134 vm_vcpu_close(vmm->vmm_vcpu[i]); in vmm_open_vm()
135 free(vmm->vmm_vcpu); in vmm_open_vm()
141 return (vmm); in vmm_open_vm()
145 vmm_close_vm(vmm); in vmm_open_vm()
152 vmm_close_vm(vmm_t *vmm) in vmm_close_vm() argument
156 vmm_unmap(vmm); in vmm_close_vm()
158 for (i = 0; i < vmm->vmm_ncpu; i++) in vmm_close_vm()
159 vm_vcpu_close(vmm->vmm_vcpu[i]); in vmm_close_vm()
160 free(vmm->vmm_vcpu); in vmm_close_vm()
162 list_destroy(&vmm->vmm_memlist); in vmm_close_vm()
164 if (vmm->vmm_ctx != NULL) in vmm_close_vm()
165 vm_close(vmm->vmm_ctx); in vmm_close_vm()
167 free(vmm); in vmm_close_vm()
171 vmm_get_memseg(vmm_t *vmm, uintptr_t gpa) in vmm_get_memseg() argument
178 error = vm_mmap_getnext(vmm->vmm_ctx, &ms.vms_gpa, &ms.vms_segid, in vmm_get_memseg()
183 error = vm_get_memseg(vmm->vmm_ctx, ms.vms_segid, &ms.vms_seglen, in vmm_get_memseg()
204 vmm_map(vmm_t *vmm, boolean_t writable) in vmm_map() argument
210 if (vmm->vmm_mem != MAP_FAILED) { in vmm_map()
215 assert(list_is_empty(&vmm->vmm_memlist)); in vmm_map()
218 ms = vmm_get_memseg(vmm, last_gpa); in vmm_map()
224 list_insert_tail(&vmm->vmm_memlist, ms); in vmm_map()
227 vmm->vmm_mem = mmap(NULL, last_gpa, PROT_NONE, in vmm_map()
230 if (vmm->vmm_mem == MAP_FAILED) in vmm_map()
233 for (ms = list_head(&vmm->vmm_memlist); in vmm_map()
235 ms = list_next(&vmm->vmm_memlist, ms)) { in vmm_map()
249 if (vm_get_devmem_offset(vmm->vmm_ctx, ms->vms_segid, in vmm_map()
262 vmm->vmm_memsize += ms->vms_maplen; in vmm_map()
264 if (mmap(vmm->vmm_mem + ms->vms_gpa, ms->vms_maplen, in vmm_map()
266 vm_get_device_fd(vmm->vmm_ctx), mapoff) == MAP_FAILED) in vmm_map()
273 vmm_unmap(vmm); in vmm_map()
279 vmm_unmap(vmm_t *vmm) in vmm_unmap() argument
281 while (!list_is_empty(&vmm->vmm_memlist)) { in vmm_unmap()
282 vmm_memseg_t *ms = list_remove_head(&vmm->vmm_memlist); in vmm_unmap()
284 if (vmm->vmm_mem != MAP_FAILED) { in vmm_unmap()
285 (void) munmap(vmm->vmm_mem + ms->vms_gpa, in vmm_unmap()
292 if (vmm->vmm_mem != MAP_FAILED) in vmm_unmap()
293 (void) munmap(vmm->vmm_mem, vmm->vmm_memsize); in vmm_unmap()
295 vmm->vmm_mem = MAP_FAILED; in vmm_unmap()
296 vmm->vmm_memsize = 0; in vmm_unmap()
300 vmm_pread(vmm_t *vmm, void *buf, size_t len, uintptr_t addr) in vmm_pread() argument
306 for (ms = list_head(&vmm->vmm_memlist); in vmm_pread()
308 ms = list_next(&vmm->vmm_memlist, ms)) { in vmm_pread()
317 bcopy(vmm->vmm_mem + addr, buf, len - res); in vmm_pread()
333 vmm_pwrite(vmm_t *vmm, const void *buf, size_t len, uintptr_t addr) in vmm_pwrite() argument
339 for (ms = list_head(&vmm->vmm_memlist); in vmm_pwrite()
341 ms = list_next(&vmm->vmm_memlist, ms)) { in vmm_pwrite()
349 bcopy(buf, vmm->vmm_mem + addr, len - res); in vmm_pwrite()
365 vmm_ncpu(vmm_t *vmm) in vmm_ncpu() argument
367 return (vmm->vmm_ncpu); in vmm_ncpu()
371 vmm_memsize(vmm_t *vmm) in vmm_memsize() argument
373 return (vmm->vmm_memsize); in vmm_memsize()
377 vmm_cont(vmm_t *vmm) in vmm_cont() argument
379 return (vm_resume_all_cpus(vmm->vmm_ctx)); in vmm_cont()
383 vmm_step(vmm_t *vmm, int vcpuid) in vmm_step() argument
388 if (vcpuid >= vmm->vmm_ncpu) { in vmm_step()
393 ret = vm_set_capability(vmm->vmm_vcpu[vcpuid], VM_CAP_MTRAP_EXIT, 1); in vmm_step()
397 assert(vm_resume_cpu(vmm->vmm_vcpu[vcpuid]) == 0); in vmm_step()
400 (void) vm_debug_cpus(vmm->vmm_ctx, &cpuset); in vmm_step()
403 (void) vm_set_capability(vmm->vmm_vcpu[vcpuid], VM_CAP_MTRAP_EXIT, 0); in vmm_step()
409 vmm_stop(vmm_t *vmm) in vmm_stop() argument
411 int ret = vm_suspend_all_cpus(vmm->vmm_ctx); in vmm_stop()
414 vmm_update_ncpu(vmm); in vmm_stop()
539 vmm_getreg(vmm_t *vmm, int vcpuid, int reg, uint64_t *val) in vmm_getreg() argument
546 return (vm_get_register(vmm->vmm_vcpu[vcpuid], reg, val)); in vmm_getreg()
550 vmm_setreg(vmm_t *vmm, int vcpuid, int reg, uint64_t val) in vmm_setreg() argument
557 return (vm_set_register(vmm->vmm_vcpu[vcpuid], reg, val)); in vmm_setreg()
561 vmm_get_regset(vmm_t *vmm, int vcpuid, size_t nregs, const int *regnums, in vmm_get_regset() argument
578 ret = vm_get_register_set(vmm->vmm_vcpu[vcpuid], nregs, vm_regnums, in vmm_get_regset()
587 vmm_set_regset(vmm_t *vmm, int vcpuid, size_t nregs, const int *regnums, in vmm_set_regset() argument
604 ret = vm_set_register_set(vmm->vmm_vcpu[vcpuid], nregs, vm_regnums, in vmm_set_regset()
613 vmm_get_desc(vmm_t *vmm, int vcpuid, int desc, vmm_desc_t *vd) in vmm_get_desc() argument
619 return (vm_get_desc(vmm->vmm_vcpu[vcpuid], desc, &vd->vd_base, in vmm_get_desc()
625 vmm_set_desc(vmm_t *vmm, int vcpuid, int desc, vmm_desc_t *vd) in vmm_set_desc() argument
631 return (vm_set_desc(vmm->vmm_vcpu[vcpuid], desc, vd->vd_base, in vmm_set_desc()
677 vmm_pte2paddr(vmm_t *vmm, uint64_t pte, boolean_t ia32, int level, in vmm_pte2paddr() argument
712 if (vmm_pread(vmm, &pte, pte_size, *paddr) != pte_size) in vmm_pte2paddr()
714 return (vmm_pte2paddr(vmm, pte, ia32, level - 1, vaddr, paddr)); in vmm_pte2paddr()
718 vmm_vcpu_mmu_mode(vmm_t *vmm, int vcpuid __unused, vmm_mmu_t *mmu) in vmm_vcpu_mmu_mode() argument
731 vmm_vcpu_mode(vmm_t *vmm, int vcpuid) in vmm_vcpu_mode() argument
735 if (vmm_get_regset(vmm, vcpuid, ARRAY_SIZE(vmm_mmu_regnum), in vmm_vcpu_mode()
739 return (vmm_vcpu_mmu_mode(vmm, vcpuid, &mmu)); in vmm_vcpu_mode()
743 vmm_vcpu_isa(vmm_t *vmm, int vcpuid) in vmm_vcpu_isa() argument
747 if (vmm_get_desc(vmm, vcpuid, VMM_DESC_CS, &cs) != 0) in vmm_vcpu_isa()
770 vmm_vtol(vmm_t *vmm, int vcpuid, int seg, uint64_t vaddr, uint64_t *laddr) in vmm_vtol() argument
775 if (vmm_get_desc(vmm, vcpuid, seg, &desc) != 0) in vmm_vtol()
778 switch (vmm_vcpu_mode(vmm, vcpuid)) { in vmm_vtol()
815 vmm_vtop(vmm_t *vmm, int vcpuid, int seg, uint64_t vaddr, uint64_t *paddr) in vmm_vtop() argument
820 if (vmm_vtol(vmm, vcpuid, seg, vaddr, &vaddr) != 0) in vmm_vtop()
823 if (vmm_get_regset(vmm, vcpuid, ARRAY_SIZE(vmm_mmu_regnum), in vmm_vtop()
833 switch (vmm_vcpu_mmu_mode(vmm, vcpuid, &mmu)) { in vmm_vtop()
836 ret = vmm_pte2paddr(vmm, mmu.vm_cr3, B_TRUE, 2, vaddr, paddr); in vmm_vtop()
840 ret = vmm_pte2paddr(vmm, mmu.vm_cr3, B_FALSE, 3, vaddr, paddr); in vmm_vtop()
844 ret = vmm_pte2paddr(vmm, mmu.vm_cr3, B_FALSE, 4, vaddr, paddr); in vmm_vtop()
854 vmm_vread(vmm_t *vmm, int vcpuid, int seg, void *buf, size_t len, uintptr_t in vmm_vread() argument
863 if (vmm_vtop(vmm, vcpuid, seg, addr, &paddr) != 0) { in vmm_vread()
874 if (vmm_pread(vmm, buf, plen, paddr) != plen) in vmm_vread()
886 vmm_vwrite(vmm_t *vmm, int vcpuid, int seg, const void *buf, size_t len, in vmm_vwrite() argument
895 if (vmm_vtop(vmm, vcpuid, seg, addr, &paddr) != 0) { in vmm_vwrite()
906 if (vmm_pwrite(vmm, buf, plen, paddr) != plen) in vmm_vwrite()