 b55fbb6b2d
			
		
	
	b55fbb6b2d
	
	
	
		
			
			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
 |