summaryrefslogtreecommitdiffstats
path: root/runtime/task_finder.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/task_finder.c')
-rw-r--r--runtime/task_finder.c65
1 files changed, 19 insertions, 46 deletions
diff --git a/runtime/task_finder.c b/runtime/task_finder.c
index 69b6246b..fa6c296e 100644
--- a/runtime/task_finder.c
+++ b/runtime/task_finder.c
@@ -2,8 +2,9 @@
#define TASK_FINDER_C
#if ! defined(CONFIG_UTRACE)
-#error "Need CONFIG_UTRACE!"
-#endif
+/* Dummy definitions for use in sym.c */
+struct stap_task_finder_target { };
+#else
#include <linux/utrace.h>
@@ -178,7 +179,7 @@ stap_register_task_finder_target(struct stap_task_finder_target *new_tgt)
&& strcmp(tgt->pathname, new_tgt->pathname) == 0)
/* pid-based target (a specific pid or all
* pids) */
- || (new_tgt->pathlen == 0
+ || (new_tgt->pathlen == 0 && tgt->pathlen == 0
&& tgt->pid == new_tgt->pid))) {
found_node = 1;
break;
@@ -1064,11 +1065,9 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
#endif
{
struct stap_task_finder_target *tgt = engine->data;
- unsigned long syscall_no;
- unsigned long *rv_addr, rv;
- unsigned long *arg_addr, arg0;
- unsigned long arg1 = 0;
- unsigned long arg2 = 0;
+ long syscall_no;
+ unsigned long rv;
+ unsigned long args[3];
int rc;
struct mm_struct *mm;
struct vm_area_struct *vma;
@@ -1087,7 +1086,7 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
// See if syscall is one we're interested in.
//
// FIXME: do we need to handle mremap()?
- syscall_no = __stp_user_syscall_nr(regs);
+ syscall_no = syscall_get_nr(tsk, regs);
if (syscall_no != MMAP_SYSCALL_NO(tsk)
&& syscall_no != MMAP2_SYSCALL_NO(tsk)
&& syscall_no != MPROTECT_SYSCALL_NO(tsk)
@@ -1105,21 +1104,11 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
return UTRACE_RESUME;
// Get return value
- rv_addr = __stp_user_syscall_return_value(tsk, regs);
- if ((rc = __stp_get_user(rv, rv_addr)) != 0) {
- _stp_error("couldn't read syscall return value for pid %d: %d",
- tsk->pid, rc);
- return UTRACE_RESUME;
- }
+ rv = syscall_get_return_value(tsk, regs);
// We need the first syscall argument to see what address we
// were operating on.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 0);
- if ((rc = __stp_get_user(arg0, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 0 for pid %d: %d",
- tsk->pid, rc);
- return UTRACE_RESUME;
- }
+ syscall_get_arguments(tsk, regs, 0, 1, args);
#ifdef DEBUG_TASK_FINDER_VMA
_stp_dbug(__FUNCTION__, __LINE__,
@@ -1130,20 +1119,15 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
: ((syscall_no == MPROTECT_SYSCALL_NO(tsk)) ? "mprotect"
: ((syscall_no == MUNMAP_SYSCALL_NO(tsk)) ? "munmap"
: "UNKNOWN")))),
- arg0, rv);
+ args[0], rv);
#endif
__stp_tf_handler_start();
if (syscall_no == MUNMAP_SYSCALL_NO(tsk)) {
// We need the 2nd syscall argument for the length.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 1);
- if ((rc = __stp_get_user(arg1, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 1 for pid %d: %d",
- tsk->pid, rc);
- goto syscall_exit_done;
- }
+ syscall_get_arguments(tsk, regs, 1, 1, &args[1]);
// Call the callbacks
- __stp_call_munmap_callbacks(tgt, tsk, arg0, arg1);
+ __stp_call_munmap_callbacks(tgt, tsk, args[0], args[1]);
}
else if (syscall_no == MMAP_SYSCALL_NO(tsk)
|| syscall_no == MMAP2_SYSCALL_NO(tsk)) {
@@ -1164,24 +1148,13 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
}
}
else {
- // We need the 2nd syscall argument for the length.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 1);
- if ((rc = __stp_get_user(arg1, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 1 for pid %d: %d",
- tsk->pid, rc);
- goto syscall_exit_done;
- }
-
- // We need the 3nd syscall argument for the protection.
- arg_addr = __stp_user_syscall_arg(tsk, regs, 2);
- if ((rc = __stp_get_user(arg2, arg_addr)) != 0) {
- _stp_error("couldn't read syscall arg 2 for pid %d: %d",
- tsk->pid, rc);
- goto syscall_exit_done;
- }
+ // We need the 2nd syscall argument for the length and
+ // the 3rd argument for the protection.
+ syscall_get_arguments(tsk, regs, 1, 2, &args[1]);
// Call the callbacks
- __stp_call_mprotect_callbacks(tgt, tsk, arg0, arg1, arg2);
+ __stp_call_mprotect_callbacks(tgt, tsk, args[0], args[1],
+ args[2]);
}
syscall_exit_done:
@@ -1324,5 +1297,5 @@ stap_stop_task_finder(void)
debug_task_finder_report();
}
-
+#endif /* defined(CONFIG_UTRACE) */
#endif /* TASK_FINDER_C */