diff -urN 2.4.19pre8aa3/arch/sparc64/mm/init.c sparc64/arch/sparc64/mm/init.c --- 2.4.19pre8aa3/arch/sparc64/mm/init.c Wed May 15 18:32:50 2002 +++ sparc64/arch/sparc64/mm/init.c Wed May 15 17:22:10 2002 @@ -1055,7 +1055,7 @@ #else #define DC_ALIAS_SHIFT 0 #endif -pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address) +struct page * pte_alloc_one(struct mm_struct *mm, unsigned long address) { struct page *page = alloc_pages(GFP_KERNEL, DC_ALIAS_SHIFT); unsigned long color = VPTE_COLOR(address); @@ -1063,7 +1063,6 @@ if (page) { unsigned long *to_free; unsigned long paddr; - pte_t *pte; #if (L1DCACHE_SIZE > PAGE_SIZE) /* is there D$ aliasing problem */ set_page_count((page + 1), 1); @@ -1072,10 +1071,9 @@ memset((char *)paddr, 0, (PAGE_SIZE << DC_ALIAS_SHIFT)); if (!color) { - pte = (pte_t *) paddr; to_free = (unsigned long *) (paddr + PAGE_SIZE); } else { - pte = (pte_t *) (paddr + PAGE_SIZE); + page++; to_free = (unsigned long *) paddr; } @@ -1086,7 +1084,7 @@ pgtable_cache_size++; #endif - return pte; + return page; } return NULL; } diff -urN 2.4.19pre8aa3/include/asm-sparc64/pgalloc.h sparc64/include/asm-sparc64/pgalloc.h --- 2.4.19pre8aa3/include/asm-sparc64/pgalloc.h Wed May 15 18:42:29 2002 +++ sparc64/include/asm-sparc64/pgalloc.h Wed May 15 17:18:40 2002 @@ -172,7 +172,7 @@ (unsigned long)ret->pprev_hash = mask; if (!mask) pgd_quicklist = (unsigned long *)ret->next_hash; - ret = (struct page *)(__page_address(ret) + off); + ret = (struct page *)(page_address(ret) + off); pgd_cache_size--; } else { struct page *page = alloc_page(GFP_KERNEL); @@ -267,11 +267,12 @@ free_page((unsigned long)pmd); } -#define pmd_populate(MM, PMD, PTE) pmd_set(PMD, PTE) +#define pmd_populate(mm, pmd, page) pmd_set(pmd, page_address(page)) -extern pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address); +#define ARCH_HAS_PTE_ALLOC_ONE +extern struct page * pte_alloc_one(struct mm_struct *mm, unsigned long address); -extern __inline__ pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address) +extern __inline__ struct page * pte_alloc_one_fast(struct mm_struct *mm, unsigned long address) { unsigned long color = VPTE_COLOR(address); unsigned long *ret; @@ -281,20 +282,26 @@ ret[0] = 0; pgtable_cache_size--; } - return (pte_t *)ret; + return ret ? virt_to_page(ret) : NULL; } -extern __inline__ void free_pte_fast(pte_t *pte) +extern __inline__ void free_pte_fast(struct page * page) { + pte_t *pte = page_address(page); unsigned long color = DCACHE_COLOR((unsigned long)pte); *(unsigned long *)pte = (unsigned long) pte_quicklist[color]; pte_quicklist[color] = (unsigned long *) pte; pgtable_cache_size++; } -extern __inline__ void free_pte_slow(pte_t *pte) +extern __inline__ void free_pte_slow(struct page * page) { - free_page((unsigned long)pte); + __free_page(page); +} + +static inline void pte_free_via_pmd(pmd_t pmd) +{ + free_pte_fast(virt_to_page(pte_offset(&pmd, 0))); } #define pte_free(pte) free_pte_fast(pte) diff -urN 2.4.19pre8aa3/include/asm-sparc64/pgtable.h sparc64/include/asm-sparc64/pgtable.h --- 2.4.19pre8aa3/include/asm-sparc64/pgtable.h Wed May 15 18:42:29 2002 +++ sparc64/include/asm-sparc64/pgtable.h Wed May 15 18:42:39 2002 @@ -242,9 +242,6 @@ #define pte_mkclean(pte) (__pte(pte_val(pte) & ~(_PAGE_MODIFIED|_PAGE_W))) #define pte_mkold(pte) (__pte(((pte_val(pte)<<1UL)>>1UL) & ~_PAGE_ACCESSED)) -/* Permanent address of a page. */ -#define __page_address(page) page_address(page) - #define pte_page(x) (mem_map+(((pte_val(x)&_PAGE_PADDR)-phys_base)>>PAGE_SHIFT)) /* Be very careful when you change these three, they are delicate. */ @@ -266,6 +263,15 @@ /* Find an entry in the third-level page table.. */ #define pte_offset(dir, address) ((pte_t *) pmd_page(*(dir)) + \ ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))) +#define pte_offset2(dir, address) pte_offset(dir, address) +#define pte_offset_atomic(dir, address) pte_offset(dir, address) +#define pte_offset_atomic2(dir, address) pte_offset(dir, address) +#define pte_offset_under_lock(dir, address, mm) pte_offset(dir, address) +#define pte_offset2_under_lock(dir, address, mm) pte_offset(dir, address) +#define pte_kunmap(ptep) do { } while(0) +#define pte_kunmap2(ptep) do { } while(0) +#define pte_kunmap_atomic2(ptep) do { } while(0) +#define pte_alloc_atomic(mm, pmd, address) pte_alloc(mm, pmd, address) extern pgd_t swapper_pg_dir[1]; diff -urN 2.4.19pre8aa3/include/asm-sparc64/prefetch.h sparc64/include/asm-sparc64/prefetch.h --- 2.4.19pre8aa3/include/asm-sparc64/prefetch.h Thu Jan 1 01:00:00 1970 +++ sparc64/include/asm-sparc64/prefetch.h Wed May 15 18:42:39 2002 @@ -0,0 +1,4 @@ +#ifndef __SPARC64_PREFETCH_H +#define __SPARC64_PREFETCH_H + +#endif diff -urN 2.4.19pre8aa3/mm/memory.c sparc64/mm/memory.c --- 2.4.19pre8aa3/mm/memory.c Wed May 15 18:32:50 2002 +++ sparc64/mm/memory.c Wed May 15 17:17:53 2002 @@ -1489,6 +1489,7 @@ return pmd_offset(pgd, address); } +#ifndef ARCH_HAS_PTE_ALLOC_ONE static inline struct page * pte_alloc_one(struct mm_struct *mm, unsigned long address) { struct page * page; @@ -1498,6 +1499,7 @@ clear_pagetable(page); return page; } +#endif /* * Allocate the page table directory.