vmap
EFI_MEMORY_DESCRIPTOR *desc, *viter, *vmap;
vmap = malloc(sz);
if (vmap == NULL)
viter = vmap;
ret = RS->SetVirtualAddressMap(nset * mmsz, mmsz, mmver, vmap);
free(vmap);
void *vmap(struct page **pages, unsigned int count, unsigned long flags,
struct vm_area_struct *vmap;
vmap = kzalloc(sizeof(*vmap), GFP_KERNEL);
vmap->vm_start = 0;
vmap->vm_end = size;
vmap->vm_pgoff = *offset / PAGE_SIZE;
vmap->vm_pfn = 0;
vmap->vm_flags = vmap->vm_page_prot = (nprot & VM_PROT_ALL);
vmap->vm_flags |= VM_SHARED;
vmap->vm_ops = NULL;
vmap->vm_file = get_file(filp);
vmap->vm_mm = mm;
if (unlikely(down_write_killable(&vmap->vm_mm->mmap_sem))) {
error = -OPW(fp, td, fop->mmap(filp, vmap));
up_write(&vmap->vm_mm->mmap_sem);
linux_cdev_handle_free(vmap);
attr = pgprot2cachemode(vmap->vm_page_prot);
if (vmap->vm_ops != NULL) {
if (vmap->vm_ops->open == NULL ||
vmap->vm_ops->close == NULL ||
vmap->vm_private_data == NULL) {
linux_cdev_handle_free(vmap);
vm_private_data = vmap->vm_private_data;
TAILQ_INSERT_TAIL(&linux_vma_head, vmap, vm_entry);
vm_no_fault = (vmap->vm_ops->fault == NULL);
linux_cdev_handle_free(vmap);
linux_cdev_handle_remove(vmap);
linux_cdev_handle_free(vmap);
(vm_paddr_t)vmap->vm_pfn << PAGE_SHIFT, vmap->vm_len);
*object = vm_pager_allocate(OBJT_SG, sg, vmap->vm_len,
linux_cdev_handle_free(vmap);
struct vm_area_struct *vmap;
vmap = linux_cdev_handle_find(vm_obj->handle);
MPASS(vmap != NULL);
MPASS(vmap->vm_private_data == vm_obj->handle);
if (likely(vmap->vm_ops != NULL && offset < vmap->vm_len)) {
vm_paddr_t paddr = IDX_TO_OFF(vmap->vm_pfn) + offset;
struct vm_area_struct *vmap;
vmap = linux_cdev_handle_find(vm_obj->handle);
MPASS(vmap != NULL);
MPASS(vmap->vm_private_data == vm_obj->handle);
down_write(&vmap->vm_mm->mmap_sem);
if (unlikely(vmap->vm_ops == NULL)) {
vmf.vma = vmap;
vmap->vm_pfn_count = 0;
vmap->vm_pfn_pcount = &vmap->vm_pfn_count;
vmap->vm_obj = vm_obj;
err = vmap->vm_ops->fault(&vmf);
while (vmap->vm_pfn_count == 0 && err == VM_FAULT_NOPAGE) {
err = vmap->vm_ops->fault(&vmf);
*first = vmap->vm_pfn_first;
*last = *first + vmap->vm_pfn_count - 1;
up_write(&vmap->vm_mm->mmap_sem);
linux_cdev_handle_free(struct vm_area_struct *vmap)
if (vmap->vm_file != NULL)
fput(vmap->vm_file);
mmput(vmap->vm_mm);
kfree(vmap);
linux_cdev_handle_remove(struct vm_area_struct *vmap)
TAILQ_REMOVE(&linux_vma_head, vmap, vm_entry);
struct vm_area_struct *vmap;
TAILQ_FOREACH(vmap, &linux_vma_head, vm_entry) {
if (vmap->vm_private_data == handle)
return (vmap);
struct vm_area_struct *vmap;
vmap = linux_cdev_handle_find(handle);
MPASS(vmap != NULL);
linux_cdev_handle_remove(vmap);
down_write(&vmap->vm_mm->mmap_sem);
vm_ops = vmap->vm_ops;
vm_ops->close(vmap);
up_write(&vmap->vm_mm->mmap_sem);
linux_cdev_handle_free(vmap);
buf->direct.buf = vmap(pages, buf->nbufs, VM_MAP, PAGE_KERNEL);
buf->direct.buf = vmap(pages, buf->nbufs, VM_MAP, PAGE_KERNEL);