diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2008-07-24 00:27:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-24 13:47:15 -0400 |
commit | a1f242ff460e4b50a045fa237c3c56cce9eabf83 (patch) | |
tree | 657766b55251042b38967422dc9c3ea893b98747 /arch/powerpc/mm/pgtable_32.c | |
parent | 7ae8ed5053a39082d224a3f48409e016baca9c16 (diff) |
powerpc ioremap_prot
This adds ioremap_prot and pte_pgprot() so that one can extract protection
bits from a PTE and use them to ioremap_prot() (in order to support ptrace
of VM_IO | VM_PFNMAP as per Rik's patch).
This moves a couple of flag checks around in the ioremap implementations
of arch/powerpc. There's a side effect of allowing non-cacheable and
non-guarded mappings on ppc32 which before would always have _PAGE_GUARDED
set whenever _PAGE_NO_CACHE is.
(standard ioremap will still set _PAGE_GUARDED, but ioremap_prot will be
capable of setting such a non guarded mapping).
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Rik van Riel <riel@redhat.com>
Cc: Dave Airlie <airlied@linux.ie>
Cc: Hugh Dickins <hugh@veritas.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/powerpc/mm/pgtable_32.c')
-rw-r--r-- | arch/powerpc/mm/pgtable_32.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index c7584072dfcc..2001abdb1912 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c | |||
@@ -145,13 +145,20 @@ void pte_free(struct mm_struct *mm, pgtable_t ptepage) | |||
145 | void __iomem * | 145 | void __iomem * |
146 | ioremap(phys_addr_t addr, unsigned long size) | 146 | ioremap(phys_addr_t addr, unsigned long size) |
147 | { | 147 | { |
148 | return __ioremap(addr, size, _PAGE_NO_CACHE); | 148 | return __ioremap(addr, size, _PAGE_NO_CACHE | _PAGE_GUARDED); |
149 | } | 149 | } |
150 | EXPORT_SYMBOL(ioremap); | 150 | EXPORT_SYMBOL(ioremap); |
151 | 151 | ||
152 | void __iomem * | 152 | void __iomem * |
153 | ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags) | 153 | ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags) |
154 | { | 154 | { |
155 | /* writeable implies dirty for kernel addresses */ | ||
156 | if (flags & _PAGE_RW) | ||
157 | flags |= _PAGE_DIRTY | _PAGE_HWWRITE; | ||
158 | |||
159 | /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */ | ||
160 | flags &= ~(_PAGE_USER | _PAGE_EXEC | _PAGE_HWEXEC); | ||
161 | |||
155 | return __ioremap(addr, size, flags); | 162 | return __ioremap(addr, size, flags); |
156 | } | 163 | } |
157 | EXPORT_SYMBOL(ioremap_flags); | 164 | EXPORT_SYMBOL(ioremap_flags); |
@@ -163,6 +170,14 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) | |||
163 | phys_addr_t p; | 170 | phys_addr_t p; |
164 | int err; | 171 | int err; |
165 | 172 | ||
173 | /* Make sure we have the base flags */ | ||
174 | if ((flags & _PAGE_PRESENT) == 0) | ||
175 | flags |= _PAGE_KERNEL; | ||
176 | |||
177 | /* Non-cacheable page cannot be coherent */ | ||
178 | if (flags & _PAGE_NO_CACHE) | ||
179 | flags &= ~_PAGE_COHERENT; | ||
180 | |||
166 | /* | 181 | /* |
167 | * Choose an address to map it to. | 182 | * Choose an address to map it to. |
168 | * Once the vmalloc system is running, we use it. | 183 | * Once the vmalloc system is running, we use it. |
@@ -219,11 +234,6 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) | |||
219 | v = (ioremap_bot -= size); | 234 | v = (ioremap_bot -= size); |
220 | } | 235 | } |
221 | 236 | ||
222 | if ((flags & _PAGE_PRESENT) == 0) | ||
223 | flags |= _PAGE_KERNEL; | ||
224 | if (flags & _PAGE_NO_CACHE) | ||
225 | flags |= _PAGE_GUARDED; | ||
226 | |||
227 | /* | 237 | /* |
228 | * Should check if it is a candidate for a BAT mapping | 238 | * Should check if it is a candidate for a BAT mapping |
229 | */ | 239 | */ |