lkml.org 
[lkml]   [2016]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 05/10] x86/syscalls: Move compat syscall entry handling into syscalltbl.sh
    Date
    Rather than duplicating the compat entry handling in all consumers
    of syscalls_BITS.h, handle it directly in syscalltbl.sh. Now we
    generate entries in syscalls_32.h like:

    __SYSCALL_I386(5, sys_open)
    __SYSCALL_I386(5, compat_sys_open)

    and all of its consumers implicitly get the right entry point.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    ---
    arch/x86/entry/syscall_32.c | 10 ++--------
    arch/x86/entry/syscall_64.c | 4 ++--
    arch/x86/entry/syscalls/syscalltbl.sh | 22 ++++++++++++++++++----
    arch/x86/kernel/asm-offsets_32.c | 2 +-
    arch/x86/kernel/asm-offsets_64.c | 4 ++--
    arch/x86/um/sys_call_table_32.c | 4 ++--
    arch/x86/um/sys_call_table_64.c | 4 ++--
    arch/x86/um/user-offsets.c | 4 ++--
    8 files changed, 31 insertions(+), 23 deletions(-)

    diff --git a/arch/x86/entry/syscall_32.c b/arch/x86/entry/syscall_32.c
    index 9a6649857106..3e2829759da2 100644
    --- a/arch/x86/entry/syscall_32.c
    +++ b/arch/x86/entry/syscall_32.c
    @@ -6,17 +6,11 @@
    #include <asm/asm-offsets.h>
    #include <asm/syscall.h>

    -#ifdef CONFIG_IA32_EMULATION
    -#define SYM(sym, compat) compat
    -#else
    -#define SYM(sym, compat) sym
    -#endif
    -
    -#define __SYSCALL_I386(nr, sym, compat) extern asmlinkage long SYM(sym, compat)(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    +#define __SYSCALL_I386(nr, sym) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    #include <asm/syscalls_32.h>
    #undef __SYSCALL_I386

    -#define __SYSCALL_I386(nr, sym, compat) [nr] = SYM(sym, compat),
    +#define __SYSCALL_I386(nr, sym) [nr] = sym,

    extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);

    diff --git a/arch/x86/entry/syscall_64.c b/arch/x86/entry/syscall_64.c
    index 974fd89ac806..3781989b180e 100644
    --- a/arch/x86/entry/syscall_64.c
    +++ b/arch/x86/entry/syscall_64.c
    @@ -6,11 +6,11 @@
    #include <asm/asm-offsets.h>
    #include <asm/syscall.h>

    -#define __SYSCALL_64(nr, sym, compat) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    +#define __SYSCALL_64(nr, sym) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    #include <asm/syscalls_64.h>
    #undef __SYSCALL_64

    -#define __SYSCALL_64(nr, sym, compat) [nr] = sym,
    +#define __SYSCALL_64(nr, sym) [nr] = sym,

    extern long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);

    diff --git a/arch/x86/entry/syscalls/syscalltbl.sh b/arch/x86/entry/syscalls/syscalltbl.sh
    index 5ebeaf1041e7..b81479c8c5fb 100644
    --- a/arch/x86/entry/syscalls/syscalltbl.sh
    +++ b/arch/x86/entry/syscalls/syscalltbl.sh
    @@ -8,10 +8,24 @@ emit() {
    nr="$2"
    entry="$3"
    compat="$4"
    - if [ -n "$compat" ]; then
    - echo "__SYSCALL_${abi}($nr, $entry, $compat)"
    - elif [ -n "$entry" ]; then
    - echo "__SYSCALL_${abi}($nr, $entry, $entry)"
    +
    + if [ "$abi" == "64" -a -n "$compat" ]; then
    + echo "a compat entry for a 64-bit syscall makes no sense" >&2
    + exit 1
    + fi
    +
    + if [ -z "$compat" ]; then
    + if [ -n "$entry" ]; then
    + echo "__SYSCALL_${abi}($nr, $entry)"
    + fi
    + else
    + echo "#ifdef CONFIG_X86_32"
    + if [ -n "$entry" ]; then
    + echo "__SYSCALL_${abi}($nr, $entry)"
    + fi
    + echo "#else"
    + echo "__SYSCALL_${abi}($nr, $compat)"
    + echo "#endif"
    fi
    }

    diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c
    index 6ce39025f467..abec4c9f1c97 100644
    --- a/arch/x86/kernel/asm-offsets_32.c
    +++ b/arch/x86/kernel/asm-offsets_32.c
    @@ -7,7 +7,7 @@
    #include <linux/lguest.h>
    #include "../../../drivers/lguest/lg.h"

    -#define __SYSCALL_I386(nr, sym, compat) [nr] = 1,
    +#define __SYSCALL_I386(nr, sym) [nr] = 1,
    static char syscalls[] = {
    #include <asm/syscalls_32.h>
    };
    diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c
    index 29db3b3f550c..9677bf9a616f 100644
    --- a/arch/x86/kernel/asm-offsets_64.c
    +++ b/arch/x86/kernel/asm-offsets_64.c
    @@ -4,11 +4,11 @@

    #include <asm/ia32.h>

    -#define __SYSCALL_64(nr, sym, compat) [nr] = 1,
    +#define __SYSCALL_64(nr, sym) [nr] = 1,
    static char syscalls_64[] = {
    #include <asm/syscalls_64.h>
    };
    -#define __SYSCALL_I386(nr, sym, compat) [nr] = 1,
    +#define __SYSCALL_I386(nr, sym) [nr] = 1,
    static char syscalls_ia32[] = {
    #include <asm/syscalls_32.h>
    };
    diff --git a/arch/x86/um/sys_call_table_32.c b/arch/x86/um/sys_call_table_32.c
    index 439c0994b696..d4669a679fd0 100644
    --- a/arch/x86/um/sys_call_table_32.c
    +++ b/arch/x86/um/sys_call_table_32.c
    @@ -25,11 +25,11 @@

    #define old_mmap sys_old_mmap

    -#define __SYSCALL_I386(nr, sym, compat) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    +#define __SYSCALL_I386(nr, sym) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    #include <asm/syscalls_32.h>

    #undef __SYSCALL_I386
    -#define __SYSCALL_I386(nr, sym, compat) [ nr ] = sym,
    +#define __SYSCALL_I386(nr, sym) [ nr ] = sym,

    extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);

    diff --git a/arch/x86/um/sys_call_table_64.c b/arch/x86/um/sys_call_table_64.c
    index 71a497cde921..6ee5268beb05 100644
    --- a/arch/x86/um/sys_call_table_64.c
    +++ b/arch/x86/um/sys_call_table_64.c
    @@ -35,11 +35,11 @@
    #define stub_execveat sys_execveat
    #define stub_rt_sigreturn sys_rt_sigreturn

    -#define __SYSCALL_64(nr, sym, compat) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    +#define __SYSCALL_64(nr, sym) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
    #include <asm/syscalls_64.h>

    #undef __SYSCALL_64
    -#define __SYSCALL_64(nr, sym, compat) [ nr ] = sym,
    +#define __SYSCALL_64(nr, sym) [ nr ] = sym,

    extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);

    diff --git a/arch/x86/um/user-offsets.c b/arch/x86/um/user-offsets.c
    index 5edf4f4bbf53..6c9a9c1eae32 100644
    --- a/arch/x86/um/user-offsets.c
    +++ b/arch/x86/um/user-offsets.c
    @@ -9,12 +9,12 @@
    #include <asm/types.h>

    #ifdef __i386__
    -#define __SYSCALL_I386(nr, sym, compat) [nr] = 1,
    +#define __SYSCALL_I386(nr, sym) [nr] = 1,
    static char syscalls[] = {
    #include <asm/syscalls_32.h>
    };
    #else
    -#define __SYSCALL_64(nr, sym, compat) [nr] = 1,
    +#define __SYSCALL_64(nr, sym) [nr] = 1,
    static char syscalls[] = {
    #include <asm/syscalls_64.h>
    };
    --
    2.5.0
    \
     
     \ /
      Last update: 2016-01-29 00:41    [W:3.808 / U:0.796 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site