162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 362306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 462306a36Sopenharmony_ci * for more details. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2008, 2009 Cavium Networks, Inc. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __ASM_HUGETLB_H 1062306a36Sopenharmony_ci#define __ASM_HUGETLB_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <asm/page.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define __HAVE_ARCH_PREPARE_HUGEPAGE_RANGE 1562306a36Sopenharmony_cistatic inline int prepare_hugepage_range(struct file *file, 1662306a36Sopenharmony_ci unsigned long addr, 1762306a36Sopenharmony_ci unsigned long len) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci unsigned long task_size = STACK_TOP; 2062306a36Sopenharmony_ci struct hstate *h = hstate_file(file); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci if (len & ~huge_page_mask(h)) 2362306a36Sopenharmony_ci return -EINVAL; 2462306a36Sopenharmony_ci if (addr & ~huge_page_mask(h)) 2562306a36Sopenharmony_ci return -EINVAL; 2662306a36Sopenharmony_ci if (len > task_size) 2762306a36Sopenharmony_ci return -ENOMEM; 2862306a36Sopenharmony_ci if (task_size - len < addr) 2962306a36Sopenharmony_ci return -EINVAL; 3062306a36Sopenharmony_ci return 0; 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR 3462306a36Sopenharmony_cistatic inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, 3562306a36Sopenharmony_ci unsigned long addr, pte_t *ptep) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci pte_t clear; 3862306a36Sopenharmony_ci pte_t pte = *ptep; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci pte_val(clear) = (unsigned long)invalid_pte_table; 4162306a36Sopenharmony_ci set_pte_at(mm, addr, ptep, clear); 4262306a36Sopenharmony_ci return pte; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH 4662306a36Sopenharmony_cistatic inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma, 4762306a36Sopenharmony_ci unsigned long addr, pte_t *ptep) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci pte_t pte; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /* 5262306a36Sopenharmony_ci * clear the huge pte entry firstly, so that the other smp threads will 5362306a36Sopenharmony_ci * not get old pte entry after finishing flush_tlb_page and before 5462306a36Sopenharmony_ci * setting new huge pte entry 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci pte = huge_ptep_get_and_clear(vma->vm_mm, addr, ptep); 5762306a36Sopenharmony_ci flush_tlb_page(vma, addr); 5862306a36Sopenharmony_ci return pte; 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTE_NONE 6262306a36Sopenharmony_cistatic inline int huge_pte_none(pte_t pte) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci unsigned long val = pte_val(pte) & ~_PAGE_GLOBAL; 6562306a36Sopenharmony_ci return !val || (val == (unsigned long)invalid_pte_table); 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS 6962306a36Sopenharmony_cistatic inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, 7062306a36Sopenharmony_ci unsigned long addr, 7162306a36Sopenharmony_ci pte_t *ptep, pte_t pte, 7262306a36Sopenharmony_ci int dirty) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci int changed = !pte_same(*ptep, pte); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci if (changed) { 7762306a36Sopenharmony_ci set_pte_at(vma->vm_mm, addr, ptep, pte); 7862306a36Sopenharmony_ci /* 7962306a36Sopenharmony_ci * There could be some standard sized pages in there, 8062306a36Sopenharmony_ci * get them all. 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_ci flush_tlb_range(vma, addr, addr + HPAGE_SIZE); 8362306a36Sopenharmony_ci } 8462306a36Sopenharmony_ci return changed; 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#include <asm-generic/hugetlb.h> 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#endif /* __ASM_HUGETLB_H */ 90