diff options
Diffstat (limited to 'arch/arm/mm/idmap.c')
| -rw-r--r-- | arch/arm/mm/idmap.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c index 8e0e52eb76b5..c447ec70e868 100644 --- a/arch/arm/mm/idmap.c +++ b/arch/arm/mm/idmap.c | |||
| @@ -9,6 +9,11 @@ | |||
| 9 | #include <asm/sections.h> | 9 | #include <asm/sections.h> |
| 10 | #include <asm/system_info.h> | 10 | #include <asm/system_info.h> |
| 11 | 11 | ||
| 12 | /* | ||
| 13 | * Note: accesses outside of the kernel image and the identity map area | ||
| 14 | * are not supported on any CPU using the idmap tables as its current | ||
| 15 | * page tables. | ||
| 16 | */ | ||
| 12 | pgd_t *idmap_pgd; | 17 | pgd_t *idmap_pgd; |
| 13 | phys_addr_t (*arch_virt_to_idmap) (unsigned long x); | 18 | phys_addr_t (*arch_virt_to_idmap) (unsigned long x); |
| 14 | 19 | ||
| @@ -25,6 +30,13 @@ static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | |||
| 25 | pr_warning("Failed to allocate identity pmd.\n"); | 30 | pr_warning("Failed to allocate identity pmd.\n"); |
| 26 | return; | 31 | return; |
| 27 | } | 32 | } |
| 33 | /* | ||
| 34 | * Copy the original PMD to ensure that the PMD entries for | ||
| 35 | * the kernel image are preserved. | ||
| 36 | */ | ||
| 37 | if (!pud_none(*pud)) | ||
| 38 | memcpy(pmd, pmd_offset(pud, 0), | ||
| 39 | PTRS_PER_PMD * sizeof(pmd_t)); | ||
| 28 | pud_populate(&init_mm, pud, pmd); | 40 | pud_populate(&init_mm, pud, pmd); |
| 29 | pmd += pmd_index(addr); | 41 | pmd += pmd_index(addr); |
| 30 | } else | 42 | } else |
