Re: /dev/mem and PCI memory = EFAULT (regression?)

From: Linus Torvalds
Date: Fri Oct 28 2016 - 19:26:57 EST


On Fri, Oct 28, 2016 at 2:36 PM, Stas Sergeev <stsp@xxxxxxx> wrote:
>>>> On Fri, Oct 28, 2016 at 2:03 PM, Stas Sergeev <stsp@xxxxxxx> wrote:
>
> Hello.
>
> For the long time dosemu used /dev/mem for vga pass-through.
> Now it appears /dev/mem has this check:
> http://lxr.free-electrons.com/source/drivers/char/mem.c#L51
> which prevents an accesses to PCI memory regions if the
> "high_memory" points low enough. It seems "high_memory"
> just points to the end of the physical ram, so depending on
> the ram size you either can access PCI devices or you get
> EFAULT.
> Was it wrong to use /dev/mem for accessing the PCI devices?
> How should I do that now?

Has it ever worked for you? That code is ancient, going back in some
form or another at least ten years.

So /dev/mem does not allow "read()/write()" on IO memory, and really
hasn't in a long long time (maybe ever, quite frankly). It does allow
it on regular RAM, but STRICT_DEV_MEM then disallows that too for
security reasons (and realistically, everybody uses STRICT_DEV_MEM
these days).

What people do use /dev/mem for is to mmap() PCI memory, and then you
can access it from user space. That's the traditional model that X.org
used to do etc.

I'm surprised if there is a regression here, because I think
read/write really hasn't been supported in like forever. It's
fundamentally impossible to do on some architectures: the physical
access depends on the _size_ of the access on at least some alpha
CPU's, so you can't just do a random access to PCI address X, you need
to have a real size etc.

But if you can point to a particular commit that broke something (eg
with bisection), I'll certainly take a second look. I might have
missed something.

Linus