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