Generic way to track the land vma area. As a bonus, after unmapping sigpage, kernel won't try to land on its previous position.
Signed-off-by: Dmitry Safonov <d...@arista.com> --- arch/arm/Kconfig | 1 + arch/arm/kernel/process.c | 9 +-------- arch/arm/kernel/signal.c | 6 +++++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index bece41f3b3b9..c161d7313911 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -24,6 +24,7 @@ config ARM select ARCH_HAS_SYNC_DMA_FOR_CPU if SWIOTLB select ARCH_HAS_TEARDOWN_DMA_OPS if MMU select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST + select ARCH_HAS_USER_LANDING select ARCH_HAVE_CUSTOM_GPIO_H select ARCH_HAS_GCOV_PROFILE_ALL select ARCH_KEEP_MEMBLOCK diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 5f4eced738f5..ac08241e5cf8 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -376,16 +376,9 @@ static unsigned long sigpage_addr(const struct mm_struct *mm, static struct page *signal_page; extern struct page *get_signal_page(void); -static void sigpage_mremap(const struct vm_special_mapping *sm, - struct vm_area_struct *new_vma) -{ - current->mm->context.sigpage = new_vma->vm_start; -} - static const struct vm_special_mapping sigpage_mapping = { .name = "[sigpage]", .pages = &signal_page, - .mremap = sigpage_mremap, }; int arch_setup_additional_pages(unsigned long *sysinfo_ehdr) @@ -423,7 +416,7 @@ int arch_setup_additional_pages(unsigned long *sysinfo_ehdr) goto up_fail; } - mm->context.sigpage = addr; + mm->user_landing = (void __user *)addr; /* Unlike the sigpage, failure to install the vdso is unlikely * to be fatal to the process, so no error check needed diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 9d2e916121be..270b17a9dc0f 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -451,13 +451,17 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig, #ifdef CONFIG_MMU if (cpsr & MODE32_BIT) { struct mm_struct *mm = current->mm; + unsigned long land = (unsigned long)mm->user_landing; + + if (land == UNMAPPED_USER_LANDING) + return 1; /* * 32-bit code can use the signal return page * except when the MPU has protected the vectors * page from PL0 */ - retcode = mm->context.sigpage + signal_return_offset + + retcode = land + signal_return_offset + (idx << 2) + thumb; } else #endif -- 2.28.0