diff options
Diffstat (limited to 'arch/x86/entry/common.c')
| -rw-r--r-- | arch/x86/entry/common.c | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c index 536b574b6161..3f8e22615812 100644 --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -285,15 +285,16 @@ __visible void do_syscall_64(unsigned long nr, struct pt_regs *regs)  	if (READ_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY)  		nr = syscall_trace_enter(regs); -	/* -	 * NB: Native and x32 syscalls are dispatched from the same -	 * table.  The only functional difference is the x32 bit in -	 * regs->orig_ax, which changes the behavior of some syscalls. -	 */ -	nr &= __SYSCALL_MASK;  	if (likely(nr < NR_syscalls)) {  		nr = array_index_nospec(nr, NR_syscalls);  		regs->ax = 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); +#endif  	}  	syscall_return_slowpath(regs);  |