From: tglx@linutronix.de This patch fixes the Level4 changes for ARM. Tested on CLPS711x (ARM720T) Signed-off-by: Thomas Gleixner Signed-off-by: Andrew Morton --- 25-akpm/arch/arm/mm/fault.c | 4 ++-- 25-akpm/arch/arm/mm/mm-armv.c | 10 +++++----- 25-akpm/include/asm-arm/tlb.h | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff -puN arch/arm/mm/fault.c~4level-fixes-arm arch/arm/mm/fault.c --- 25/arch/arm/mm/fault.c~4level-fixes-arm 2004-11-15 20:00:47.304606952 -0800 +++ 25-akpm/arch/arm/mm/fault.c 2004-11-15 20:00:47.311605888 -0800 @@ -33,7 +33,7 @@ void show_pte(struct mm_struct *mm, unsi if (!mm) mm = &init_mm; - printk(KERN_ALERT "pgd = %p\n", mm->pgd); + printk(KERN_ALERT "pgd = %p\n", mm->pml4); pgd = pml4_pgd_offset(pml4_offset(mm, addr), addr); printk(KERN_ALERT "[%08lx] *pgd=%08lx", addr, pgd_val(*pgd)); @@ -332,7 +332,7 @@ do_translation_fault(unsigned long addr, * FIXME: CP15 C1 is write only on ARMv3 architectures. */ pgd = cpu_get_pgd() + index; - pgd_k = init_mm.pgd + index; + pgd_k = (pgd_t *) init_mm.pml4 + index; if (pgd_none(*pgd_k)) goto bad_area; diff -puN arch/arm/mm/mm-armv.c~4level-fixes-arm arch/arm/mm/mm-armv.c --- 25/arch/arm/mm/mm-armv.c~4level-fixes-arm 2004-11-15 20:00:47.306606648 -0800 +++ 25-akpm/arch/arm/mm/mm-armv.c 2004-11-15 20:00:47.312605736 -0800 @@ -139,7 +139,7 @@ static int __init noalign_setup(char *__ __setup("noalign", noalign_setup); -#define FIRST_KERNEL_PGD_NR (FIRST_USER_PGD_NR + USER_PTRS_PER_PGD) +#define FIRST_KERNEL_PGD_NR (FIRST_USER_PGD_NR + USER_PGDS_IN_LAST_PML4) /* * need to get a 16k page for level 1 @@ -500,12 +500,12 @@ void setup_mm_for_reboot(char mode) int i; int cpu_arch = cpu_architecture(); - if (current->mm && current->mm->pgd) - pgd = current->mm->pgd; + if (current->mm && current->mm->pml4) + pgd = (pgd_t *) current->mm->pml4; else - pgd = init_mm.pgd; + pgd = (pgd_t *) init_mm.pml4; - for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++) { + for (i = 0; i < FIRST_USER_PGD_NR + USER_PGDS_IN_LAST_PML4; i++) { pmdval = (i << PGDIR_SHIFT) | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT; diff -puN include/asm-arm/tlb.h~4level-fixes-arm include/asm-arm/tlb.h --- 25/include/asm-arm/tlb.h~4level-fixes-arm 2004-11-15 20:00:47.307606496 -0800 +++ 25-akpm/include/asm-arm/tlb.h 2004-11-15 20:00:47.312605736 -0800 @@ -91,4 +91,9 @@ tlb_is_full_mm(struct mmu_gather *tlb) #define pte_free_tlb(tlb,ptep) pte_free(ptep) #define pmd_free_tlb(tlb,pmdp) pmd_free(pmdp) +#define pgd_free_tlb(tlb, pgdp) \ + do { \ + __pgd_free_tlb(tlb, pgdp); \ + } while (0) + #endif _