From: David Howells The attached patch makes the following fixes to the frv arch: (1) pte_offset() should no longer be around; the fault handler should use pte_offset_kernel() instead when fixing up vmalloc misses. (2) The PGEs/PMEs do not hold PTEs. They have greater address resolution and fewer control bits. (3) The data access error pattern in ESR15.EC should be 10000 not 10100. Signed-Off-By: David Howells Signed-off-by: Andrew Morton --- 25-akpm/arch/frv/mm/fault.c | 2 +- 25-akpm/arch/frv/mm/pgalloc.c | 2 +- 25-akpm/include/asm-frv/pgtable.h | 3 +-- 25-akpm/include/asm-frv/spr-regs.h | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff -puN arch/frv/mm/fault.c~frv-pagetable-handling-fixes arch/frv/mm/fault.c --- 25/arch/frv/mm/fault.c~frv-pagetable-handling-fixes Fri Dec 17 15:32:57 2004 +++ 25-akpm/arch/frv/mm/fault.c Fri Dec 17 15:32:57 2004 @@ -315,7 +315,7 @@ asmlinkage void do_page_fault(int datamm goto no_context; set_pmd(pmd, *pmd_k); - pte_k = pte_offset(pmd_k, ear0); + pte_k = pte_offset_kernel(pmd_k, ear0); if (!pte_present(*pte_k)) goto no_context; return; diff -puN arch/frv/mm/pgalloc.c~frv-pagetable-handling-fixes arch/frv/mm/pgalloc.c --- 25/arch/frv/mm/pgalloc.c~frv-pagetable-handling-fixes Fri Dec 17 15:32:57 2004 +++ 25-akpm/arch/frv/mm/pgalloc.c Fri Dec 17 15:32:57 2004 @@ -52,7 +52,7 @@ void __set_pmd(pmd_t *pmdptr, unsigned l memset(__ste_p, 0, PME_SIZE); } else { - BUG_ON(pmd & xAMPRx_SS); + BUG_ON(pmd & (0x3f00 | xAMPRx_SS | 0xe)); for (loop = PME_SIZE; loop > 0; loop -= 4) { *__ste_p++ = pmd; diff -puN include/asm-frv/pgtable.h~frv-pagetable-handling-fixes include/asm-frv/pgtable.h --- 25/include/asm-frv/pgtable.h~frv-pagetable-handling-fixes Fri Dec 17 15:32:57 2004 +++ 25-akpm/include/asm-frv/pgtable.h Fri Dec 17 15:32:57 2004 @@ -255,7 +255,7 @@ static inline pmd_t *pmd_offset(pgd_t *d #define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO) #define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE) -#define _PAGE_TABLE (_PAGE_PRESENT | xAMPRx_SS_16Kb | xAMPRx_D | _PAGE_ACCESSED) +#define _PAGE_TABLE (_PAGE_PRESENT | xAMPRx_SS_16Kb) #ifndef __ASSEMBLY__ @@ -385,7 +385,6 @@ static inline pte_t pte_modify(pte_t pte /* Find an entry in the third-level page table.. */ #define __pte_index(address) ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) -#define pte_offset(dir, address) ((pte_t *) pmd_page(*(dir)) + __pte_index(address)) /* * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] diff -puN include/asm-frv/spr-regs.h~frv-pagetable-handling-fixes include/asm-frv/spr-regs.h --- 25/include/asm-frv/spr-regs.h~frv-pagetable-handling-fixes Fri Dec 17 15:32:57 2004 +++ 25-akpm/include/asm-frv/spr-regs.h Fri Dec 17 15:32:57 2004 @@ -204,7 +204,7 @@ #define ESRx_EC_PRIV_INSN 0x00000008 /* - privileged_instruction */ #define ESRx_EC_ILL_INSN 0x0000000a /* - illegal_instruction */ #define ESRx_EC_MP_EXCEP 0x0000001c /* - mp_exception */ -#define ESRx_EC_DATA_ACCESS 0x00000024 /* - data_access_error */ +#define ESRx_EC_DATA_ACCESS 0x00000020 /* - data_access_error */ #define ESRx_EC_DIVISION 0x00000026 /* - division_exception */ #define ESRx_EC_ITLB_MISS 0x00000034 /* - instruction_access_TLB_miss */ #define ESRx_EC_DTLB_MISS 0x00000036 /* - data_access_TLB_miss */ _