diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/itrace.c | 30 | ||||
-rw-r--r-- | runtime/loc2c-runtime.h | 23 | ||||
-rw-r--r-- | runtime/stack-ia64.c | 3 | ||||
-rw-r--r-- | runtime/stack-ppc.c | 18 | ||||
-rw-r--r-- | runtime/task_finder.c | 95 | ||||
-rw-r--r-- | runtime/uprobes2/uprobes.c | 35 |
6 files changed, 192 insertions, 12 deletions
diff --git a/runtime/itrace.c b/runtime/itrace.c index 5b2437a4..399bfde0 100644 --- a/runtime/itrace.c +++ b/runtime/itrace.c @@ -84,11 +84,17 @@ static struct itrace_info *create_itrace_info( static u32 usr_itrace_report_quiesce(struct utrace_attached_engine *engine, struct task_struct *tsk) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 usr_itrace_report_quiesce(u32 action, + struct utrace_attached_engine *engine, + unsigned long event) +#else static u32 usr_itrace_report_quiesce(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, unsigned long event) #endif +#endif { int status; struct itrace_info *ui; @@ -113,6 +119,14 @@ static u32 usr_itrace_report_signal( const struct k_sigaction *orig_ka, struct k_sigaction *return_ka) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 usr_itrace_report_signal(u32 action, + struct utrace_attached_engine *engine, + struct pt_regs *regs, + siginfo_t *info, + const struct k_sigaction *orig_ka, + struct k_sigaction *return_ka) +#else static u32 usr_itrace_report_signal(u32 action, struct utrace_attached_engine *engine, struct task_struct *tsk, @@ -121,7 +135,11 @@ static u32 usr_itrace_report_signal(u32 action, const struct k_sigaction *orig_ka, struct k_sigaction *return_ka) #endif +#endif { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *tsk = current; +#endif struct itrace_info *ui; u32 return_flags; unsigned long data = 0; @@ -177,11 +195,18 @@ static u32 usr_itrace_report_clone( unsigned long clone_flags, struct task_struct *child) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 usr_itrace_report_clone(u32 action, + struct utrace_attached_engine *engine, + unsigned long clone_flags, + struct task_struct *child) +#else static u32 usr_itrace_report_clone(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *parent, unsigned long clone_flags, struct task_struct *child) #endif +#endif { return UTRACE_RESUME; } @@ -190,9 +215,14 @@ static u32 usr_itrace_report_clone(enum utrace_resume_action action, static u32 usr_itrace_report_death(struct utrace_attached_engine *e, struct task_struct *tsk) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 usr_itrace_report_death(struct utrace_attached_engine *e, + bool group_dead, int signal) +#else static u32 usr_itrace_report_death(struct utrace_attached_engine *e, struct task_struct *tsk, bool group_dead, int signal) #endif +#endif { struct itrace_info *ui = rcu_dereference(e->data); WARN_ON(!ui); diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index de59f0e5..c75639ee 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -103,7 +103,11 @@ struct usr_regset_lut { unsigned pos; }; -/* DWARF register number -to- user_regset offset/bank mapping table. */ + +/* DWARF register number -to- user_regset bank/offset mapping table. + The register numbers come from the processor-specific ELF documents. + The user-regset bank/offset values come from kernel $ARCH/include/asm/user*.h + or $ARCH/kernel/ptrace.c. */ static const struct usr_regset_lut url_i386[] = { { "ax", NT_PRSTATUS, 6*4 }, { "cx", NT_PRSTATUS, 1*4 }, @@ -111,8 +115,9 @@ static const struct usr_regset_lut url_i386[] = { { "bx", NT_PRSTATUS, 0*4 }, { "sp", NT_PRSTATUS, 15*4 }, { "bp", NT_PRSTATUS, 5*4 }, - { "di", NT_PRSTATUS, 4*4 }, { "si", NT_PRSTATUS, 3*4 }, + { "di", NT_PRSTATUS, 4*4 }, + { "ip", NT_PRSTATUS, 12*4 }, }; static const struct usr_regset_lut url_x86_64[] = { @@ -132,6 +137,11 @@ static const struct usr_regset_lut url_x86_64[] = { { "r13", NT_PRSTATUS, 2*8 }, { "r14", NT_PRSTATUS, 1*8 }, { "r15", NT_PRSTATUS, 0*8 }, + { "rip", NT_PRSTATUS, 16*8 }, + /* XXX: SSE registers %xmm0-%xmm7 */ + /* XXX: SSE2 registers %xmm8-%xmm15 */ + /* XXX: FP registers %st0-%st7 */ + /* XXX: MMX registers %mm0-%mm7 */ }; /* XXX: insert other architectures here. */ @@ -277,16 +287,15 @@ static void ursl_store64 (const struct usr_regset_lut* lut,unsigned lutsize, in } -#define S(array) sizeof(array)/sizeof(array[0]) #if defined (__i386__) -#define u_fetch_register(regno) ursl_fetch32(url_i386, S(url_i386), EM_386, regno) -#define u_store_register(regno,value) ursl_store32(url_i386, S(url_i386), EM_386, regno, value) +#define u_fetch_register(regno) ursl_fetch32(url_i386, ARRAY_SIZE(url_i386), EM_386, regno) +#define u_store_register(regno,value) ursl_store32(url_i386, ARRAY_SIZE(url_i386), EM_386, regno, value) #elif defined (__x86_64__) -#define u_fetch_register(regno) (_stp_probing_32bit_app(c->regs) ? ursl_fetch32(url_i386, S(url_i386), EM_386, regno) : ursl_fetch64(url_x86_64, S(url_x86_64), EM_X86_64, regno)) -#define u_store_register(regno,value) (_stp_probing_32bit_app(c->regs) ? ursl_store2(url_i386, S(url_i386), EM_386, regno, value) : ursl_store64(url_x86_64, S(url_x86_64), EM_X86_64, regno, value)) +#define u_fetch_register(regno) (_stp_probing_32bit_app(c->regs) ? ursl_fetch32(url_i386, ARRAY_SIZE(url_i386), EM_386, regno) : ursl_fetch64(url_x86_64, ARRAY_SIZE(url_x86_64), EM_X86_64, regno)) +#define u_store_register(regno,value) (_stp_probing_32bit_app(c->regs) ? ursl_store2(url_i386, ARRAY_SIZE(url_i386), EM_386, regno, value) : ursl_store64(url_x86_64, ARRAY_SIZE(url_x86_64), EM_X86_64, regno, value)) #else diff --git a/runtime/stack-ia64.c b/runtime/stack-ia64.c index a04355fa..c416d14d 100644 --- a/runtime/stack-ia64.c +++ b/runtime/stack-ia64.c @@ -49,7 +49,8 @@ static void __stp_show_stack_addr(struct unw_frame_info *info, void *arg) } static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels, - struct task_struct *tsk) + struct task_struct *tsk, + struct uretprobe_instance *ri) { unsigned long *stack = (unsigned long *)®_SP(regs); struct dump_para para; diff --git a/runtime/stack-ppc.c b/runtime/stack-ppc.c index 9670d06f..a9ff26ac 100644 --- a/runtime/stack-ppc.c +++ b/runtime/stack-ppc.c @@ -21,6 +21,24 @@ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels, return; _sp = (unsigned long *) sp; newsp = _sp[0]; +#ifndef STACK_FRAME_LR_SAVE /* from arch/powerpc/include/asm/ptrace.h */ +#ifdef __powerpc64__ +#define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ +#define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ +#define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265) +#define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD + 288) +#define STACK_FRAME_MARKER 12 +#define __SIGNAL_FRAMESIZE 128 +#define __SIGNAL_FRAMESIZE32 64 +#else /* __powerpc64__ */ +#define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ +#define STACK_FRAME_LR_SAVE 1 /* Location of LR in stack frame */ +#define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773) +#define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD) +#define STACK_FRAME_MARKER 2 +#define __SIGNAL_FRAMESIZE 64 +#endif +#endif ip = _sp[STACK_FRAME_LR_SAVE]; if (!firstframe || ip != lr) { if (verbose) { diff --git a/runtime/task_finder.c b/runtime/task_finder.c index e89ac8ee..deccfa76 100644 --- a/runtime/task_finder.c +++ b/runtime/task_finder.c @@ -107,23 +107,36 @@ static u32 __stp_utrace_task_finder_target_death(struct utrace_attached_engine *engine, struct task_struct *tsk); #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_death(struct utrace_attached_engine *engine, + bool group_dead, int signal); +#else static u32 __stp_utrace_task_finder_target_death(struct utrace_attached_engine *engine, struct task_struct *tsk, bool group_dead, int signal); #endif +#endif #ifdef UTRACE_ORIG_VERSION static u32 __stp_utrace_task_finder_target_quiesce(struct utrace_attached_engine *engine, struct task_struct *tsk); #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_quiesce(u32 action, + struct utrace_attached_engine *engine, + unsigned long event); +#else static u32 __stp_utrace_task_finder_target_quiesce(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, unsigned long event); #endif +#endif #ifdef UTRACE_ORIG_VERSION static u32 @@ -131,12 +144,19 @@ __stp_utrace_task_finder_target_syscall_entry(struct utrace_attached_engine *eng struct task_struct *tsk, struct pt_regs *regs); #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_syscall_entry(u32 action, + struct utrace_attached_engine *engine, + struct pt_regs *regs); +#else static u32 __stp_utrace_task_finder_target_syscall_entry(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, struct pt_regs *regs); #endif +#endif #ifdef UTRACE_ORIG_VERSION static u32 @@ -144,12 +164,19 @@ __stp_utrace_task_finder_target_syscall_exit(struct utrace_attached_engine *engi struct task_struct *tsk, struct pt_regs *regs); #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_syscall_exit(u32 action, + struct utrace_attached_engine *engine, + struct pt_regs *regs); +#else static u32 __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, struct pt_regs *regs); #endif +#endif static int stap_register_task_finder_target(struct stap_task_finder_target *new_tgt) @@ -857,6 +884,13 @@ __stp_utrace_task_finder_report_clone(struct utrace_attached_engine *engine, unsigned long clone_flags, struct task_struct *child) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_report_clone(u32 action, + struct utrace_attached_engine *engine, + unsigned long clone_flags, + struct task_struct *child) +#else static u32 __stp_utrace_task_finder_report_clone(enum utrace_resume_action action, struct utrace_attached_engine *engine, @@ -864,7 +898,11 @@ __stp_utrace_task_finder_report_clone(enum utrace_resume_action action, unsigned long clone_flags, struct task_struct *child) #endif +#endif { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *parent = current; +#endif int rc; struct mm_struct *mm; char *mmpath_buf; @@ -898,6 +936,14 @@ __stp_utrace_task_finder_report_exec(struct utrace_attached_engine *engine, const struct linux_binprm *bprm, struct pt_regs *regs) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_report_exec(u32 action, + struct utrace_attached_engine *engine, + const struct linux_binfmt *fmt, + const struct linux_binprm *bprm, + struct pt_regs *regs) +#else static u32 __stp_utrace_task_finder_report_exec(enum utrace_resume_action action, struct utrace_attached_engine *engine, @@ -906,7 +952,11 @@ __stp_utrace_task_finder_report_exec(enum utrace_resume_action action, const struct linux_binprm *bprm, struct pt_regs *regs) #endif +#endif { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *tsk = current; +#endif size_t filelen; struct list_head *tgt_node; struct stap_task_finder_target *tgt; @@ -949,11 +999,17 @@ static u32 stap_utrace_task_finder_report_death(struct utrace_attached_engine *engine, struct task_struct *tsk) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +stap_utrace_task_finder_report_death(struct utrace_attached_engine *engine, + bool group_dead, int signal) +#else static u32 stap_utrace_task_finder_report_death(struct utrace_attached_engine *engine, struct task_struct *tsk, bool group_dead, int signal) #endif +#endif { debug_task_finder_detach(); return UTRACE_DETACH; @@ -964,12 +1020,21 @@ static u32 __stp_utrace_task_finder_target_death(struct utrace_attached_engine *engine, struct task_struct *tsk) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_death(struct utrace_attached_engine *engine, + bool group_dead, int signal) +#else static u32 __stp_utrace_task_finder_target_death(struct utrace_attached_engine *engine, struct task_struct *tsk, bool group_dead, int signal) #endif +#endif { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *tsk = current; +#endif struct stap_task_finder_target *tgt = engine->data; if (atomic_read(&__stp_task_finder_state) != __STP_TF_RUNNING) { @@ -1132,13 +1197,23 @@ static u32 __stp_utrace_task_finder_target_quiesce(struct utrace_attached_engine *engine, struct task_struct *tsk) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_quiesce(u32 action, + struct utrace_attached_engine *engine, + unsigned long event) +#else static u32 __stp_utrace_task_finder_target_quiesce(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, unsigned long event) #endif +#endif { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *tsk = current; +#endif struct stap_task_finder_target *tgt = engine->data; int rc; @@ -1201,13 +1276,23 @@ __stp_utrace_task_finder_target_syscall_entry(struct utrace_attached_engine *eng struct task_struct *tsk, struct pt_regs *regs) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_syscall_entry(u32 action, + struct utrace_attached_engine *engine, + struct pt_regs *regs) +#else static u32 __stp_utrace_task_finder_target_syscall_entry(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, struct pt_regs *regs) #endif +#endif { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *tsk = current; +#endif struct stap_task_finder_target *tgt = engine->data; long syscall_no; unsigned long args[3] = { 0L }; @@ -1271,13 +1356,23 @@ __stp_utrace_task_finder_target_syscall_exit(struct utrace_attached_engine *engi struct task_struct *tsk, struct pt_regs *regs) #else +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) +static u32 +__stp_utrace_task_finder_target_syscall_exit(u32 action, + struct utrace_attached_engine *engine, + struct pt_regs *regs) +#else static u32 __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, struct pt_regs *regs) #endif +#endif { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *tsk = current; +#endif struct stap_task_finder_target *tgt = engine->data; unsigned long rv; struct __stp_tf_map_entry *entry; diff --git a/runtime/uprobes2/uprobes.c b/runtime/uprobes2/uprobes.c index 4c3a9c9c..02941e26 100644 --- a/runtime/uprobes2/uprobes.c +++ b/runtime/uprobes2/uprobes.c @@ -1881,7 +1881,9 @@ static void uprobe_inject_delayed_signals(struct list_head *delayed_signals) */ static u32 uprobe_report_signal(u32 action, struct utrace_attached_engine *engine, +#if !(defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216)) struct task_struct *tsk, +#endif struct pt_regs *regs, siginfo_t *info, const struct k_sigaction *orig_ka, @@ -2129,9 +2131,15 @@ static int utask_quiesce_pending_sigtrap(struct uprobe_task *utask) * insertions or removals pending. If we're the last thread in this * process to quiesce, do the insertion(s) and/or removal(s). */ -static u32 uprobe_report_quiesce(enum utrace_resume_action action, +static u32 uprobe_report_quiesce( +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + u32 action, + struct utrace_attached_engine *engine, +#else + enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, +#endif unsigned long event) { struct uprobe_task *utask; @@ -2140,7 +2148,9 @@ static u32 uprobe_report_quiesce(enum utrace_resume_action action, utask = (struct uprobe_task *)rcu_dereference(engine->data); BUG_ON(!utask); +#if !(defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216)) BUG_ON(tsk != current); // guaranteed by utrace 2008 +#endif if (utask->state == UPTASK_SSTEP) /* @@ -2243,8 +2253,14 @@ static void uprobe_cleanup_process(struct uprobe_process *uproc) */ static u32 uprobe_report_exit(enum utrace_resume_action action, struct utrace_attached_engine *engine, - struct task_struct *tsk, long orig_code, long *code) +#if !(defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216)) + struct task_struct *tsk, +#endif + long orig_code, long *code) { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *tsk = current; +#endif struct uprobe_task *utask; struct uprobe_process *uproc; struct uprobe_probept *ppt; @@ -2449,10 +2465,15 @@ static int uprobe_fork_uproc(struct uprobe_process *parent_uproc, */ static u32 uprobe_report_clone(enum utrace_resume_action action, struct utrace_attached_engine *engine, +#if !(defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216)) struct task_struct *parent, +#endif unsigned long clone_flags, struct task_struct *child) { +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + struct task_struct *parent = current; +#endif int len; struct uprobe_process *uproc; struct uprobe_task *ptask, *ctask; @@ -2554,9 +2575,15 @@ done: * - We have to free up uprobe resources associated with * this process. */ -static u32 uprobe_report_exec(enum utrace_resume_action action, +static u32 uprobe_report_exec( +#if defined(UTRACE_API_VERSION) && (UTRACE_API_VERSION >= 20091216) + u32 action, struct utrace_attached_engine *engine, - struct task_struct *tsk, +#else + enum utrace_resume_action action, + struct utrace_attached_engine *engine, + struct task_struct *parent, +#endif const struct linux_binfmt *fmt, const struct linux_binprm *bprm, struct pt_regs *regs) |