Lines Matching +full:vm +full:- +full:map
47 #include <vm/vm.h>
48 #include <vm/vm_param.h>
49 #include <vm/vm_extern.h>
50 #include <vm/vm_kern.h>
51 #include <vm/vm_page.h>
52 #include <vm/vm_map.h>
53 #include <vm/vm_object.h>
54 #include <vm/vm_pager.h>
58 #include <xen/xen-os.h>
63 MALLOC_DEFINE(M_PRIVCMD, "privcmd_dev", "Xen privcmd user-space device");
107 /*------------------------- Privcmd Pager functions --------------------------*/
120 struct privcmd_map *map = handle; in privcmd_pg_dtor() local
128 if (map->mapped == true) { in privcmd_pg_dtor()
129 cdev_mgtdev_pager_free_pages(map->mem); in privcmd_pg_dtor()
130 for (i = 0; i < map->size; i++) { in privcmd_pg_dtor()
131 rm.gpfn = atop(map->phys_base_addr) + i; in privcmd_pg_dtor()
134 free(map->err, M_PRIVCMD); in privcmd_pg_dtor()
137 error = xenmem_free(privcmd_dev, map->pseudo_phys_res_id, in privcmd_pg_dtor()
138 map->pseudo_phys_res); in privcmd_pg_dtor()
141 free(map, M_PRIVCMD); in privcmd_pg_dtor()
148 struct privcmd_map *map = object->handle; in privcmd_pg_fault() local
152 if (map->mapped != true) in privcmd_pg_fault()
156 if (pidx >= map->size || BIT_ISSET(map->size, pidx, map->err)) in privcmd_pg_fault()
159 page = PHYS_TO_VM_PAGE(map->phys_base_addr + offset); in privcmd_pg_fault()
163 KASSERT((page->flags & PG_FICTITIOUS) != 0, in privcmd_pg_fault()
179 /*----------------------- Privcmd char device methods ------------------------*/
184 struct privcmd_map *map; in privcmd_mmap_single() local
186 map = malloc(sizeof(*map), M_PRIVCMD, M_WAITOK | M_ZERO); in privcmd_mmap_single()
188 map->size = OFF_TO_IDX(size); in privcmd_mmap_single()
189 map->pseudo_phys_res_id = 0; in privcmd_mmap_single()
191 map->pseudo_phys_res = xenmem_alloc(privcmd_dev, in privcmd_mmap_single()
192 &map->pseudo_phys_res_id, size); in privcmd_mmap_single()
193 if (map->pseudo_phys_res == NULL) { in privcmd_mmap_single()
194 free(map, M_PRIVCMD); in privcmd_mmap_single()
198 map->phys_base_addr = rman_get_start(map->pseudo_phys_res); in privcmd_mmap_single()
199 map->mem = cdev_pager_allocate(map, OBJT_MGTDEVICE, &privcmd_pg_ops, in privcmd_mmap_single()
201 if (map->mem == NULL) { in privcmd_mmap_single()
202 xenmem_free(privcmd_dev, map->pseudo_phys_res_id, in privcmd_mmap_single()
203 map->pseudo_phys_res); in privcmd_mmap_single()
204 free(map, M_PRIVCMD); in privcmd_mmap_single()
208 *object = map->mem; in privcmd_mmap_single()
216 vm_map_t map; in setup_virtual_area() local
228 map = &td->td_proc->p_vmspace->vm_map; in setup_virtual_area()
229 error = vm_map_lookup(&map, addr, VM_PROT_NONE, &entry, &mem, &pindex, in setup_virtual_area()
231 if (error != KERN_SUCCESS || (entry->start != addr) || in setup_virtual_area()
232 (entry->end != addr + (num * PAGE_SIZE))) in setup_virtual_area()
235 vm_map_lookup_done(map, entry); in setup_virtual_area()
236 if ((mem->type != OBJT_MGTDEVICE) || in setup_virtual_area()
237 (mem->un_pager.devp.ops != &privcmd_pg_ops)) in setup_virtual_area()
240 umap = mem->handle; in setup_virtual_area()
242 umap->err = BITSET_ALLOC(num, M_PRIVCMD, M_WAITOK | M_ZERO); in setup_virtual_area()
260 * Constify user-data to prevent unintended changes to the restriction in privcmd_ioctl()
272 if (u->dom != DOMID_INVALID) { in privcmd_ioctl()
280 * user-space pages if SMAP is enabled, so temporary disable it in privcmd_ioctl()
286 error = privcmd_hypercall(hcall->op, hcall->arg[0], in privcmd_ioctl()
287 hcall->arg[1], hcall->arg[2], hcall->arg[3], hcall->arg[4]); in privcmd_ioctl()
293 hcall->retval = error; in privcmd_ioctl()
297 hcall->retval = 0; in privcmd_ioctl()
313 if (u->dom != DOMID_INVALID && u->dom != mmap->dom) { in privcmd_ioctl()
318 umap = setup_virtual_area(td, mmap->addr, mmap->num); in privcmd_ioctl()
326 add.u.foreign_domid = mmap->dom; in privcmd_ioctl()
332 num = MIN(mmap->num, UINT16_MAX); in privcmd_ioctl()
342 for (index = 0; index < mmap->num; index += num) { in privcmd_ioctl()
343 num = MIN(mmap->num - index, UINT16_MAX); in privcmd_ioctl()
346 error = copyin(&mmap->arr[index], idxs, in privcmd_ioctl()
352 gpfns[i] = atop(umap->phys_base_addr + in privcmd_ioctl()
369 BIT_SET(mmap->num, index + i, in privcmd_ioctl()
370 umap->err); in privcmd_ioctl()
374 error = copyout(errs, &mmap->err[index], in privcmd_ioctl()
380 umap->mapped = true; in privcmd_ioctl()
386 if (!umap->mapped) in privcmd_ioctl()
387 free(umap->err, M_PRIVCMD); in privcmd_ioctl()
399 if (u->dom != DOMID_INVALID && u->dom != mmap->dom) { in privcmd_ioctl()
406 adq.domid = mmap->dom; in privcmd_ioctl()
407 adq.type = mmap->type; in privcmd_ioctl()
408 adq.id = mmap->id; in privcmd_ioctl()
411 if (mmap->addr == 0 && mmap->num == 0) { in privcmd_ioctl()
417 mmap->num = adq.nr_frames; in privcmd_ioctl()
421 umap = setup_virtual_area(td, mmap->addr, mmap->num); in privcmd_ioctl()
427 adq.nr_frames = mmap->num; in privcmd_ioctl()
428 adq.frame = mmap->idx; in privcmd_ioctl()
430 gpfns = malloc(sizeof(*gpfns) * mmap->num, M_PRIVCMD, M_WAITOK); in privcmd_ioctl()
431 for (i = 0; i < mmap->num; i++) in privcmd_ioctl()
432 gpfns[i] = atop(umap->phys_base_addr) + i; in privcmd_ioctl()
439 umap->mapped = true; in privcmd_ioctl()
442 if (!umap->mapped) in privcmd_ioctl()
443 free(umap->err, M_PRIVCMD); in privcmd_ioctl()
454 if (u->dom != DOMID_INVALID && u->dom != dmop->dom) { in privcmd_ioctl()
459 if (dmop->num == 0) in privcmd_ioctl()
462 if (dmop->num > MAX_DMOP_BUFFERS) { in privcmd_ioctl()
467 bufs = malloc(sizeof(*bufs) * dmop->num, M_PRIVCMD, M_WAITOK); in privcmd_ioctl()
469 error = copyin(dmop->ubufs, bufs, sizeof(*bufs) * dmop->num); in privcmd_ioctl()
475 hbufs = malloc(sizeof(*hbufs) * dmop->num, M_PRIVCMD, M_WAITOK); in privcmd_ioctl()
476 for (i = 0; i < dmop->num; i++) { in privcmd_ioctl()
485 error = HYPERVISOR_dm_op(dmop->dom, dmop->num, hbufs); in privcmd_ioctl()
509 if (u->dom != DOMID_INVALID && u->dom != dom) { in privcmd_ioctl()
510 error = -EINVAL; in privcmd_ioctl()
513 u->dom = dom; in privcmd_ioctl()
539 u->dom = DOMID_INVALID; in privcmd_open()
550 /*------------------ Private Device Attachment Functions --------------------*/
559 panic("unable to attach privcmd user-space device"); in privcmd_identify()
567 device_set_desc(dev, "Xen privileged interface user-space device"); in privcmd_probe()
580 /*-------------------- Private Device Attachment Data -----------------------*/