diff options
Diffstat (limited to 'arch/x86/include/asm/syscall_wrapper.h')
| -rw-r--r-- | arch/x86/include/asm/syscall_wrapper.h | 25 | 
1 files changed, 21 insertions, 4 deletions
diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h index 21f9407be5d3..7e88705e907f 100644 --- a/arch/x86/include/asm/syscall_wrapper.h +++ b/arch/x86/include/asm/syscall_wrapper.h @@ -58,12 +58,29 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);  		,,regs->di,,regs->si,,regs->dx				\  		,,regs->r10,,regs->r8,,regs->r9)			\ + +/* SYSCALL_PT_ARGS is Adapted from s390x */ +#define SYSCALL_PT_ARG6(m, t1, t2, t3, t4, t5, t6)			\ +	SYSCALL_PT_ARG5(m, t1, t2, t3, t4, t5), m(t6, (regs->bp)) +#define SYSCALL_PT_ARG5(m, t1, t2, t3, t4, t5)				\ +	SYSCALL_PT_ARG4(m, t1, t2, t3, t4),  m(t5, (regs->di)) +#define SYSCALL_PT_ARG4(m, t1, t2, t3, t4)				\ +	SYSCALL_PT_ARG3(m, t1, t2, t3),  m(t4, (regs->si)) +#define SYSCALL_PT_ARG3(m, t1, t2, t3)					\ +	SYSCALL_PT_ARG2(m, t1, t2), m(t3, (regs->dx)) +#define SYSCALL_PT_ARG2(m, t1, t2)					\ +	SYSCALL_PT_ARG1(m, t1), m(t2, (regs->cx)) +#define SYSCALL_PT_ARG1(m, t1) m(t1, (regs->bx)) +#define SYSCALL_PT_ARGS(x, ...) SYSCALL_PT_ARG##x(__VA_ARGS__) + +#define __SC_COMPAT_CAST(t, a)						\ +	(__typeof(__builtin_choose_expr(__TYPE_IS_L(t), 0, 0U)))	\ +	(unsigned int)a +  /* Mapping of registers to parameters for syscalls on i386 */  #define SC_IA32_REGS_TO_ARGS(x, ...)					\ -	__MAP(x,__SC_ARGS						\ -	      ,,(unsigned int)regs->bx,,(unsigned int)regs->cx		\ -	      ,,(unsigned int)regs->dx,,(unsigned int)regs->si		\ -	      ,,(unsigned int)regs->di,,(unsigned int)regs->bp) +	SYSCALL_PT_ARGS(x, __SC_COMPAT_CAST,				\ +			__MAP(x, __SC_TYPE, __VA_ARGS__))		\  #define __SYS_STUB0(abi, name)						\  	long __##abi##_##name(const struct pt_regs *regs);		\  | 
