|
@@ -0,0 +1,91 @@
|
|
|
+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
|