The new patch is a backport from current strace master. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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
 | 
						|
 | 
						|
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 <baruch@tkos.co.il>
 | 
						|
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
 |