Re: mmap not working?

H. Peter Anvin
2001-11-16T22:10:42Z

Followup to: <200111162134.WAA22927@cave.bitwizard.nl>
By author: R.E.Wolff@BitWizard.nl (Rogier Wolff)
In newsgroup: linux.dev.kernel
>
>
> Hi,
>
> I want to mmap a device in an application, so I do:
>
> base = mmap(NULL , DEV_LENGTH, myprot , flags, kmem, dev_base);
>
> Turns out that some BIOSs put my device at an address like
>
> 0xdffffc00
>
> whereas others put it at 0xfa000000 . In the latter case, mmap works
> as expected. However in the first case I get EINVAL: The base is
> not page-aligned.
>
> However, in the latter case I get my requested 1k of memory, and the
> following 3k for free. In the first case I'd want "3k for free,
> followed by the 1k I requested".
>
> effectively, provided "start" equals NULL, the kernel IMHO should:
>
> offset = dev_base & PAGE_MASK;
> return mmap (NULL, length+offset, prot, flags, base - offset) + offset;
> Comments?
>
> The "failure" was observed on 2.4.14 and/or 2.4.9.
>
> Roger.
>
>
> P.S. I end up not being able to closely follow linux-kernel
> lately. CCs to me appreciated.
>

Sorry, what you're asking for the TLB to do something it simply cannot
do -- there is no way for the TLB to remap the bottom 12 bits since it
doesn't control them.

What you'd have to do is to make your device driver move the device to
a different address.

-hpa

--
<hpa@transmeta.com> at work, <hpa@zytor.com> in private!
"Unix gives you enough rope to shoot yourself in the foot."
http://www.zytor.com/~hpa/puzzle.txt <amsp@zytor.com>