lkml.org 
[lkml]   [2007]   [Feb]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH x86 for review III] [23/29] x86: Don't require the vDSO for handling a.out signals
    Date

    and in other strange binfmts. vDSO is not necessarily mapped there.

    Signed-off-by: Andi Kleen <ak@suse.de>

    ---
    arch/i386/kernel/signal.c | 6 +++++-
    arch/x86_64/ia32/ia32_signal.c | 7 ++++++-
    fs/binfmt_elf.c | 3 ++-
    include/linux/binfmts.h | 1 +
    4 files changed, 14 insertions(+), 3 deletions(-)

    Index: linux/arch/i386/kernel/signal.c
    ===================================================================
    --- linux.orig/arch/i386/kernel/signal.c
    +++ linux/arch/i386/kernel/signal.c
    @@ -21,6 +21,7 @@
    #include <linux/suspend.h>
    #include <linux/ptrace.h>
    #include <linux/elf.h>
    +#include <linux/binfmts.h>
    #include <asm/processor.h>
    #include <asm/ucontext.h>
    #include <asm/uaccess.h>
    @@ -349,7 +350,10 @@ static int setup_frame(int sig, struct k
    goto give_sigsegv;
    }

    - restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
    + if (current->binfmt->hasvdso)
    + restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
    + else
    + restorer = (void *)&frame->retcode;
    if (ka->sa.sa_flags & SA_RESTORER)
    restorer = ka->sa.sa_restorer;

    Index: linux/arch/x86_64/ia32/ia32_signal.c
    ===================================================================
    --- linux.orig/arch/x86_64/ia32/ia32_signal.c
    +++ linux/arch/x86_64/ia32/ia32_signal.c
    @@ -21,6 +21,7 @@
    #include <linux/stddef.h>
    #include <linux/personality.h>
    #include <linux/compat.h>
    +#include <linux/binfmts.h>
    #include <asm/ucontext.h>
    #include <asm/uaccess.h>
    #include <asm/i387.h>
    @@ -449,7 +450,11 @@ int ia32_setup_frame(int sig, struct k_s

    /* Return stub is in 32bit vsyscall page */
    {
    - void __user *restorer = VSYSCALL32_SIGRETURN;
    + void __user *restorer;
    + if (current->binfmt->hasvdso)
    + restorer = VSYSCALL32_SIGRETURN;
    + else
    + restorer = (void *)&frame->retcode;
    if (ka->sa.sa_flags & SA_RESTORER)
    restorer = ka->sa.sa_restorer;
    err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
    Index: linux/fs/binfmt_elf.c
    ===================================================================
    --- linux.orig/fs/binfmt_elf.c
    +++ linux/fs/binfmt_elf.c
    @@ -76,7 +76,8 @@ static struct linux_binfmt elf_format =
    .load_binary = load_elf_binary,
    .load_shlib = load_elf_library,
    .core_dump = elf_core_dump,
    - .min_coredump = ELF_EXEC_PAGESIZE
    + .min_coredump = ELF_EXEC_PAGESIZE,
    + .hasvdso = 1
    };

    #define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
    Index: linux/include/linux/binfmts.h
    ===================================================================
    --- linux.orig/include/linux/binfmts.h
    +++ linux/include/linux/binfmts.h
    @@ -59,6 +59,7 @@ struct linux_binfmt {
    int (*load_shlib)(struct file *);
    int (*core_dump)(long signr, struct pt_regs * regs, struct file * file);
    unsigned long min_coredump; /* minimal dump size */
    + int hasvdso;
    };

    extern int register_binfmt(struct linux_binfmt *);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-02-12 17:57    [W:3.482 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site