mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 23:45:31 +08:00
8ef8f360cf
This patch adds the bare minimum required to expose the ARMv8.5 Branch Target Identification feature to userspace. By itself, this does _not_ automatically enable BTI for any initial executable pages mapped by execve(). This will come later, but for now it should be possible to enable BTI manually on those pages by using mprotect() from within the target process. Other arches already using the generic mman.h are already using 0x10 for arch-specific prot flags, so we use that for PROT_BTI here. For consistency, signal handler entry points in BTI guarded pages are required to be annotated as such, just like any other function. This blocks a relatively minor attack vector, but comforming userspace will have the annotations anyway, so we may as well enforce them. Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
38 lines
1019 B
C
38 lines
1019 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __ASM_MMAN_H__
|
|
#define __ASM_MMAN_H__
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/types.h>
|
|
#include <uapi/asm/mman.h>
|
|
|
|
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
|
unsigned long pkey __always_unused)
|
|
{
|
|
if (system_supports_bti() && (prot & PROT_BTI))
|
|
return VM_ARM64_BTI;
|
|
|
|
return 0;
|
|
}
|
|
#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
|
|
|
|
static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags)
|
|
{
|
|
return (vm_flags & VM_ARM64_BTI) ? __pgprot(PTE_GP) : __pgprot(0);
|
|
}
|
|
#define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags)
|
|
|
|
static inline bool arch_validate_prot(unsigned long prot,
|
|
unsigned long addr __always_unused)
|
|
{
|
|
unsigned long supported = PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM;
|
|
|
|
if (system_supports_bti())
|
|
supported |= PROT_BTI;
|
|
|
|
return (prot & ~supported) == 0;
|
|
}
|
|
#define arch_validate_prot(prot, addr) arch_validate_prot(prot, addr)
|
|
|
|
#endif /* ! __ASM_MMAN_H__ */
|