Commit bf740a90 authored by Mark Brown's avatar Mark Brown Committed by Will Deacon

arm64: vdso: Map the vDSO text with guarded pages when built for BTI

The kernel is responsible for mapping the vDSO into userspace processes,
including mapping the text section as executable. Handle the mapping of
the vDSO for BTI similarly, mapping the text section as guarded pages so
the BTI annotations in the vDSO become effective when they are present.

This will mean that we can have BTI active for the vDSO in processes that
do not otherwise support BTI. This should not be an issue for any expected
use of the vDSO.
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20200506195138.22086-12-broonie@kernel.orgSigned-off-by: default avatarWill Deacon <will@kernel.org>
parent 5e02a188
...@@ -142,6 +142,7 @@ static int __setup_additional_pages(enum arch_vdso_type arch_index, ...@@ -142,6 +142,7 @@ static int __setup_additional_pages(enum arch_vdso_type arch_index,
int uses_interp) int uses_interp)
{ {
unsigned long vdso_base, vdso_text_len, vdso_mapping_len; unsigned long vdso_base, vdso_text_len, vdso_mapping_len;
unsigned long gp_flags = 0;
void *ret; void *ret;
vdso_text_len = vdso_lookup[arch_index].vdso_pages << PAGE_SHIFT; vdso_text_len = vdso_lookup[arch_index].vdso_pages << PAGE_SHIFT;
...@@ -160,10 +161,13 @@ static int __setup_additional_pages(enum arch_vdso_type arch_index, ...@@ -160,10 +161,13 @@ static int __setup_additional_pages(enum arch_vdso_type arch_index,
if (IS_ERR(ret)) if (IS_ERR(ret))
goto up_fail; goto up_fail;
if (IS_ENABLED(CONFIG_ARM64_BTI_KERNEL) && system_supports_bti())
gp_flags = VM_ARM64_BTI;
vdso_base += PAGE_SIZE; vdso_base += PAGE_SIZE;
mm->context.vdso = (void *)vdso_base; mm->context.vdso = (void *)vdso_base;
ret = _install_special_mapping(mm, vdso_base, vdso_text_len, ret = _install_special_mapping(mm, vdso_base, vdso_text_len,
VM_READ|VM_EXEC| VM_READ|VM_EXEC|gp_flags|
VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
vdso_lookup[arch_index].cm); vdso_lookup[arch_index].cm);
if (IS_ERR(ret)) if (IS_ERR(ret))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment