linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* mmap driver entry point
@ 2002-10-08 19:59 Ankit
  0 siblings, 0 replies; 2+ messages in thread
From: Ankit @ 2002-10-08 19:59 UTC (permalink / raw)
  To: linux-kernel

iam using this driver to fetch me some memory in
my user space application by calling mmap with the
file descriptor got by opening the device file for
this driver.
mmap(0, length, flags, flags, fd, offset)

and the mmap entry point in the driver is implemented
as below:

In the implementation, it tries to write an index into
the first four bytes, which i use to store in my
internal structures( to later reference it through the
index), before zeroing out the buffer. But the index
is always -1.

I dont understand the part where its getting the
physical address to map.
whats the high_memory and whats the PAGE_OFFSET.
Can you help me in understanding what exactly is the
mmap() doing here and
if its doing it right.


himem_buf_allocated = 0;

int xxx_mmap(struct file *filp,
		  struct vm_area_struct *vma)
{
  unsigned long size;
  char * virt_addr;
  int		index;

  size = vma->vm_end - vma->vm_start;
  if ((size % PAGE_SIZE) != 0){
    size = (size / PAGE_SIZE) * PAGE_SIZE + PAGE_SIZE;
  }

  /* himem_buf_size is 0x80000000 */
  if (size + himem_buf_allocated >= himem_buf_size){
    
    return -ENOMEM;
  }
  
  /* himem_buf is calculated as high_memory -
PAGE_OFFSET */
  umem_addr = himem_buf + himem_buf_allocated;
  if (umem_addr == 0){
    return -ENOMEM;
  }
  himem_buf_allocated += size;
  

  virt_addr = ioremap((unsigned long)umem_addr,
PAGE_SIZE);  
  if (virt_addr == 0){
    return -ENOMEM;
  }
  /* write the index into the first 4 bytes */
  writel(index, (uint32_t *)virt_addr);

    /* the values of index and *(virt_addr) do not 
       match.   *(virt_addr) is always -1 .
       Is something wrong here    */
    dbg_printf(0,"index is %d, *(virt_addr) is %d\n",
index,(int)readl(virt_addr));
  iounmap(virt_addr);

   

  remap_page_range(vma->vm_start, (ulong)umem_addr, 
		   vma->vm_end - vma->vm_start, vma->vm_page_prot);

  return 0;
}


__________________________________________________
Do you Yahoo!?
Faith Hill - Exclusive Performances, Videos & More
http://faith.yahoo.com

^ permalink raw reply	[flat|nested] 2+ messages in thread

* mmap() driver entry point
@ 2002-10-08 20:04 swayampakulaa, sudhindra
  0 siblings, 0 replies; 2+ messages in thread
From: swayampakulaa, sudhindra @ 2002-10-08 20:04 UTC (permalink / raw)
  To: 'linux-kernel@vger.kernel.org'


> iam using this driver to fetch me some memory
> in my user space application by calling mmap with
> the file descriptor got by opening the device file 
> for this driver. 
> mmap(0, length, flags, flags, fd, offset) 
> and the mmap entry point in the driver is implemented as below: 
> In the implementation, it tries to write an index into the first 
> four bytes, which i use to store in my internal structures
> ( to later reference it through the index), 
> before zeroing out the buffer. But the index is always -1. 
> I dont understand the part where its getting the 
> physical address to map. 
> whats the high_memory and whats the PAGE_OFFSET. 
> Can someone help me in understanding what exactly 
> is the mmap() entry point doing here and if its doing it right.
> 
> himem_buf_allocated = 0;
> 
> int xxx_mmap(struct file *filp,
> 		  struct vm_area_struct *vma)
> {
>   unsigned long size;
>   char * virt_addr;
>   int		index;
> 
>   size = vma->vm_end - vma->vm_start;
>   if ((size % PAGE_SIZE) != 0){
>     size = (size / PAGE_SIZE) * PAGE_SIZE + PAGE_SIZE;
>   }
> 
>   /* himem_buf_size is 0x80000000 */
>   if (size + himem_buf_allocated >= himem_buf_size){
>     
>     return -ENOMEM;
>   }
>   
>   /* himem_buf is calculated as high_memory - PAGE_OFFSET */
>   umem_addr = himem_buf + himem_buf_allocated;
>   if (umem_addr == 0){
>     return -ENOMEM;
>   }
>   himem_buf_allocated += size;
>   
> 
>   virt_addr = ioremap((unsigned long)umem_addr, PAGE_SIZE);  
>   if (virt_addr == 0){
>     return -ENOMEM;
>   }
>   /* write the index into the first 4 bytes */
>   writel(index, (uint32_t *)virt_addr);
> 
>     /* the values of index and *(virt_addr) do not match */
>     /*    *(virt_addr) is always -1                */
>     /* Is something wrong here   */
>     dbg_printf(0,"index is %d, *(virt_addr) is %d\n", index,
> (int)readl(virt_addr));
>   iounmap(virt_addr);
> 
>    
> 
>   remap_page_range(vma->vm_start, (ulong)umem_addr, 
> 		   vma->vm_end - vma->vm_start, vma->vm_page_prot);
> 
>   return 0;
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2002-10-08 20:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-08 19:59 mmap driver entry point Ankit
2002-10-08 20:04 mmap() " swayampakulaa, sudhindra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).