Re: Linux-2.6.12 memory mapping broken

From: Richard B. Johnson
Date: Tue Jun 21 2005 - 02:01:53 EST

On Mon, 20 Jun 2005, David S. Miller wrote:

From: "Richard B. Johnson" <linux-os@xxxxxxxxxxxx>
Date: Mon, 20 Jun 2005 15:53:34 -0400 (EDT)

I can test any patches.

You have to let remap_pfn_range() fill in the PTEs for you,
you can't fill them in yourself. Just supply the correct
"pfn" argument and you should be all set.

So I just supply the pointer now?

Right now my code does:

This is version-dependent, therefore a MACRO:
#define REMAP(a,b,c,d,e) remap_pfn_range((a), (b), (c) >> PAGE_SHIFT, (d), (e))

SHOW is a MACRO to write debugging info if enabled.

static int mmap(struct file *fp, struct vm_area_struct *vma)
int minor, ret = 0;
size_t len;
minor = MINOR(fp->f_dentry->d_inode->i_rdev); // Extended open
DEB(printk("UNIQUE.dma.len = %08x\n", UNIQUE.dma.len));
len = MIN(UNIQUE.dma.len, (vma->vm_end - vma->vm_start));
down(&UNIQUE.pci_sem); // Acquire resource
vma->vm_flags |= (VM_IO | VM_SHM | VM_LOCKED); // Set required flags
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
DEB(printk("About to execute remap_pfn_range\n"));
DEB(printk(" vma->vm_start = %08lx\n", vma->vm_start));
DEB(printk(" base address = %08x\n", UNIQUE.dma.base));
DEB(printk(" length = %08x\n", len));
DEB(printk("vma->vm_page_prot = %08x\n", *((size_t *)&vma->vm_page_prot)));
ret = REMAP(vma, vma->vm_start, UNIQUE.dma.base, len, vma->vm_page_prot);
DEB(printk(" returned value = %d\n", ret));
up(&UNIQUE.pci_sem); // Release resource
return ret;

If I just give it the pointer, what do I put in the other
passed parameters?

Dick Johnson
Penguin : Linux version on an i686 machine (5537.79 BogoMips).
Notice : All mail here is now cached for review by Dictator Bush.
98.36% of all statistics are fiction.
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at