| From 2c8b6de913973274e877639658e9e7273a012adb Mon Sep 17 00:00:00 2001 |
| From: "Dmitry V. Levin" <ldv@altlinux.org> |
| Date: Tue, 8 Jan 2019 19:23:44 +0000 |
| Subject: [PATCH] mips o32: fix build |
| |
| Upstream-Status: Backport |
| |
| 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. |
| |
| Reported-by: Baruch Siach <baruch@tkos.co.il> |
| Fixes: v4.26~61 "Refactor stack pointers" |
| --- |
| linux/mips/get_syscall_args.c | 26 ++++++++++++++++++++++++++ |
| syscall.c | 27 ++------------------------- |
| 2 files changed, 29 insertions(+), 25 deletions(-) |
| |
| 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 |
| -- |
| 2.17.0 |
| |