11355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas/*
21355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * arch/arm/include/asm/hugetlb-3level.h
31355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas *
41355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * Copyright (C) 2012 ARM Ltd.
51355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas *
61355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * Based on arch/x86/include/asm/hugetlb.h.
71355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas *
81355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * This program is free software; you can redistribute it and/or modify
91355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * it under the terms of the GNU General Public License version 2 as
101355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * published by the Free Software Foundation.
111355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas *
121355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * This program is distributed in the hope that it will be useful,
131355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * but WITHOUT ANY WARRANTY; without even the implied warranty of
141355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * GNU General Public License for more details.
161355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas *
171355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * You should have received a copy of the GNU General Public License
181355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * along with this program; if not, write to the Free Software
191355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
201355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas */
211355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
221355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas#ifndef _ASM_ARM_HUGETLB_3LEVEL_H
231355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas#define _ASM_ARM_HUGETLB_3LEVEL_H
241355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
251355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
261355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas/*
271355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * If our huge pte is non-zero then mark the valid bit.
281355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * This allows pte_present(huge_ptep_get(ptep)) to return true for non-zero
291355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * ptes.
301355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas * (The valid bit is automatically cleared by set_pte_at for PROT_NONE ptes).
311355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas */
321355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinasstatic inline pte_t huge_ptep_get(pte_t *ptep)
331355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas{
341355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	pte_t retval = *ptep;
351355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	if (pte_val(retval))
361355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas		pte_val(retval) |= L_PTE_VALID;
371355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	return retval;
381355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas}
391355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
401355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinasstatic inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
411355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas				   pte_t *ptep, pte_t pte)
421355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas{
431355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	set_pte_at(mm, addr, ptep, pte);
441355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas}
451355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
461355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinasstatic inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
471355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas					 unsigned long addr, pte_t *ptep)
481355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas{
491355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	ptep_clear_flush(vma, addr, ptep);
501355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas}
511355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
521355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinasstatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
531355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas					   unsigned long addr, pte_t *ptep)
541355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas{
551355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	ptep_set_wrprotect(mm, addr, ptep);
561355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas}
571355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
581355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinasstatic inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
591355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas					    unsigned long addr, pte_t *ptep)
601355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas{
611355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	return ptep_get_and_clear(mm, addr, ptep);
621355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas}
631355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
641355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinasstatic inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
651355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas					     unsigned long addr, pte_t *ptep,
661355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas					     pte_t pte, int dirty)
671355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas{
681355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas	return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
691355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas}
701355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas
711355e2a6eb88f04d76125c057dc5fca64d4b6a9eCatalin Marinas#endif /* _ASM_ARM_HUGETLB_3LEVEL_H */
72