2005-04-16 15:20:36 -07:00
/*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
2012-10-09 09:47:26 +01:00
# ifndef _ASM_POWERPC_MMAN_H
# define _ASM_POWERPC_MMAN_H
2005-04-16 15:20:36 -07:00
2012-10-09 09:47:26 +01:00
# include <uapi/asm/mman.h>
2005-04-16 15:20:36 -07:00
2008-07-08 00:28:54 +10:00
# ifdef CONFIG_PPC64
2008-07-14 19:25:57 +10:00
# include <asm/cputable.h>
# include <linux/mm.h>
2018-01-18 17:50:33 -08:00
# include <linux/pkeys.h>
2016-07-23 14:42:40 +05:30
# include <asm/cpu_has_feature.h>
2008-07-14 19:25:57 +10:00
2008-07-08 00:28:54 +10:00
/*
* This file is included by linux / mman . h , so we can ' t use cacl_vm_prot_bits ( )
* here . How important is the optimization ?
*/
2016-02-12 13:02:31 -08:00
static inline unsigned long arch_calc_vm_prot_bits ( unsigned long prot ,
unsigned long pkey )
2008-07-08 00:28:54 +10:00
{
2018-01-18 17:50:33 -08:00
# ifdef CONFIG_PPC_MEM_KEYS
return ( ( ( prot & PROT_SAO ) ? VM_SAO : 0 ) | pkey_to_vmflag_bits ( pkey ) ) ;
# else
return ( ( prot & PROT_SAO ) ? VM_SAO : 0 ) ;
# endif
2008-07-08 00:28:54 +10:00
}
2016-02-12 13:02:31 -08:00
# define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
2008-07-08 00:28:54 +10:00
static inline pgprot_t arch_vm_get_page_prot ( unsigned long vm_flags )
{
2018-01-18 17:50:35 -08:00
# ifdef CONFIG_PPC_MEM_KEYS
return ( vm_flags & VM_SAO ) ?
__pgprot ( _PAGE_SAO | vmflag_to_pte_pkey_bits ( vm_flags ) ) :
__pgprot ( 0 | vmflag_to_pte_pkey_bits ( vm_flags ) ) ;
# else
2008-10-12 17:54:24 +00:00
return ( vm_flags & VM_SAO ) ? __pgprot ( _PAGE_SAO ) : __pgprot ( 0 ) ;
2018-01-18 17:50:35 -08:00
# endif
2008-07-08 00:28:54 +10:00
}
# define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags)
2018-02-21 10:15:49 -07:00
static inline bool arch_validate_prot ( unsigned long prot , unsigned long addr )
2008-07-08 00:28:54 +10:00
{
if ( prot & ~ ( PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_SAO ) )
2016-08-02 14:03:42 -07:00
return false ;
2008-07-08 00:28:54 +10:00
if ( ( prot & PROT_SAO ) & & ! cpu_has_feature ( CPU_FTR_SAO ) )
2016-08-02 14:03:42 -07:00
return false ;
return true ;
2008-07-08 00:28:54 +10:00
}
2018-02-21 10:15:49 -07:00
# define arch_validate_prot arch_validate_prot
2008-07-08 00:28:54 +10:00
# endif /* CONFIG_PPC64 */
2005-09-07 15:27:09 -05:00
# endif /* _ASM_POWERPC_MMAN_H */