diff options
author | David Smith <dsmith@redhat.com> | 2008-08-20 12:33:13 -0500 |
---|---|---|
committer | David Smith <dsmith@redhat.com> | 2008-08-20 12:33:13 -0500 |
commit | ef4042bd5adb8062c31789a9786bf558f5f11e9e (patch) | |
tree | ed2dde1e1b32da88888763da19775d3f6e763ed6 | |
parent | 930a1798154b9c1caf27009825b2b165ef577a1e (diff) | |
download | systemtap-steved-ef4042bd5adb8062c31789a9786bf558f5f11e9e.tar.gz systemtap-steved-ef4042bd5adb8062c31789a9786bf558f5f11e9e.tar.xz systemtap-steved-ef4042bd5adb8062c31789a9786bf558f5f11e9e.zip |
Looks for both mmap and mmap2.
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.
-rw-r--r-- | runtime/ChangeLog | 7 | ||||
-rw-r--r-- | runtime/syscall.h | 22 | ||||
-rw-r--r-- | runtime/task_finder.c | 11 |
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. |