diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/ChangeLog | 10 | ||||
-rw-r--r-- | runtime/syscall.h | 48 | ||||
-rw-r--r-- | runtime/task_finder.c | 12 | ||||
-rw-r--r-- | runtime/transport/ChangeLog | 10 | ||||
-rw-r--r-- | runtime/transport/symbols.c | 4 |
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 ®s->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 ®s->gpr[3]; + case 1: return ®s->gpr[4]; + case 2: return ®s->gpr[5]; + case 3: return ®s->gpr[6]; + case 4: return ®s->gpr[7]; + case 5: return ®s->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; |