summaryrefslogtreecommitdiff
path: root/packages/strace/4.26/0000-mips-o32-fix-build.patch
blob: afb1f40a7a4c0f3eba7bb60403783a2e68cd6df3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
commit 2c8b6de913973274e877639658e9e7273a012adb
Author: Dmitry V. Levin <ldv@altlinux.org>
Date:   Tue Jan 8 19:23:44 2019 +0000

    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"

---
 linux/mips/get_syscall_args.c |   26 ++++++++++++++++++++++++++
 syscall.c                     |   27 ++-------------------------
 2 files changed, 28 insertions(+), 25 deletions(-)

--- a/linux/mips/get_syscall_args.c
+++ b/linux/mips/get_syscall_args.c
@@ -37,3 +37,29 @@
 #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 @@
 #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