summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/ChangeLog10
-rw-r--r--runtime/syscall.h48
-rw-r--r--runtime/task_finder.c12
-rw-r--r--runtime/transport/ChangeLog10
-rw-r--r--runtime/transport/symbols.c4
5 files changed, 76 insertions, 8 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog
index fb92dccc..6da5814c 100644
--- a/runtime/ChangeLog
+++ b/runtime/ChangeLog
@@ -1,5 +1,15 @@
+2008-06-24 David Smith <dsmith@redhat.com>
+
+ From: Srinivasa DS <srinivasa@in.ibm.com>
+ * syscall.h: Added powerpc support.
+
2008-06-23 David Smith <dsmith@redhat.com>
+ * task_finder.c (__stp_utrace_task_finder_target_quiesce): Fixed
+ vm_callback offset by shifting it left PAGE_SHIFT bits.
+ (__stp_target_call_vm_callback): Ditto.
+ (__stp_utrace_task_finder_target_syscall_exit): Ditto.
+
* task_finder.c (__stp_utrace_task_finder_report_exec): Handles
relative exec paths correctly.
diff --git a/runtime/syscall.h b/runtime/syscall.h
index 36fed2ff..3d1034e6 100644
--- a/runtime/syscall.h
+++ b/runtime/syscall.h
@@ -49,6 +49,13 @@
# endif
#endif
+#if defined(__powerpc__)
+#define MMAP_SYSCALL_NO(tsk) 90
+#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)
#error "Unimplemented architecture"
@@ -59,12 +66,20 @@ static inline unsigned long
__stp_user_syscall_nr(struct pt_regs *regs)
{
#if defined(STAPCONF_X86_UNIREGS)
- return regs->orig_ax;
+ return regs->orig_ax;
#elif defined(__x86_64__)
- return regs->orig_rax;
+ return regs->orig_rax;
#elif defined (__i386__)
- return regs->orig_eax;
+ return regs->orig_eax;
+#endif
+}
#endif
+
+#if defined(__powerpc__)
+static inline unsigned long
+__stp_user_syscall_nr(struct pt_regs *regs)
+{
+ return regs->gpr[0];
}
#endif
@@ -94,6 +109,14 @@ __stp_user_syscall_return_value(struct task_struct *task, struct pt_regs *regs)
}
#endif
+#if defined(__powerpc__)
+static inline long *
+__stp_user_syscall_return_value(struct task_struct *task, struct pt_regs *regs)
+{
+ return &regs->gpr[3];
+}
+#endif
+
#if defined(__i386__) || defined(__x86_64__)
static inline long *
__stp_user_syscall_arg(struct task_struct *task, struct pt_regs *regs,
@@ -157,4 +180,23 @@ __stp_user_syscall_arg(struct task_struct *task, struct pt_regs *regs,
}
#endif
+#if defined(__powerpc__)
+static inline long *
+__stp_user_syscall_arg(struct task_struct *task, struct pt_regs *regs,
+ unsigned int n)
+{
+ switch (n) {
+ case 0: return &regs->gpr[3];
+ case 1: return &regs->gpr[4];
+ case 2: return &regs->gpr[5];
+ case 3: return &regs->gpr[6];
+ case 4: return &regs->gpr[7];
+ case 5: return &regs->gpr[8];
+ default:
+ _stp_error("syscall arg > 5");
+ return NULL;
+ }
+}
+#endif
+
#endif /* _SYSCALL_H_ */
diff --git a/runtime/task_finder.c b/runtime/task_finder.c
index 71b11569..07610864 100644
--- a/runtime/task_finder.c
+++ b/runtime/task_finder.c
@@ -586,7 +586,8 @@ __stp_utrace_task_finder_target_quiesce(struct utrace_attached_engine *engine,
rc = tgt->vm_callback(tsk, 1, mmpath,
vma->vm_start,
vma->vm_end,
- vma->vm_pgoff);
+ (vma->vm_pgoff
+ << PAGE_SHIFT));
if (rc != 0) {
_stp_error("vm callback for %d failed: %d",
(int)tsk->pid, rc);
@@ -709,7 +710,8 @@ __stp_target_call_vm_callback(struct stap_task_finder_target *tgt,
}
else {
rc = tgt->vm_callback(tsk, 1, mmpath, vma->vm_start,
- vma->vm_end, vma->vm_pgoff);
+ vma->vm_end,
+ (vma->vm_pgoff << PAGE_SHIFT));
if (rc != 0) {
_stp_error("vm callback for %d failed: %d",
(int)tsk->pid, rc);
@@ -819,7 +821,8 @@ __stp_utrace_task_finder_target_syscall_exit(struct utrace_attached_engine *engi
rc = tgt->vm_callback(tsk, 0, NULL,
entry->vm_start,
entry->vm_end,
- entry->vm_pgoff);
+ (entry->vm_pgoff
+ << PAGE_SHIFT));
if (rc != 0) {
_stp_error("vm callback for %d failed: %d",
(int)tsk->pid, rc);
@@ -852,7 +855,8 @@ __stp_utrace_task_finder_target_syscall_exit(struct utrace_attached_engine *engi
rc = tgt->vm_callback(tsk, 0, NULL,
entry->vm_start,
entry->vm_end,
- entry->vm_pgoff);
+ (entry->vm_pgoff
+ << PAGE_SHIFT));
if (rc != 0) {
_stp_error("vm callback for %d failed: %d",
(int)tsk->pid, rc);
diff --git a/runtime/transport/ChangeLog b/runtime/transport/ChangeLog
index 2e59ff90..98548afa 100644
--- a/runtime/transport/ChangeLog
+++ b/runtime/transport/ChangeLog
@@ -1,3 +1,13 @@
+
+
+2008-06-23 Wenji Huang <wenji.huang@oracle.com>
+ PR 6646
+ * symbols.c (_stp_validate_addr): Revert the previous code.
+
+2008-06-23 Wenji Huang <wenji.huang@oracle.com>
+ PR 6646
+ * symbols.c (_stp_validate_addr): Add validating address in runtime.
+
2008-06-13 Wenji Huang <wenji.huang@oracle.com>
* control.c (_stp_ctl_write_dbug): Remove STP_UNWIND support.
diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c
index 4a3c4e17..9299fc67 100644
--- a/runtime/transport/symbols.c
+++ b/runtime/transport/symbols.c
@@ -205,11 +205,13 @@ static int _stp_init_kernel_symbols(void)
_dbug("Lookup of _stext failed. Exiting.\n");
return -1;
}
+
_stp_modules[0]->data = _stp_kallsyms_lookup_name("_etext");
if (_stp_modules[0]->data == 0) {
_dbug("Lookup of _etext failed. Exiting.\n");
return -1;
}
+
_stp_modules[0]->text_size = _stp_modules[0]->data - _stp_modules[0]->text;
_stp_modules_by_addr[0] = _stp_modules[0];
@@ -609,7 +611,7 @@ static int _stp_init_modules(void)
void *res;
struct module *mod;
const struct seq_operations *modules_op = (const struct seq_operations *)_stp_kallsyms_lookup_name("modules_op");
-
+
if (modules_op == NULL) {
_dbug("Lookup of modules_op failed.\n");
return -1;