Messages in this thread Patch in this message | | | From | Dmitry Safonov <> | Subject | [PATCH v2 16/19] arm/vdso: Migrate to generic vdso_base | Date | Tue, 24 Nov 2020 00:29:29 +0000 |
| |
Generic way to track the landing vma area. As a bonus, after unmapping sigpage, kernel won't try to land on its previous position (due to UNMAPPED_VDSO_BASE check instead of context.vdso ?= 0 check).
Signed-off-by: Dmitry Safonov <dima@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 a6330e7eb2b8..1df40666b024 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_VDSO_BASE 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..c6d44b34b05e 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->vdso_base = (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..ac9c0b4869c9 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->vdso_base; + + if (land == UNMAPPED_VDSO_BASE) + 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.29.2
| |