1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun */ 4*4882a593Smuzhiyun #ifndef _ASM_POWERPC_MMAN_H 5*4882a593Smuzhiyun #define _ASM_POWERPC_MMAN_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <uapi/asm/mman.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifdef CONFIG_PPC64 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <asm/cputable.h> 12*4882a593Smuzhiyun #include <linux/mm.h> 13*4882a593Smuzhiyun #include <linux/pkeys.h> 14*4882a593Smuzhiyun #include <asm/cpu_has_feature.h> 15*4882a593Smuzhiyun arch_calc_vm_prot_bits(unsigned long prot,unsigned long pkey)16*4882a593Smuzhiyunstatic inline unsigned long arch_calc_vm_prot_bits(unsigned long prot, 17*4882a593Smuzhiyun unsigned long pkey) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun #ifdef CONFIG_PPC_MEM_KEYS 20*4882a593Smuzhiyun return (((prot & PROT_SAO) ? VM_SAO : 0) | pkey_to_vmflag_bits(pkey)); 21*4882a593Smuzhiyun #else 22*4882a593Smuzhiyun return ((prot & PROT_SAO) ? VM_SAO : 0); 23*4882a593Smuzhiyun #endif 24*4882a593Smuzhiyun } 25*4882a593Smuzhiyun #define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey) 26*4882a593Smuzhiyun arch_vm_get_page_prot(unsigned long vm_flags)27*4882a593Smuzhiyunstatic inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags) 28*4882a593Smuzhiyun { 29*4882a593Smuzhiyun #ifdef CONFIG_PPC_MEM_KEYS 30*4882a593Smuzhiyun return (vm_flags & VM_SAO) ? 31*4882a593Smuzhiyun __pgprot(_PAGE_SAO | vmflag_to_pte_pkey_bits(vm_flags)) : 32*4882a593Smuzhiyun __pgprot(0 | vmflag_to_pte_pkey_bits(vm_flags)); 33*4882a593Smuzhiyun #else 34*4882a593Smuzhiyun return (vm_flags & VM_SAO) ? __pgprot(_PAGE_SAO) : __pgprot(0); 35*4882a593Smuzhiyun #endif 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun #define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags) 38*4882a593Smuzhiyun arch_validate_prot(unsigned long prot,unsigned long addr)39*4882a593Smuzhiyunstatic inline bool arch_validate_prot(unsigned long prot, unsigned long addr) 40*4882a593Smuzhiyun { 41*4882a593Smuzhiyun if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_SAO)) 42*4882a593Smuzhiyun return false; 43*4882a593Smuzhiyun if (prot & PROT_SAO) { 44*4882a593Smuzhiyun if (!cpu_has_feature(CPU_FTR_SAO)) 45*4882a593Smuzhiyun return false; 46*4882a593Smuzhiyun if (firmware_has_feature(FW_FEATURE_LPAR) && 47*4882a593Smuzhiyun !IS_ENABLED(CONFIG_PPC_PROT_SAO_LPAR)) 48*4882a593Smuzhiyun return false; 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun return true; 51*4882a593Smuzhiyun } 52*4882a593Smuzhiyun #define arch_validate_prot arch_validate_prot 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #endif /* CONFIG_PPC64 */ 55*4882a593Smuzhiyun #endif /* _ASM_POWERPC_MMAN_H */ 56