[patch-early-RFC 06/10] LTTng - instrumentation SH

From: Mathieu Desnoyers
Date: Wed Dec 05 2007 - 22:00:30 EST


Changelog:
- fix do_fork instrumentation

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxx>
---
arch/sh/kernel/entry-common.S | 10 ++++++----
arch/sh/kernel/process.c | 5 ++++-
arch/sh/kernel/ptrace.c | 8 +++++++-
arch/sh/kernel/sys_sh.c | 2 ++
arch/sh/kernel/traps.c | 10 ++++++++--
arch/sh/mm/fault.c | 12 ++++++++++++
6 files changed, 39 insertions(+), 8 deletions(-)

Index: linux-2.6-lttng/arch/sh/kernel/entry-common.S
===================================================================
--- linux-2.6-lttng.orig/arch/sh/kernel/entry-common.S 2007-11-26 13:36:40.000000000 -0500
+++ linux-2.6-lttng/arch/sh/kernel/entry-common.S 2007-11-26 13:37:12.000000000 -0500
@@ -224,7 +224,7 @@ work_resched:
syscall_exit_work:
! r0: current_thread_info->flags
! r8: current_thread_info
- tst #_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP, r0
+ tst #_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | _TIF_KERNEL_TRACE, r0
bt/s work_pending
tst #_TIF_NEED_RESCHED, r0
#ifdef CONFIG_TRACE_IRQFLAGS
@@ -233,7 +233,8 @@ syscall_exit_work:
nop
#endif
sti
- ! XXX setup arguments...
+ mov r15,r4 ! pass stacked regs as arg
+ mov #0, r5 ! trace entry [0]
mov.l 4f, r0 ! do_syscall_trace
jsr @r0
nop
@@ -243,7 +244,8 @@ syscall_exit_work:
.align 2
syscall_trace_entry:
! Yes it is traced.
- ! XXX setup arguments...
+ mov r15,r4 ! pass stacked regs as arg
+ mov #1, r5 ! trace entry [1]
mov.l 4f, r11 ! Call do_syscall_trace which notifies
jsr @r11 ! superior (will chomp R[0-7])
nop
@@ -366,7 +368,7 @@ ENTRY(system_call)
!
get_current_thread_info r8, r10
mov.l @(TI_FLAGS,r8), r8
- mov #_TIF_SYSCALL_TRACE, r10
+ mov #(_TIF_SYSCALL_TRACE | _TIF_KERNEL_TRACE), r10
tst r10, r8
bf syscall_trace_entry
!
Index: linux-2.6-lttng/arch/sh/kernel/process.c
===================================================================
--- linux-2.6-lttng.orig/arch/sh/kernel/process.c 2007-11-26 13:36:40.000000000 -0500
+++ linux-2.6-lttng/arch/sh/kernel/process.c 2007-11-28 08:29:11.000000000 -0500
@@ -172,6 +172,7 @@ __asm__(".align 5\n"
/* Don't use this in BL=1(cli). Or else, CPU resets! */
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
+ unsigned long pid;
struct pt_regs regs;

memset(&regs, 0, sizeof(regs));
@@ -182,8 +183,10 @@ int kernel_thread(int (*fn)(void *), voi
regs.sr = (1 << 30);

/* Ok, create the new process.. */
- return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0,
+ pid = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0,
&regs, 0, NULL, NULL);
+ trace_mark(kernel_arch_kthread_create, "pid %ld fn %p", pid, fn);
+ return pid;
}

/*
Index: linux-2.6-lttng/arch/sh/kernel/sys_sh.c
===================================================================
--- linux-2.6-lttng.orig/arch/sh/kernel/sys_sh.c 2007-11-26 13:36:40.000000000 -0500
+++ linux-2.6-lttng/arch/sh/kernel/sys_sh.c 2007-11-26 13:37:12.000000000 -0500
@@ -192,6 +192,8 @@ asmlinkage int sys_ipc(uint call, int fi
version = call >> 16; /* hack for backward compatibility */
call &= 0xffff;

+ trace_mark(kernel_arch_ipc_call, "call %u first %d", call, first);
+
if (call <= SEMCTL)
switch (call) {
case SEMOP:
Index: linux-2.6-lttng/arch/sh/kernel/traps.c
===================================================================
--- linux-2.6-lttng.orig/arch/sh/kernel/traps.c 2007-11-26 13:36:40.000000000 -0500
+++ linux-2.6-lttng/arch/sh/kernel/traps.c 2007-11-26 13:37:12.000000000 -0500
@@ -548,6 +548,9 @@ asmlinkage void do_address_error(struct
lookup_exception_vector(error_code);
#endif

+ trace_mark(kernel_arch_trap_entry, "trap_id %lu ip #p%ld",
+ (error_code >> 5), instruction_pointer(regs));
+
oldfs = get_fs();

if (user_mode(regs)) {
@@ -574,8 +577,10 @@ asmlinkage void do_address_error(struct
tmp = handle_unaligned_access(instruction, regs);
set_fs(oldfs);

- if (tmp==0)
- return; /* sorted */
+ if (tmp==0) {
+ trace_mark(kernel_arch_trap_exit, MARK_NOARGS);
+ return; /* sorted */
+ }
#endif

uspace_segv:
@@ -611,6 +616,7 @@ uspace_segv:
force_sig(SIGSEGV, current);
#endif
}
+ trace_mark(kernel_arch_trap_exit, MARK_NOARGS);
}

#ifdef CONFIG_SH_DSP
Index: linux-2.6-lttng/arch/sh/mm/fault.c
===================================================================
--- linux-2.6-lttng.orig/arch/sh/mm/fault.c 2007-11-26 13:36:40.000000000 -0500
+++ linux-2.6-lttng/arch/sh/mm/fault.c 2007-11-26 13:37:12.000000000 -0500
@@ -87,6 +87,14 @@ asmlinkage void __kprobes do_page_fault(
return;
}

+ trace_mark(kernel_arch_trap_entry, "trap_id %ld ip #p%ld",
+ ({
+ unsigned long trapnr;
+ asm volatile("stc r2_bank,%0": "=r" (trapnr));
+ trapnr;
+ }) >> 5,
+ instruction_pointer(regs));
+
/*
* If we're in an interrupt or have no user
* context, we must not take the fault..
@@ -139,6 +147,7 @@ survive:
tsk->min_flt++;

up_read(&mm->mmap_sem);
+ trace_mark(kernel_arch_trap_exit, MARK_NOARGS);
return;

/*
@@ -155,6 +164,7 @@ bad_area_nosemaphore:
info.si_code = si_code;
info.si_addr = (void *) address;
force_sig_info(SIGSEGV, &info, tsk);
+ trace_mark(kernel_arch_trap_exit, MARK_NOARGS);
return;
}

@@ -233,6 +243,8 @@ do_sigbus:
/* Kernel mode? Handle exceptions or die */
if (!user_mode(regs))
goto no_context;
+
+ trace_mark(kernel_arch_trap_exit, MARK_NOARGS);
}

#ifdef CONFIG_SH_STORE_QUEUES
Index: linux-2.6-lttng/arch/sh/kernel/ptrace.c
===================================================================
--- linux-2.6-lttng.orig/arch/sh/kernel/ptrace.c 2007-11-26 13:36:40.000000000 -0500
+++ linux-2.6-lttng/arch/sh/kernel/ptrace.c 2007-11-26 13:37:12.000000000 -0500
@@ -248,10 +248,16 @@ long arch_ptrace(struct task_struct *chi
return ret;
}

-asmlinkage void do_syscall_trace(void)
+asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
{
struct task_struct *tsk = current;

+ if (entryexit)
+ trace_mark(kernel_arch_syscall_entry, "syscall_id %d ip #p%ld",
+ regs->regs[3], instruction_pointer(regs));
+ else
+ trace_mark(kernel_arch_syscall_exit, MARK_NOARGS);
+
if (!test_thread_flag(TIF_SYSCALL_TRACE) &&
!test_thread_flag(TIF_SINGLESTEP))
return;

--
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/