From: Andi Kleen m32r converted Signed-off-by: Andi Kleen Signed-off-by: Andrew Morton --- 25-akpm/arch/m32r/mm/init.c | 13 +++++++++++++ 25-akpm/arch/m32r/mm/ioremap.c | 2 +- 25-akpm/include/asm-m32r/mmu_context.h | 4 ++-- 25-akpm/include/asm-m32r/page.h | 2 ++ 25-akpm/include/asm-m32r/pgalloc.h | 15 ++------------- 25-akpm/include/asm-m32r/pgtable.h | 9 ++++----- 6 files changed, 24 insertions(+), 21 deletions(-) diff -puN arch/m32r/mm/init.c~4level-architecture-changes-for-m32r arch/m32r/mm/init.c --- 25/arch/m32r/mm/init.c~4level-architecture-changes-for-m32r 2004-11-03 21:53:20.470956016 -0800 +++ 25-akpm/arch/m32r/mm/init.c 2004-11-03 21:53:20.481954344 -0800 @@ -248,3 +248,16 @@ void free_initrd_mem(unsigned long start } #endif + +/* + * Allocate and free page tables. + */ +pgd_t *__pgd_alloc(struct mm_struct *mm, pml4_t *pml4, unsigned long addr) +{ + pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL); + + if (pgd) + clear_page(pgd); + + return pgd; +} diff -puN arch/m32r/mm/ioremap.c~4level-architecture-changes-for-m32r arch/m32r/mm/ioremap.c --- 25/arch/m32r/mm/ioremap.c~4level-architecture-changes-for-m32r 2004-11-03 21:53:20.471955864 -0800 +++ 25-akpm/arch/m32r/mm/ioremap.c 2004-11-03 21:53:20.481954344 -0800 @@ -86,7 +86,7 @@ remap_area_pages(unsigned long address, unsigned long end = address + size; phys_addr -= address; - dir = pgd_offset(&init_mm, address); + dir = pml4_pgd_offset_k(pml4_offset_k(address), address); flush_cache_all(); if (address >= end) BUG(); diff -puN include/asm-m32r/mmu_context.h~4level-architecture-changes-for-m32r include/asm-m32r/mmu_context.h --- 25/include/asm-m32r/mmu_context.h~4level-architecture-changes-for-m32r 2004-11-03 21:53:20.473955560 -0800 +++ 25-akpm/include/asm-m32r/mmu_context.h 2004-11-03 21:53:20.482954192 -0800 @@ -133,8 +133,8 @@ static __inline__ void switch_mm(struct #ifdef CONFIG_SMP cpu_set(cpu, next->cpu_vm_mask); #endif /* CONFIG_SMP */ - /* Set MPTB = next->pgd */ - *(volatile unsigned long *)MPTB = (unsigned long)next->pgd; + /* Set MPTB = next->pml4 */ + *(volatile unsigned long *)MPTB = (unsigned long)next->pml4; activate_context(next); } #ifdef CONFIG_SMP diff -puN include/asm-m32r/page.h~4level-architecture-changes-for-m32r include/asm-m32r/page.h --- 25/include/asm-m32r/page.h~4level-architecture-changes-for-m32r 2004-11-03 21:53:20.475955256 -0800 +++ 25-akpm/include/asm-m32r/page.h 2004-11-03 21:53:20.482954192 -0800 @@ -106,6 +106,8 @@ static __inline__ int get_order(unsigned #define devmem_is_allowed(x) 1 +#include + #endif /* __KERNEL__ */ #endif /* _ASM_M32R_PAGE_H */ diff -puN include/asm-m32r/pgalloc.h~4level-architecture-changes-for-m32r include/asm-m32r/pgalloc.h --- 25/include/asm-m32r/pgalloc.h~4level-architecture-changes-for-m32r 2004-11-03 21:53:20.476955104 -0800 +++ 25-akpm/include/asm-m32r/pgalloc.h 2004-11-03 21:53:20.483954040 -0800 @@ -18,19 +18,6 @@ static __inline__ void pmd_populate(stru set_pmd(pmd, __pmd(_PAGE_TABLE + page_to_phys(pte))); } -/* - * Allocate and free page tables. - */ -static __inline__ pgd_t *pgd_alloc(struct mm_struct *mm) -{ - pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL); - - if (pgd) - clear_page(pgd); - - return pgd; -} - static __inline__ void pgd_free(pgd_t *pgd) { free_page((unsigned long)pgd); @@ -83,5 +70,7 @@ static __inline__ void pte_free(struct p #define check_pgt_cache() do { } while (0) +#include + #endif /* _ASM_M32R_PGALLOC_H */ diff -puN include/asm-m32r/pgtable.h~4level-architecture-changes-for-m32r include/asm-m32r/pgtable.h --- 25/include/asm-m32r/pgtable.h~4level-architecture-changes-for-m32r 2004-11-03 21:53:20.478954800 -0800 +++ 25-akpm/include/asm-m32r/pgtable.h 2004-11-03 21:53:20.483954040 -0800 @@ -54,7 +54,7 @@ extern unsigned long empty_zero_page[102 #define PGDIR_SIZE (1UL << PGDIR_SHIFT) #define PGDIR_MASK (~(PGDIR_SIZE - 1)) -#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) +#define USER_PGDS_IN_LAST_PML4 (TASK_SIZE / PGDIR_SIZE) #define FIRST_USER_PGD_NR 0 #ifndef __ASSEMBLY__ @@ -377,10 +377,7 @@ static __inline__ void pmd_set(pmd_t * p #define pgd_index(address) \ (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) -#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) - -/* to find an entry in a kernel page-table-directory */ -#define pgd_offset_k(address) pgd_offset(&init_mm, address) +#define pgd_index_k(addr) pgd_index(addr) #define pmd_index(address) \ (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) @@ -419,5 +416,7 @@ static __inline__ void pmd_set(pmd_t * p #define __HAVE_ARCH_PTE_SAME #include +#include + #endif /* _ASM_M32R_PGTABLE_H */ _