diff options
Diffstat (limited to 'arch/arm/mm/mm-armv.c')
-rw-r--r-- | arch/arm/mm/mm-armv.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/arch/arm/mm/mm-armv.c b/arch/arm/mm/mm-armv.c index 4dae00bf7a56..d125a3dc061c 100644 --- a/arch/arm/mm/mm-armv.c +++ b/arch/arm/mm/mm-armv.c | |||
@@ -295,14 +295,10 @@ alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pg | |||
295 | pte_t *ptep; | 295 | pte_t *ptep; |
296 | 296 | ||
297 | if (pmd_none(*pmdp)) { | 297 | if (pmd_none(*pmdp)) { |
298 | unsigned long pmdval; | ||
299 | ptep = alloc_bootmem_low_pages(2 * PTRS_PER_PTE * | 298 | ptep = alloc_bootmem_low_pages(2 * PTRS_PER_PTE * |
300 | sizeof(pte_t)); | 299 | sizeof(pte_t)); |
301 | 300 | ||
302 | pmdval = __pa(ptep) | prot_l1; | 301 | __pmd_populate(pmdp, __pa(ptep) | prot_l1); |
303 | pmdp[0] = __pmd(pmdval); | ||
304 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); | ||
305 | flush_pmd_entry(pmdp); | ||
306 | } | 302 | } |
307 | ptep = pte_offset_kernel(pmdp, virt); | 303 | ptep = pte_offset_kernel(pmdp, virt); |
308 | 304 | ||
@@ -457,7 +453,7 @@ static void __init build_mem_type_table(void) | |||
457 | 453 | ||
458 | for (i = 0; i < 16; i++) { | 454 | for (i = 0; i < 16; i++) { |
459 | unsigned long v = pgprot_val(protection_map[i]); | 455 | unsigned long v = pgprot_val(protection_map[i]); |
460 | v &= (~(PTE_BUFFERABLE|PTE_CACHEABLE)) | user_pgprot; | 456 | v = (v & ~(PTE_BUFFERABLE|PTE_CACHEABLE)) | user_pgprot; |
461 | protection_map[i] = __pgprot(v); | 457 | protection_map[i] = __pgprot(v); |
462 | } | 458 | } |
463 | 459 | ||
@@ -581,23 +577,23 @@ static void __init create_mapping(struct map_desc *md) | |||
581 | */ | 577 | */ |
582 | void setup_mm_for_reboot(char mode) | 578 | void setup_mm_for_reboot(char mode) |
583 | { | 579 | { |
584 | unsigned long pmdval; | 580 | unsigned long base_pmdval; |
585 | pgd_t *pgd; | 581 | pgd_t *pgd; |
586 | pmd_t *pmd; | ||
587 | int i; | 582 | int i; |
588 | int cpu_arch = cpu_architecture(); | ||
589 | 583 | ||
590 | if (current->mm && current->mm->pgd) | 584 | if (current->mm && current->mm->pgd) |
591 | pgd = current->mm->pgd; | 585 | pgd = current->mm->pgd; |
592 | else | 586 | else |
593 | pgd = init_mm.pgd; | 587 | pgd = init_mm.pgd; |
594 | 588 | ||
595 | for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++) { | 589 | base_pmdval = PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT; |
596 | pmdval = (i << PGDIR_SHIFT) | | 590 | if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ) |
597 | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | | 591 | base_pmdval |= PMD_BIT4; |
598 | PMD_TYPE_SECT; | 592 | |
599 | if (cpu_arch <= CPU_ARCH_ARMv5TEJ) | 593 | for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++, pgd++) { |
600 | pmdval |= PMD_BIT4; | 594 | unsigned long pmdval = (i << PGDIR_SHIFT) | base_pmdval; |
595 | pmd_t *pmd; | ||
596 | |||
601 | pmd = pmd_off(pgd, i << PGDIR_SHIFT); | 597 | pmd = pmd_off(pgd, i << PGDIR_SHIFT); |
602 | pmd[0] = __pmd(pmdval); | 598 | pmd[0] = __pmd(pmdval); |
603 | pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1))); | 599 | pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1))); |