|
@@ -4,10 +4,10 @@
|
|
|
#include <asm/pgalloc.h>
|
|
|
#include <asm/pgtable.h>
|
|
|
|
|
|
-static void idmap_add_pmd(pgd_t *pgd, unsigned long addr, unsigned long end,
|
|
|
+static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end,
|
|
|
unsigned long prot)
|
|
|
{
|
|
|
- pmd_t *pmd = pmd_offset(pgd, addr);
|
|
|
+ pmd_t *pmd = pmd_offset(pud, addr);
|
|
|
|
|
|
addr = (addr & PMD_MASK) | prot;
|
|
|
pmd[0] = __pmd(addr);
|
|
@@ -16,6 +16,18 @@ static void idmap_add_pmd(pgd_t *pgd, unsigned long addr, unsigned long end,
|
|
|
flush_pmd_entry(pmd);
|
|
|
}
|
|
|
|
|
|
+static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end,
|
|
|
+ unsigned long prot)
|
|
|
+{
|
|
|
+ pud_t *pud = pud_offset(pgd, addr);
|
|
|
+ unsigned long next;
|
|
|
+
|
|
|
+ do {
|
|
|
+ next = pud_addr_end(addr, end);
|
|
|
+ idmap_add_pmd(pud, addr, next, prot);
|
|
|
+ } while (pud++, addr = next, addr != end);
|
|
|
+}
|
|
|
+
|
|
|
void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end)
|
|
|
{
|
|
|
unsigned long prot, next;
|
|
@@ -27,17 +39,28 @@ void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end)
|
|
|
pgd += pgd_index(addr);
|
|
|
do {
|
|
|
next = pgd_addr_end(addr, end);
|
|
|
- idmap_add_pmd(pgd, addr, next, prot);
|
|
|
+ idmap_add_pud(pgd, addr, next, prot);
|
|
|
} while (pgd++, addr = next, addr != end);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
-static void idmap_del_pmd(pgd_t *pgd, unsigned long addr, unsigned long end)
|
|
|
+static void idmap_del_pmd(pud_t *pud, unsigned long addr, unsigned long end)
|
|
|
{
|
|
|
- pmd_t *pmd = pmd_offset(pgd, addr);
|
|
|
+ pmd_t *pmd = pmd_offset(pud, addr);
|
|
|
pmd_clear(pmd);
|
|
|
}
|
|
|
|
|
|
+static void idmap_del_pud(pgd_t *pgd, unsigned long addr, unsigned long end)
|
|
|
+{
|
|
|
+ pud_t *pud = pud_offset(pgd, addr);
|
|
|
+ unsigned long next;
|
|
|
+
|
|
|
+ do {
|
|
|
+ next = pud_addr_end(addr, end);
|
|
|
+ idmap_del_pmd(pud, addr, next);
|
|
|
+ } while (pud++, addr = next, addr != end);
|
|
|
+}
|
|
|
+
|
|
|
void identity_mapping_del(pgd_t *pgd, unsigned long addr, unsigned long end)
|
|
|
{
|
|
|
unsigned long next;
|
|
@@ -45,7 +68,7 @@ void identity_mapping_del(pgd_t *pgd, unsigned long addr, unsigned long end)
|
|
|
pgd += pgd_index(addr);
|
|
|
do {
|
|
|
next = pgd_addr_end(addr, end);
|
|
|
- idmap_del_pmd(pgd, addr, next);
|
|
|
+ idmap_del_pud(pgd, addr, next);
|
|
|
} while (pgd++, addr = next, addr != end);
|
|
|
}
|
|
|
#endif
|