summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/ChangeLog7
-rw-r--r--runtime/syscall.h22
-rw-r--r--runtime/task_finder.c11
3 files changed, 31 insertions, 9 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog
index 796f812c..6dfd2ea2 100644
--- a/runtime/ChangeLog
+++ b/runtime/ChangeLog
@@ -1,3 +1,10 @@
+2008-08-20 David Smith <dsmith@redhat.com>
+
+ * task_finder.c (__stp_utrace_task_finder_target_syscall_entry):
+ Handles mmap2 (as well as mmap).
+ (__stp_utrace_task_finder_target_syscall_exit): Ditto.
+ * syscall.h: Added defines for mmap and mmap2.
+
2008-08-19 David Smith <dsmith@redhat.com>
PR 6841
diff --git a/runtime/syscall.h b/runtime/syscall.h
index 3d1034e6..24e93463 100644
--- a/runtime/syscall.h
+++ b/runtime/syscall.h
@@ -11,12 +11,14 @@
#define _SYSCALL_H_
#if defined(__i386__) || defined(CONFIG_IA32_EMULATION)
-#define __MMAP_SYSCALL_NO_IA32 192 /* mmap2 */
+#define __MMAP_SYSCALL_NO_IA32 90
+#define __MMAP2_SYSCALL_NO_IA32 192
#define __MPROTECT_SYSCALL_NO_IA32 125
#define __MUNMAP_SYSCALL_NO_IA32 91
#define __MREMAP_SYSCALL_NO_IA32 163
# if !defined(CONFIG_IA32_EMULATION)
#define MMAP_SYSCALL_NO(tsk) __MMAP_SYSCALL_NO_IA32
+#define MMAP2_SYSCALL_NO(tsk) __MMAP2_SYSCALL_NO_IA32
#define MPROTECT_SYSCALL_NO(tsk) __MPROTECT_SYSCALL_NO_IA32
#define MUNMAP_SYSCALL_NO(tsk) __MUNMAP_SYSCALL_NO_IA32
#define MREMAP_SYSCALL_NO(tsk) __MREMAP_SYSCALL_NO_IA32
@@ -25,13 +27,19 @@
#if defined(__x86_64__)
#define __MMAP_SYSCALL_NO_X86_64 9
+/* x86_64 doesn't have a mmap2 system call. So, we'll use a number
+ * that doesn't map to a real system call. */
+#define __MMAP2_SYSCALL_NO_X86_64 ((unsigned long)-1)
#define __MPROTECT_SYSCALL_NO_X86_64 10
#define __MUNMAP_SYSCALL_NO_X86_64 11
#define __MREMAP_SYSCALL_NO_X86_64 25
# if defined(CONFIG_IA32_EMULATION)
-#define MMAP_SYSCALL_NO(tsk) ((test_tsk_thread_flag((tsk), TIF_IA32)) \
- ? __MMAP_SYSCALL_NO_IA32 \
+#define MMAP_SYSCALL_NO(tsk) ((test_tsk_thread_flag((tsk), TIF_IA32)) \
+ ? __MMAP_SYSCALL_NO_IA32 \
: __MMAP_SYSCALL_NO_X86_64)
+#define MMAP2_SYSCALL_NO(tsk) ((test_tsk_thread_flag((tsk), TIF_IA32)) \
+ ? __MMAP2_SYSCALL_NO_IA32 \
+ : __MMAP2_SYSCALL_NO_X86_64)
#define MPROTECT_SYSCALL_NO(tsk) ((test_tsk_thread_flag((tsk), TIF_IA32)) \
? __MPROTECT_SYSCALL_NO_IA32 \
: __MPROTECT_SYSCALL_NO_X86_64)
@@ -51,13 +59,17 @@
#if defined(__powerpc__)
#define MMAP_SYSCALL_NO(tsk) 90
+/* MMAP2 only exists on a 32-bit kernel. On a 64-bit kernel, we'll
+ * never see mmap2 (but that's OK). */
+#define MMAP2_SYSCALL_NO(tsk) 192
#define MPROTECT_SYSCALL_NO(tsk) 125
#define MUNMAP_SYSCALL_NO(tsk) 91
#define MREMAP_SYSCALL_NO(tsk) 163
#endif
-#if !defined(MMAP_SYSCALL_NO) || !defined(MPROTECT_SYSCALL_NO) \
- || !defined(MUNMAP_SYSCALL_NO) || !defined(MREMAP_SYSCALL_NO)
+#if !defined(MMAP_SYSCALL_NO) || !defined(MMAP2_SYSCALL_NO) \
+ || !defined(MPROTECT_SYSCALL_NO) || !defined(MUNMAP_SYSCALL_NO) \
+ || !defined(MREMAP_SYSCALL_NO)
#error "Unimplemented architecture"
#endif
diff --git a/runtime/task_finder.c b/runtime/task_finder.c
index d7450a41..b483cf23 100644
--- a/runtime/task_finder.c
+++ b/runtime/task_finder.c
@@ -717,6 +717,7 @@ __stp_utrace_task_finder_target_syscall_entry(struct utrace_attached_engine *eng
// FIXME: do we need to handle mremap()?
syscall_no = __stp_user_syscall_nr(regs);
if (syscall_no != MMAP_SYSCALL_NO(tsk)
+ && syscall_no != MMAP2_SYSCALL_NO(tsk)
&& syscall_no != MPROTECT_SYSCALL_NO(tsk)
&& syscall_no != MUNMAP_SYSCALL_NO(tsk))
return UTRACE_ACTION_RESUME;
@@ -815,6 +816,7 @@ __stp_utrace_task_finder_target_syscall_exit(struct utrace_attached_engine *engi
// FIXME: do we need to handle mremap()?
syscall_no = __stp_user_syscall_nr(regs);
if (syscall_no != MMAP_SYSCALL_NO(tsk)
+ && syscall_no != MMAP2_SYSCALL_NO(tsk)
&& syscall_no != MPROTECT_SYSCALL_NO(tsk)
&& syscall_no != MUNMAP_SYSCALL_NO(tsk))
return UTRACE_ACTION_RESUME;
@@ -841,10 +843,11 @@ __stp_utrace_task_finder_target_syscall_exit(struct utrace_attached_engine *engi
"tsk %d found %s(0x%lx), returned 0x%lx\n",
tsk->pid,
((syscall_no == MMAP_SYSCALL_NO(tsk)) ? "mmap"
- : ((syscall_no == MPROTECT_SYSCALL_NO(tsk)) ? "mprotect"
- : ((syscall_no == MUNMAP_SYSCALL_NO(tsk)) ? "munmap"
- : "UNKNOWN"))),
- arg0, rv);
+ : ((syscall_no == MMAP2_SYSCALL_NO(tsk)) ? "mmap2"
+ : ((syscall_no == MPROTECT_SYSCALL_NO(tsk)) ? "mprotect"
+ : ((syscall_no == MUNMAP_SYSCALL_NO(tsk)) ? "munmap"
+ : "UNKNOWN"))),
+ arg0, rv);
#endif
// Try to find the vma info we might have saved.