struct page *drv_vma_nopage( struct vm_area_struct *vma, unsigned long address, int *type ) { unsigned long phys_address, pfn; struct page *page_wanted; phys_address = hw_mem_area + (address-vma->vm_start); if( (vma->vm_end-vma->vm_start)>HW_MEM_AREA_SIZE ) return NOPAGE_SIGBUS; pfn = phys_address >> PAGE_SHIFT; if( !pfn_valid( pfn ) ) return NOPAGE_SIGBUS; page_wanted = pfn_to_page( pfn ); get_page( page_wanted ); if( type ) *type = VM_FAULT_MINOR; return page_wanted; }