|
@@ -145,13 +145,20 @@ void pte_free(struct mm_struct *mm, pgtable_t ptepage)
|
|
void __iomem *
|
|
void __iomem *
|
|
ioremap(phys_addr_t addr, unsigned long size)
|
|
ioremap(phys_addr_t addr, unsigned long size)
|
|
{
|
|
{
|
|
- return __ioremap(addr, size, _PAGE_NO_CACHE);
|
|
|
|
|
|
+ return __ioremap(addr, size, _PAGE_NO_CACHE | _PAGE_GUARDED);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(ioremap);
|
|
EXPORT_SYMBOL(ioremap);
|
|
|
|
|
|
void __iomem *
|
|
void __iomem *
|
|
ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags)
|
|
ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags)
|
|
{
|
|
{
|
|
|
|
+ /* writeable implies dirty for kernel addresses */
|
|
|
|
+ if (flags & _PAGE_RW)
|
|
|
|
+ flags |= _PAGE_DIRTY | _PAGE_HWWRITE;
|
|
|
|
+
|
|
|
|
+ /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
|
|
|
|
+ flags &= ~(_PAGE_USER | _PAGE_EXEC | _PAGE_HWEXEC);
|
|
|
|
+
|
|
return __ioremap(addr, size, flags);
|
|
return __ioremap(addr, size, flags);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(ioremap_flags);
|
|
EXPORT_SYMBOL(ioremap_flags);
|
|
@@ -163,6 +170,14 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
|
|
phys_addr_t p;
|
|
phys_addr_t p;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
|
|
+ /* Make sure we have the base flags */
|
|
|
|
+ if ((flags & _PAGE_PRESENT) == 0)
|
|
|
|
+ flags |= _PAGE_KERNEL;
|
|
|
|
+
|
|
|
|
+ /* Non-cacheable page cannot be coherent */
|
|
|
|
+ if (flags & _PAGE_NO_CACHE)
|
|
|
|
+ flags &= ~_PAGE_COHERENT;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Choose an address to map it to.
|
|
* Choose an address to map it to.
|
|
* Once the vmalloc system is running, we use it.
|
|
* Once the vmalloc system is running, we use it.
|
|
@@ -219,11 +234,6 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
|
|
v = (ioremap_bot -= size);
|
|
v = (ioremap_bot -= size);
|
|
}
|
|
}
|
|
|
|
|
|
- if ((flags & _PAGE_PRESENT) == 0)
|
|
|
|
- flags |= _PAGE_KERNEL;
|
|
|
|
- if (flags & _PAGE_NO_CACHE)
|
|
|
|
- flags |= _PAGE_GUARDED;
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Should check if it is a candidate for a BAT mapping
|
|
* Should check if it is a candidate for a BAT mapping
|
|
*/
|
|
*/
|