From b84f3753b06258c02b768beb586bba3213890fff Mon Sep 17 00:00:00 2001 From: David Smith Date: Mon, 23 Jun 2008 16:49:40 -0500 Subject: Fixed offset argument to vm_callback. 2008-06-23 David Smith * 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. --- runtime/ChangeLog | 5 +++++ runtime/task_finder.c | 12 ++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'runtime') diff --git a/runtime/ChangeLog b/runtime/ChangeLog index fb92dccc..1ad5aa20 100644 --- a/runtime/ChangeLog +++ b/runtime/ChangeLog @@ -1,5 +1,10 @@ 2008-06-23 David Smith + * 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/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); -- cgit From ae95b1546c45578e0ab56c1842050cd731ec0508 Mon Sep 17 00:00:00 2001 From: Wenji Huang Date: Tue, 24 Jun 2008 10:11:10 -0400 Subject: PR6646: Add checking address in runtime --- runtime/transport/ChangeLog | 5 +++++ runtime/transport/symbols.c | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) (limited to 'runtime') diff --git a/runtime/transport/ChangeLog b/runtime/transport/ChangeLog index 2ffff58c..2d2fa82f 100644 --- a/runtime/transport/ChangeLog +++ b/runtime/transport/ChangeLog @@ -1,3 +1,8 @@ + +2008-06-23 Wenji Huang + PR 6646 + * symbols.c (_stp_validate_addr): Add validating address in runtime. + 2008-06-13 Wenji Huang * control.c (_stp_ctl_write_dbug): Remove STP_UNWIND support. diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c index 4a3c4e17..c272568e 100644 --- a/runtime/transport/symbols.c +++ b/runtime/transport/symbols.c @@ -176,6 +176,24 @@ static void _stp_free_modules(void) _stp_del_module(_stp_modules[i]); } +/* validate the addr in runtime kernel*/ +static int _stp_validate_addr(char *name, unsigned long addr) +{ + + char addr_str[KSYM_SYMBOL_LEN]; + size_t len; + + sprint_symbol(addr_str, addr); + len = strlen(name); + if (strlen(addr_str) < len+1 + || strncmp(addr_str, name, len) + || addr_str[len]!='+') { + errk("Incorrect mapping 0x%lx vs %s.\n", addr, name); + return 1; + } + return 0; +} + static unsigned long _stp_kallsyms_lookup_name(const char *name); static void _stp_create_unwind_hdr(struct _stp_module *m); @@ -205,11 +223,22 @@ static int _stp_init_kernel_symbols(void) _dbug("Lookup of _stext failed. Exiting.\n"); return -1; } + + #ifdef __powerpc__ + if (_stp_validate_addr(".__start", (unsigned long)_stp_modules[0]->text)) + #else + if (_stp_validate_addr("_stext", (unsigned long)_stp_modules[0]->text)) + #endif + 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; } + if (_stp_validate_addr("_etext", (unsigned long)_stp_modules[0]->data)) + return -1; + _stp_modules[0]->text_size = _stp_modules[0]->data - _stp_modules[0]->text; _stp_modules_by_addr[0] = _stp_modules[0]; @@ -609,12 +638,15 @@ 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; } + if (_stp_validate_addr("modules_op", (unsigned long)modules_op)) + return -1; + /* Use the seq_file interface to safely get a list of installed modules */ res = modules_op->start(NULL, &pos); while (res) { -- cgit From 57286c7da57d75173149c733b00474d256af6b36 Mon Sep 17 00:00:00 2001 From: Wenji Huang Date: Tue, 24 Jun 2008 13:49:01 -0400 Subject: Remove validating _stext due to many aliased symbols --- runtime/transport/symbols.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'runtime') diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c index c272568e..dda6d9ea 100644 --- a/runtime/transport/symbols.c +++ b/runtime/transport/symbols.c @@ -224,13 +224,6 @@ static int _stp_init_kernel_symbols(void) return -1; } - #ifdef __powerpc__ - if (_stp_validate_addr(".__start", (unsigned long)_stp_modules[0]->text)) - #else - if (_stp_validate_addr("_stext", (unsigned long)_stp_modules[0]->text)) - #endif - return -1; - _stp_modules[0]->data = _stp_kallsyms_lookup_name("_etext"); if (_stp_modules[0]->data == 0) { _dbug("Lookup of _etext failed. Exiting.\n"); -- cgit From 8548f326bbbc5c99d692757618f4a7260b552de9 Mon Sep 17 00:00:00 2001 From: David Smith Date: Tue, 24 Jun 2008 08:33:51 -0500 Subject: Added powerpc support to runtime/syscall.h. 2008-06-24 David Smith From: Srinivasa DS * syscall.h: Added powerpc support. --- runtime/ChangeLog | 5 +++++ runtime/syscall.h | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 3 deletions(-) (limited to 'runtime') diff --git a/runtime/ChangeLog b/runtime/ChangeLog index 1ad5aa20..6da5814c 100644 --- a/runtime/ChangeLog +++ b/runtime/ChangeLog @@ -1,3 +1,8 @@ +2008-06-24 David Smith + + From: Srinivasa DS + * syscall.h: Added powerpc support. + 2008-06-23 David Smith * task_finder.c (__stp_utrace_task_finder_target_quiesce): Fixed 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_ */ -- cgit From 7ff47c2c671a4e8a6c80bc0af0b3c04f4e8034b5 Mon Sep 17 00:00:00 2001 From: Wenji Huang Date: Wed, 25 Jun 2008 10:43:35 -0400 Subject: Revert checking address in runtime --- runtime/transport/ChangeLog | 5 +++++ runtime/transport/symbols.c | 23 ----------------------- 2 files changed, 5 insertions(+), 23 deletions(-) (limited to 'runtime') diff --git a/runtime/transport/ChangeLog b/runtime/transport/ChangeLog index 2d2fa82f..3dd65408 100644 --- a/runtime/transport/ChangeLog +++ b/runtime/transport/ChangeLog @@ -1,4 +1,9 @@ + +2008-06-23 Wenji Huang + PR 6646 + * symbols.c (_stp_validate_addr): Revert the previous code. + 2008-06-23 Wenji Huang PR 6646 * symbols.c (_stp_validate_addr): Add validating address in runtime. diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c index dda6d9ea..9299fc67 100644 --- a/runtime/transport/symbols.c +++ b/runtime/transport/symbols.c @@ -176,24 +176,6 @@ static void _stp_free_modules(void) _stp_del_module(_stp_modules[i]); } -/* validate the addr in runtime kernel*/ -static int _stp_validate_addr(char *name, unsigned long addr) -{ - - char addr_str[KSYM_SYMBOL_LEN]; - size_t len; - - sprint_symbol(addr_str, addr); - len = strlen(name); - if (strlen(addr_str) < len+1 - || strncmp(addr_str, name, len) - || addr_str[len]!='+') { - errk("Incorrect mapping 0x%lx vs %s.\n", addr, name); - return 1; - } - return 0; -} - static unsigned long _stp_kallsyms_lookup_name(const char *name); static void _stp_create_unwind_hdr(struct _stp_module *m); @@ -229,8 +211,6 @@ static int _stp_init_kernel_symbols(void) _dbug("Lookup of _etext failed. Exiting.\n"); return -1; } - if (_stp_validate_addr("_etext", (unsigned long)_stp_modules[0]->data)) - return -1; _stp_modules[0]->text_size = _stp_modules[0]->data - _stp_modules[0]->text; _stp_modules_by_addr[0] = _stp_modules[0]; @@ -637,9 +617,6 @@ static int _stp_init_modules(void) return -1; } - if (_stp_validate_addr("modules_op", (unsigned long)modules_op)) - return -1; - /* Use the seq_file interface to safely get a list of installed modules */ res = modules_op->start(NULL, &pos); while (res) { -- cgit