lkml.org 
[lkml]   [2020]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC][PATCH v2 01/21] x86/syscall: Add wrapper for invoking syscall function
    Date
    Add a wrapper function for invoking a syscall function.

    Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com>
    ---
    arch/x86/entry/common.c | 16 +++++++++++++---
    1 file changed, 13 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
    index 870efeec8bda..d222212908ad 100644
    --- a/arch/x86/entry/common.c
    +++ b/arch/x86/entry/common.c
    @@ -35,6 +35,15 @@
    #include <asm/syscall.h>
    #include <asm/irq_stack.h>

    +static __always_inline void run_syscall(sys_call_ptr_t sysfunc,
    + struct pt_regs *regs)
    +{
    + if (!sysfunc)
    + return;
    +
    + regs->ax = sysfunc(regs);
    +}
    +
    #ifdef CONFIG_X86_64
    __visible noinstr void do_syscall_64(unsigned long nr, struct pt_regs *regs)
    {
    @@ -43,15 +52,16 @@ __visible noinstr void do_syscall_64(unsigned long nr, struct pt_regs *regs)
    instrumentation_begin();
    if (likely(nr < NR_syscalls)) {
    nr = array_index_nospec(nr, NR_syscalls);
    - regs->ax = sys_call_table[nr](regs);
    + run_syscall(sys_call_table[nr], regs);
    #ifdef CONFIG_X86_X32_ABI
    } else if (likely((nr & __X32_SYSCALL_BIT) &&
    (nr & ~__X32_SYSCALL_BIT) < X32_NR_syscalls)) {
    nr = array_index_nospec(nr & ~__X32_SYSCALL_BIT,
    X32_NR_syscalls);
    - regs->ax = x32_sys_call_table[nr](regs);
    + run_syscall(x32_sys_call_table[nr], regs);
    #endif
    }
    +
    instrumentation_end();
    syscall_exit_to_user_mode(regs);
    }
    @@ -75,7 +85,7 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs,
    if (likely(nr < IA32_NR_syscalls)) {
    instrumentation_begin();
    nr = array_index_nospec(nr, IA32_NR_syscalls);
    - regs->ax = ia32_sys_call_table[nr](regs);
    + run_syscall(ia32_sys_call_table[nr], regs);
    instrumentation_end();
    }
    }
    --
    2.18.4
    \
     
     \ /
      Last update: 2020-11-16 15:50    [W:4.218 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site