162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __ASM_MMAN_H__ 362306a36Sopenharmony_ci#define __ASM_MMAN_H__ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/compiler.h> 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci#include <uapi/asm/mman.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistatic inline unsigned long arch_calc_vm_prot_bits(unsigned long prot, 1062306a36Sopenharmony_ci unsigned long pkey __always_unused) 1162306a36Sopenharmony_ci{ 1262306a36Sopenharmony_ci unsigned long ret = 0; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci if (system_supports_bti() && (prot & PROT_BTI)) 1562306a36Sopenharmony_ci ret |= VM_ARM64_BTI; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci if (system_supports_mte() && (prot & PROT_MTE)) 1862306a36Sopenharmony_ci ret |= VM_MTE; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci return ret; 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic inline unsigned long arch_calc_vm_flag_bits(unsigned long flags) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci /* 2762306a36Sopenharmony_ci * Only allow MTE on anonymous mappings as these are guaranteed to be 2862306a36Sopenharmony_ci * backed by tags-capable memory. The vm_flags may be overridden by a 2962306a36Sopenharmony_ci * filesystem supporting MTE (RAM-based). 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci if (system_supports_mte() && (flags & MAP_ANONYMOUS)) 3262306a36Sopenharmony_ci return VM_MTE_ALLOWED; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci return 0; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci#define arch_calc_vm_flag_bits(flags) arch_calc_vm_flag_bits(flags) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic inline bool arch_validate_prot(unsigned long prot, 3962306a36Sopenharmony_ci unsigned long addr __always_unused) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci unsigned long supported = PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci if (system_supports_bti()) 4462306a36Sopenharmony_ci supported |= PROT_BTI; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci if (system_supports_mte()) 4762306a36Sopenharmony_ci supported |= PROT_MTE; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci return (prot & ~supported) == 0; 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci#define arch_validate_prot(prot, addr) arch_validate_prot(prot, addr) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic inline bool arch_validate_flags(unsigned long vm_flags) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci if (!system_supports_mte()) 5662306a36Sopenharmony_ci return true; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci /* only allow VM_MTE if VM_MTE_ALLOWED has been set previously */ 5962306a36Sopenharmony_ci return !(vm_flags & VM_MTE) || (vm_flags & VM_MTE_ALLOWED); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci#define arch_validate_flags(vm_flags) arch_validate_flags(vm_flags) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#endif /* ! __ASM_MMAN_H__ */ 64