aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/process.c
diff options
context:
space:
mode:
authorNathan Lynch <nathan_lynch@mentor.com>2014-09-22 17:08:42 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-09-26 09:39:59 -0400
commit02e0409a65560da66a747d2ac6023715b04659ea (patch)
treebf87c685b08aca372e837ffdb1d0474a3225d6fd /arch/arm/kernel/process.c
parent75c349062a666deab57bdca8b5bd0779c9fb0d58 (diff)
ARM: 8154/1: use _install_special_mapping for sigpage
_install_special_mapping allows the VMA to be identifed in /proc/pid/maps without the use of arch_vma_name, providing a slight net reduction in object size: text data bss dec hex filename 2996 96 144 3236 ca4 arch/arm/kernel/process.o (before) 2956 104 144 3204 c84 arch/arm/kernel/process.o (after) Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/process.c')
-rw-r--r--arch/arm/kernel/process.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 81ef686a91ca..46fbbb3701a0 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -472,19 +472,23 @@ int in_gate_area_no_mm(unsigned long addr)
472 472
473const char *arch_vma_name(struct vm_area_struct *vma) 473const char *arch_vma_name(struct vm_area_struct *vma)
474{ 474{
475 return is_gate_vma(vma) ? "[vectors]" : 475 return is_gate_vma(vma) ? "[vectors]" : NULL;
476 (vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ?
477 "[sigpage]" : NULL;
478} 476}
479 477
480static struct page *signal_page; 478static struct page *signal_page;
481extern struct page *get_signal_page(void); 479extern struct page *get_signal_page(void);
482 480
481static const struct vm_special_mapping sigpage_mapping = {
482 .name = "[sigpage]",
483 .pages = &signal_page,
484};
485
483int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) 486int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
484{ 487{
485 struct mm_struct *mm = current->mm; 488 struct mm_struct *mm = current->mm;
489 struct vm_area_struct *vma;
486 unsigned long addr; 490 unsigned long addr;
487 int ret; 491 int ret = 0;
488 492
489 if (!signal_page) 493 if (!signal_page)
490 signal_page = get_signal_page(); 494 signal_page = get_signal_page();
@@ -498,12 +502,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
498 goto up_fail; 502 goto up_fail;
499 } 503 }
500 504
501 ret = install_special_mapping(mm, addr, PAGE_SIZE, 505 vma = _install_special_mapping(mm, addr, PAGE_SIZE,
502 VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, 506 VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
503 &signal_page); 507 &sigpage_mapping);
508
509 if (IS_ERR(vma)) {
510 ret = PTR_ERR(vma);
511 goto up_fail;
512 }
504 513
505 if (ret == 0) 514 mm->context.sigpage = addr;
506 mm->context.sigpage = addr;
507 515
508 up_fail: 516 up_fail:
509 up_write(&mm->mmap_sem); 517 up_write(&mm->mmap_sem);