diff options
author | David Smith <dsmith@redhat.com> | 2008-06-23 14:42:03 -0500 |
---|---|---|
committer | David Smith <dsmith@redhat.com> | 2008-06-23 14:43:07 -0500 |
commit | 30fa13cdf6b8225d590642226e1255d3f574ef8a (patch) | |
tree | 2bb1c1b7f5419b12592bca1fb66a1311e1574cfc | |
parent | 86e6b319e54eb69a3c83d148f5ca8d62e041f05c (diff) | |
download | systemtap-steved-30fa13cdf6b8225d590642226e1255d3f574ef8a.tar.gz systemtap-steved-30fa13cdf6b8225d590642226e1255d3f574ef8a.tar.xz systemtap-steved-30fa13cdf6b8225d590642226e1255d3f574ef8a.zip |
Made RHEL5 changes.
2008-06-23 David Smith <dsmith@redhat.com>
* task_finder_vma.c (__stp_tf_vma_hash): Improved determination of
whether this is a 64-bit platform.
* syscall.h: Handles kernels with older style register
definitions.
-rw-r--r-- | runtime/ChangeLog | 5 | ||||
-rw-r--r-- | runtime/syscall.h | 32 | ||||
-rw-r--r-- | runtime/task_finder_vma.c | 2 |
3 files changed, 36 insertions, 3 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog index aa7058ed..9c275c0a 100644 --- a/runtime/ChangeLog +++ b/runtime/ChangeLog @@ -1,5 +1,10 @@ 2008-06-23 David Smith <dsmith@redhat.com> + * task_finder_vma.c (__stp_tf_vma_hash): Improved determination of + whether this is a 64-bit platform. + * syscall.h: Handles kernels with older style register + definitions. + * task_finder.c (__stp_tf_vm_cb): New function. (stap_register_task_finder_target): Sets up syscall entry and syscall exit handlers. diff --git a/runtime/syscall.h b/runtime/syscall.h index 3e37b550..36fed2ff 100644 --- a/runtime/syscall.h +++ b/runtime/syscall.h @@ -84,7 +84,13 @@ __stp_user_syscall_return_value(struct task_struct *task, struct pt_regs *regs) regs->ax = (long) (int) regs->ax; # endif #endif +#if defined(STAPCONF_X86_UNIREGS) return ®s->ax; +#elif defined(__x86_64__) + return ®s->rax; +#elif defined (__i386__) + return ®s->eax; +#endif } #endif @@ -93,34 +99,56 @@ static inline long * __stp_user_syscall_arg(struct task_struct *task, struct pt_regs *regs, unsigned int n) { -#if defined(CONFIG_X86_32) +#if defined(__i386__) if (n > 5) { _stp_error("syscall arg > 5"); return NULL; } +#if defined(STAPCONF_X86_UNIREGS) return ®s->bx + n; -#elif defined(CONFIG_X86_64) +#else + return ®s->ebx + n; +#endif +#elif defined(__x86_64__) #ifdef CONFIG_IA32_EMULATION if (test_tsk_thread_flag(task, TIF_IA32)) switch (n) { +#if defined(STAPCONF_X86_UNIREGS) case 0: return ®s->bx; case 1: return ®s->cx; case 2: return ®s->dx; case 3: return ®s->si; case 4: return ®s->di; case 5: return ®s->bp; +#else + case 0: return ®s->rbx; + case 1: return ®s->rcx; + case 2: return ®s->rdx; + case 3: return ®s->rsi; + case 4: return ®s->rdi; + case 5: return ®s->rbp; +#endif default: _stp_error("syscall arg > 5"); return NULL; } #endif /* CONFIG_IA32_EMULATION */ switch (n) { +#if defined(STAPCONF_X86_UNIREGS) case 0: return ®s->di; case 1: return ®s->si; case 2: return ®s->dx; case 3: return ®s->r10; case 4: return ®s->r8; case 5: return ®s->r9; +#else + case 0: return ®s->rdi; + case 1: return ®s->rsi; + case 2: return ®s->rdx; + case 3: return ®s->r10; + case 4: return ®s->r8; + case 5: return ®s->r9; +#endif default: _stp_error("syscall arg > 5"); return NULL; diff --git a/runtime/task_finder_vma.c b/runtime/task_finder_vma.c index c849f187..76b5c059 100644 --- a/runtime/task_finder_vma.c +++ b/runtime/task_finder_vma.c @@ -24,7 +24,7 @@ static struct hlist_head __stp_tf_vma_table[__STP_TF_TABLE_SIZE]; static inline u32 __stp_tf_vma_hash(struct task_struct *tsk, unsigned long addr) { -#if (__SIZEOF_LONG__ == 8) +#ifdef CONFIG_64BIT return (jhash_3words(tsk->pid, (u32)addr, (u32)(addr >> 32), 0) & (__STP_TF_TABLE_SIZE - 1)); #else |