From: Linus Torvalds > Sent: 07 January 2019 17:44 > On Mon, Jan 7, 2019 at 1:55 AM David Laight <david.lai...@aculab.com> wrote: > > > > I needed to open-code one part because it wants to do copy_to_user() > > from a PCIe address buffer (which has to work). > > It will never work for memcpy_fromio(). Any driver that thinks it will > copy from io space to user space absolutely *has* to do it by hand. No > questions, and no exceptions. Some loop like > > for (..) > put_user(readl(iomem++), uaddr++); > > because neither copy_to_user() nor memcpy_fromio() will *ever* handle > that correctly. > > They might randomly happen to work on x86, but absolutely nowhere else.
Actually they tend to handle it on a lot of systems. (But I don't do it.) Probably most of those where vm_iomap_memory() (to map IO memory space directly into user pages) works. It might be 'interesting' to build an amd64 kernel where all the IO memory addresses (eg returned by pci_iomap()) are offset by a large constant so direct accesses all fault and all the readl() macros (etc) add it back in. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)