commit 2c8b6de913973274e877639658e9e7273a012adb Author: Dmitry V. Levin Date: Tue Jan 8 19:23:44 2019 +0000 mips o32: fix build Commit 917c2ccf3a67 "Refactor stack pointers" moved mips_REG_* macros from linux/mips/arch_regs.h to linux/mips/arch_regs.c because these macros are no longer used outside syscall.c or files included by syscall.c, but this caused a build regression on mips o32 because decode_syscall_subcall() uses mips_REG_SP prior to its definition. * syscall.c (decode_syscall_subcall): Move ... * linux/mips/get_syscall_args.c: ... here. * NEWS: Mention this fix. Reported-by: Baruch Siach Fixes: v4.26~61 "Refactor stack pointers" diff --git a/linux/mips/get_syscall_args.c b/linux/mips/get_syscall_args.c index 387aa852..e2889f98 100644 --- a/linux/mips/get_syscall_args.c +++ b/linux/mips/get_syscall_args.c @@ -37,3 +37,29 @@ arch_get_syscall_args(struct tcb *tcp) #endif return 1; } + +#ifdef SYS_syscall_subcall +static void +decode_syscall_subcall(struct tcb *tcp) +{ + if (!scno_is_valid(tcp->u_arg[0])) + return; + tcp->scno = tcp->u_arg[0]; + tcp->qual_flg = qual_flags(tcp->scno); + tcp->s_ent = &sysent[tcp->scno]; + memmove(&tcp->u_arg[0], &tcp->u_arg[1], + sizeof(tcp->u_arg) - sizeof(tcp->u_arg[0])); + /* + * Fetching the last arg of 7-arg syscalls (fadvise64_64 + * and sync_file_range) requires additional code, + * see linux/mips/get_syscall_args.c + */ + if (tcp->s_ent->nargs == MAX_ARGS) { + if (umoven(tcp, + mips_REG_SP + MAX_ARGS * sizeof(tcp->u_arg[0]), + sizeof(tcp->u_arg[0]), + &tcp->u_arg[MAX_ARGS - 1]) < 0) + tcp->u_arg[MAX_ARGS - 1] = 0; + } +} +#endif /* SYS_syscall_subcall */ diff --git a/syscall.c b/syscall.c index d78f51dd..51fcc721 100644 --- a/syscall.c +++ b/syscall.c @@ -349,31 +349,8 @@ decode_ipc_subcall(struct tcb *tcp) #endif /* SYS_ipc_subcall */ #ifdef SYS_syscall_subcall -static void -decode_syscall_subcall(struct tcb *tcp) -{ - if (!scno_is_valid(tcp->u_arg[0])) - return; - tcp->scno = tcp->u_arg[0]; - tcp->qual_flg = qual_flags(tcp->scno); - tcp->s_ent = &sysent[tcp->scno]; - memmove(&tcp->u_arg[0], &tcp->u_arg[1], - sizeof(tcp->u_arg) - sizeof(tcp->u_arg[0])); -# ifdef LINUX_MIPSO32 - /* - * Fetching the last arg of 7-arg syscalls (fadvise64_64 - * and sync_file_range) requires additional code, - * see linux/mips/get_syscall_args.c - */ - if (tcp->s_ent->nargs == MAX_ARGS) { - if (umoven(tcp, - mips_REG_SP + MAX_ARGS * sizeof(tcp->u_arg[0]), - sizeof(tcp->u_arg[0]), - &tcp->u_arg[MAX_ARGS - 1]) < 0) - tcp->u_arg[MAX_ARGS - 1] = 0; - } -# endif /* LINUX_MIPSO32 */ -} +/* The implementation is architecture specific. */ +static void decode_syscall_subcall(struct tcb *); #endif /* SYS_syscall_subcall */ static void