static int demo_mmap(struct file* filp, struct vm_area_struct *vma){ unsigned long physics = virt_to_phys((void*) (unsigned long)buffer); unsigned long mypfn = physics >>PAGE_SHIFT; unsigned long vmsize = vma->vm_end - vma->vm_start; printk("mmap called.\n"); if(vmsize >BUFFER_SIZE) return -EINVAL; vma->vm_ops = &remap_vm_ops; vma->vm_flags |= VM_RESERVED; demo_vma_open(vma); if(remap_pfn_range(vma, vma->vm_start, mypfn, vmsize, vma->vm_page_prot)); return -EAGAIN; return 0; }
static int demo_mmap(struct file *filp,struct vm_area_struct *vma) { unsigned long physics=virt_to_phys((void*)(unsigned long)buffer); unsigned long mypfn=physics>>PAGE_SHIFT; unsigned long vmsize=vma->vm_end-vma->vm_start; printk(KERN_INFO "demo mmap called.\n"); if(vmsize > BUFFER_SIZE) { return -EINVAL; } vma->vm_ops=&remap_vm_ops; vma->vm_flags|=(VM_IO | VM_LOCKED | (VM_DONTEXPAND | VM_DONTDUMP)); demo_vma_open(vma); if(remap_pfn_range(vma,vma->vm_start,mypfn,vmsize,vma->vm_page_prot)) { return -EAGAIN; } return 0; }