__arm_ioremap creates page table with domain set to kernel
Nicolas Pitre
nico at fluxnic.net
Fri Jan 21 22:37:02 EST 2011
On Fri, 21 Jan 2011, Colin Cross wrote:
> If CONFIG_SMP is set, __arm_ioremap always creates a page table
> mapping by calling ioremap_page_range in lib/ioremap.c, and passes it
> the memory prot value but not the domain. iormap_page_range
> eventually calls pte_alloc_kernel, which sets the domain to
> DOMAIN_KERNEL, instead of DOMAIN_IO.
>
> The kernel domain is normally set to client, the same as the IO
> domain, but it can get temporarily switched to manager mode. When it
> is in manager mode, it ignores the memory protection bits, and the
> instruction prefetcher is allowed by the ARMv7 spec to ignore the XN
> (eXecute Never) bit and fetch from IO memory. I don't know that this
> would ever actually occur, but the ARM spec says in B3.6.2:
>
> The XN attribute is not checked for domains marked as Manager.
> Read-sensitive memory must not be
> included in domains marked as Manager, because the XN bit does not
> prevent prefetches in these cases.
>
> If this is a real problem, I don't see any quick fix. The domain bits
> are set in the pmd, so ioremapped memory can not share a pmd with
> regular vmalloc memory, and ioremap_page_range has no way to carry a
> domain to pte_alloc_kernel.
This has been fixed already. Have a look at:
|commit 247055aa21ffef1c49dd64710d5e94c2aee19b58
|Author: Catalin Marinas <catalin.marinas at arm.com>
|Date: Mon Sep 13 16:03:21 2010 +0100
|
| ARM: 6384/1: Remove the domain switching on ARMv6k/v7 CPUs
|
|[...]
Nicolas
More information about the linux-arm-kernel
mailing list