Add a wrapper function for invoking a syscall function.

Signed-off-by: Alexandre Chartre <alexandre.char...@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

Reply via email to