summaryrefslogtreecommitdiff
path: root/patches/strace/4.10/008_decode_mips_indirect_syscall.patch
blob: d2d72173f151c5a055a14f0b100e4002a1e37911 (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
commit f34b97f89dd3893ef3652a6899487771402fc13c
Index: strace-4.10/linux/mips/syscallent-o32.h
===================================================================
--- strace-4.10.orig/linux/mips/syscallent-o32.h
+++ strace-4.10/linux/mips/syscallent-o32.h
@@ -1,6 +1,6 @@
 #if defined LINUX_MIPSO32
 /* For an O32 strace, decode the o32 syscalls.  */
-[4000] = { MA,	0,		printargs,			"syscall"		}, /* start of Linux o32 */
+[4000] = { MA,	0,		sys_syscall,			"syscall"		}, /* start of Linux o32 */
 [4001] = { 1,	TP|SE,		sys_exit,			"exit"			},
 [4002] = { 0,	TP,		sys_fork,			"fork"			},
 [4003] = { 3,	TD,		sys_read,			"read"			},
Index: strace-4.10/syscall.c
===================================================================
--- strace-4.10.orig/syscall.c
+++ strace-4.10/syscall.c
@@ -606,6 +606,25 @@ decode_ipc_subcall(struct tcb *tcp)
 }
 #endif
 
+#ifdef LINUX_MIPSO32
+static void
+decode_mips_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]));
+}
+
+int sys_syscall(struct tcb *tcp)
+{
+	return printargs(tcp);
+}
+#endif
+
 int
 printargs(struct tcb *tcp)
 {
@@ -1774,6 +1793,11 @@ trace_syscall_entering(struct tcb *tcp)
 		goto ret;
 	}
 
+#ifdef LINUX_MIPSO32
+	if (sys_syscall == tcp->s_ent->sys_func)
+		decode_mips_subcall(tcp);
+#endif
+
 	if (   sys_execve == tcp->s_ent->sys_func
 # if defined(SPARC) || defined(SPARC64)
 	    || sys_execv == tcp->s_ent->sys_func
--- strace-4.10.orig/linux/syscall.h	2015-02-06 01:23:05.000000000 +0000
+++ strace-4.10/linux/syscall.h	2015-07-09 14:36:49.372494628 +0100
@@ -277,6 +277,7 @@
 int sys_symlinkat();
 int sys_sync_file_range();
 int sys_sync_file_range2();
+int sys_syscall();
 int sys_sysctl();
 int sys_sysinfo();
 int sys_syslog();