#ifndef _ASM_E2K_HUGETLB_H_ #define _ASM_E2K_HUGETLB_H_ #include #include #include #include extern void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); extern pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); static inline void arch_clear_hugepage_flags(struct page *page) { } static inline int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr, unsigned long len) { return 0; } #define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) { } #define __HAVE_ARCH_HUGE_PTE_NONE static inline int huge_pte_none(pte_t pte) { #ifndef CONFIG_MAKE_ALL_PAGES_VALID return _PAGE_CLEAR(pte_val(pte), UNI_PAGE_HUGE) == 0; #else /* CONFIG_MAKE_ALL_PAGES_VALID */ return _PAGE_CLEAR(pte_val(pte), UNI_PAGE_VALID | UNI_PAGE_HUGE) == 0; #endif /* !CONFIG_MAKE_ALL_PAGES_VALID */ } #define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) { ptep_set_wrprotect(mm, addr, ptep); } #define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pte_t pte, int dirty) { int changed = !pte_same(*ptep, pte); if (changed) { set_pte_at(vma->vm_mm, addr, ptep, pte); flush_tlb_range(vma, addr, addr + PMD_SIZE); } return changed; } #define __HAVE_ARCH_HUGE_PTE_CLEAR static inline void huge_pte_clear(struct mm_struct *mm, unsigned long address, pte_t *page_table, unsigned long sz) { /* * In this case virtual page occupied two sequential entries in * page table on 2-th level (PMD). * All two pte's (pmd's) should be cleared. */ pte_clear(mm, address, page_table); } #define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT #define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT #include #endif /* _ASM_E2K_HUGETLB_H_ */