12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- From 2c8b6de913973274e877639658e9e7273a012adb Mon Sep 17 00:00:00 2001
- From: "Dmitry V. Levin" <[email protected]>
- Date: Tue, 8 Jan 2019 19:23:44 +0000
- Subject: [PATCH] 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 <[email protected]>
- Fixes: v4.26~61 "Refactor stack pointers"
- ---
- NEWS | 1 +
- linux/mips/get_syscall_args.c | 26 ++++++++++++++++++++++++++
- syscall.c | 27 ++-------------------------
- 3 files changed, 29 insertions(+), 25 deletions(-)
- --- 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 */
- --- 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
|