summaryrefslogtreecommitdiff
path: root/debian/patches/random-fixes0003-i386-improve-syscall-tracing.patch
blob: 41aa5f4ee24497c24ffa4ddfa94734978e210b11 (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
From 625801e5ada58af77861c72514ebc5521a67398f Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Sun, 27 Sep 2015 15:34:36 +0200
Subject: [PATCH gnumach 3/4] i386: improve syscall tracing

* kern/syscall_sw.h (mach_trap_t): Turn unused field into `mach_trap_name'.
(MACH_TRAP, MACH_TRAP_STACK): Record name.
* i386/i386/debug_i386.c (syscall_trace_print): Use the name and
format the arguments to look like c.
---
 i386/i386/debug_i386.c | 21 ++++++++++++++++-----
 kern/syscall_sw.h      |  6 +++---
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/i386/i386/debug_i386.c b/i386/i386/debug_i386.c
index f0fe2ae..7a33350 100644
--- a/i386/i386/debug_i386.c
+++ b/i386/i386/debug_i386.c
@@ -137,11 +137,22 @@ syscall_trace_print(int syscallvec, ...)
 {
 	int syscallnum = syscallvec >> 4;
 	int i;
-
-	printf("syscall -%d:", syscallnum);
-	for (i = 0; i < mach_trap_table[syscallnum].mach_trap_arg_count; i++)
-		printf(" %08x", (&syscallvec)[1+i]);
-	printf("\n");
+	const mach_trap_t *trap = &mach_trap_table[syscallnum];
+
+	printf("0x%08x:0x%08x:%s(",
+	       current_task(), current_thread(), trap->mach_trap_name);
+	for (i = 0; i < trap->mach_trap_arg_count; i++) {
+		unsigned long value = (&syscallvec)[1+i];
+		/* Use a crude heuristic to format pointers.  */
+		if (value > 1024)
+			printf("0x%08x", value);
+		else
+			printf("%d", value);
+
+		if (i + 1 < trap->mach_trap_arg_count)
+			printf(", ");
+	}
+	printf(")\n");
 
 	return syscallvec;
 }
diff --git a/kern/syscall_sw.h b/kern/syscall_sw.h
index 87fc1bb..1edf1c7 100644
--- a/kern/syscall_sw.h
+++ b/kern/syscall_sw.h
@@ -37,15 +37,15 @@ typedef struct {
 	int		mach_trap_arg_count;
 	int		(*mach_trap_function)();
 	boolean_t	mach_trap_stack;
-	int		mach_trap_unused;
+	const char	*mach_trap_name;
 } mach_trap_t;
 
 extern mach_trap_t	mach_trap_table[];
 extern int		mach_trap_count;
 
 #define	MACH_TRAP(name, arg_count)		\
-		{ (arg_count), (int (*)()) (name), FALSE, 0 }
+		{ (arg_count), (int (*)()) (name), FALSE, #name }
 #define	MACH_TRAP_STACK(name, arg_count)	\
-		{ (arg_count), (int (*)()) (name), TRUE, 0 }
+		{ (arg_count), (int (*)()) (name), TRUE, #name }
 
 #endif	/* _KERN_SYSCALL_SW_H_ */
-- 
2.1.4