Re: LTTng for ST40 kernel 2.6.23.1

Mathieu Desnoyers <[email protected]> Wed, 31 Oct 2007 08:26:09 -0400
Newsgroups gmane.linux.kernel.tracing
Message-ID <20071031122609.GA24878@Krystal>
* Giuseppe Cavallaro ([email protected]) wrote:
> I've also reviewed the ltt-instrumentation-sh.patch (attached) in order to
> fix the format mismatch for probe kernel_trap_entry.
> 

Hrm, you seem to have missed some :
kernel_trap_entry -> kernel_arch_trap_entry conversions (same for exit)
in your attached patch. Will fix in my tree.

Thanks for spotting this.

Mathieu

> On 31/10/2007, Giuseppe Cavallaro <[email protected]> wrote:
> >
> > Mathieu,
> > I've seen the TSC within ltt-heartbeat.c has been removed.
> > So the build fails because the ltt_heartbeat_read_synthetic_tsc (used in
> > the asm/ltt.h:ltt_get_timestamp64) is undefined.
> > Is it voluntary or we need to restore missing functions?
> > I guess the same issue ought to be for mips as well.
> > If I well remember, we need to use Synthetic TSC in order to detect 32
> > bits counter overflows and extend it to a 64 bits counter.
> > Let me know,
> > Thanks,
> > Giuseppe
> >
> > On 30/10/2007, Mathieu Desnoyers <[email protected]> wrote:
> > >
> > > * Giuseppe Cavallaro ([email protected]) wrote:
> > > > Hi Mathieu,
> > > > I've applied LTTng  (0.10.0-pre7) against the STLinux kernel
> > > > 2.6.23.1<http://2.6.23.1>(for SH4 architecture).
> > > > I've had to add the ltt_add_timestamp function (patch attached) in
> > > order to
> > > > build kernel/timer.c.
> > > > I'm going to start testing LTTng on my target... so I'll let you know!
> > >
> > > >
> > >
> > > Forget about my last email.. all this is already in the LTTng patchset,
> > > except ltt_add_timestamp, as you explained.
> > >
> > > Thanks,
> > >
> > > Mathieu
> > >
> > > > Regards,
> > > >   Giuseppe
> > >
> > > > This patch adds the timestamping mechanism in the ltt.h arch header
> > > file.
> > > > The new timestamp functions use the TMU channel 1.
> > > >
> > > > This code only works if the TMU channel 1 is initialized during the
> > > kernel boot
> > > >
> > > > From: Giuseppe Cavallaro < [email protected]>
> > > > Signed-off-by: Giuseppe Cavallaro <[email protected]>
> > > > Signed-off-by: Mathieu Desnoyers < [email protected]>
> > > >
> > > > --- /dev/null 2007-10-24 15:55:45.303163180 +0200
> > > > +++ linux-2.6.23.1/include/asm-sh/ltt.h       2007-10-29 22:54:
> > > 22.000000000 +0100
> > > > @@ -0,0 +1,48 @@
> > > > +/*
> > > > + * Copyright (C) 2007, Giuseppe Cavallaro <[email protected]>
> > > > + *                     Mathieu Desnoyers <
> > > [email protected]>
> > > > + *
> > > > + * SuperH definitions for tracing system
> > > > + */
> > > > +
> > > > +#ifndef _ASM_SH_LTT_H
> > > > +#define _ASM_SH_LTT_H
> > > > +
> > > > +#include <linux/ltt-core.h>
> > > > +#include <asm/timer.h>
> > > > +#include <asm/clock.h>
> > > > +
> > > > +#define LTT_HAS_TSC
> > > > +
> > > > +u64 ltt_heartbeat_read_synthetic_tsc(void);
> > > > +
> > > > +static inline u32 ltt_get_timestamp32(void)
> > > > +{
> > > > +     return get_cycles();
> > > > +}
> > > > +
> > > > +static inline u64 ltt_get_timestamp64(void)
> > > > +{
> > > > +     return ltt_heartbeat_read_synthetic_tsc();
> > > > +}
> > > > +
> > > > +static inline void ltt_add_timestamp(unsigned long ticks)
> > > > +{ }
> > > > +
> > > > +static inline unsigned int ltt_frequency(void)
> > > > +{
> > > > +     unsigned long rate;
> > > > +     struct clk *tmu1_clk;
> > > > +
> > > > +     tmu1_clk = clk_get(NULL, "tmu1_clk");
> > > > +     rate = (clk_get_rate(tmu1_clk));
> > > > +
> > > > +     return (unsigned int)(rate);
> > > > +}
> > > > +
> > > > +static inline u32 ltt_freq_scale(void)
> > > > +{
> > > > +     return 1;
> > > > +}
> > > > +
> > > > +#endif /* _ASM_SH_LTT_H */
> > > > --- linux-2.6.23.1/include/asm-sh/timex.h.orig        2007-10-29
> > > 22:53:50.000000000 +0100
> > > > +++ linux-2.6.23.1/include/asm-sh/timex.h     2007-10-29 22:54:
> > > 14.000000000 +0100
> > > > @@ -5,13 +5,20 @@
> > > >   */
> > > >  #ifndef __ASM_SH_TIMEX_H
> > > >  #define __ASM_SH_TIMEX_H
> > > > +#ifdef CONFIG_LTT
> > > > +#include <asm/cpu/timer.h>
> > > > +#include <asm/io.h>
> > > > +#endif
> > > >
> > > > -#define CLOCK_TICK_RATE              (CONFIG_SH_PCLK_FREQ / 4) /*
> > > Underlying HZ */
> > > > +#define CLOCK_TICK_RATE              (HZ * 100000UL)
> > > >
> > > >  typedef unsigned long long cycles_t;
> > > >
> > > >  static __inline__ cycles_t get_cycles (void)
> > > >  {
> > > > +#ifdef CONFIG_LTT
> > > > +     return (0xffffffff - ctrl_inl(TMU1_TCNT));
> > > > +#endif
> > > >       return 0;
> > > >  }
> > > >
> > >
> > > > _______________________________________________
> > > > Ltt-dev mailing list
> > > > [email protected]
> > > > http://listserv.shafik.org/mailman/listinfo/ltt-dev
> > >
> > >
> > > --
> > > Mathieu Desnoyers
> > > Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
> > > OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE
> > > 9A68
> > >
> >
> >

> ---
>  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, 40 insertions(+), 7 deletions(-)
> 
> Index: linux-2.6-lttng/arch/sh/kernel/entry-common.S
> ===================================================================
> --- linux-2.6-lttng.orig/arch/sh/kernel/entry-common.S	2007-10-11 14:46:08.000000000 -0400
> +++ linux-2.6-lttng/arch/sh/kernel/entry-common.S	2007-10-11 15:02:15.000000000 -0400
> @@ -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-10-11 14:46:08.000000000 -0400
> +++ linux-2.6-lttng/arch/sh/kernel/process.c	2007-10-11 15:02:32.000000000 -0400
> @@ -171,6 +171,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));
> @@ -183,6 +184,10 @@ int kernel_thread(int (*fn)(void *), voi
>  	/* Ok, create the new process.. */
>  	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0,
>  		       &regs, 0, NULL, NULL);
> +	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-10-11 14:46:08.000000000 -0400
> +++ linux-2.6-lttng/arch/sh/kernel/sys_sh.c	2007-10-11 15:03:15.000000000 -0400
> @@ -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-10-11 14:46:08.000000000 -0400
> +++ linux-2.6-lttng/arch/sh/kernel/traps.c	2007-10-11 15:03:42.000000000 -0400
> @@ -544,6 +544,9 @@ asmlinkage void do_address_error(struct 
>  	lookup_exception_vector(error_code);
>  #endif
>  
> +	trace_mark(kernel_trap_entry, "trap_id %ld ip #p%ld",
> +		(error_code >> 5), instruction_pointer(regs));
> +
>  	oldfs = get_fs();
>  
>  	if (user_mode(regs)) {
> @@ -570,8 +573,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_trap_exit, MARK_NOARGS);
> + 			return; /* sorted */
> +		}
>  #endif
>  
>  uspace_segv:
> @@ -607,6 +612,7 @@ uspace_segv:
>  		force_sig(SIGSEGV, current);
>  #endif
>  	}
> +	trace_mark(kernel_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-10-11 14:46:08.000000000 -0400
> +++ linux-2.6-lttng/arch/sh/mm/fault.c	2007-10-11 15:04:52.000000000 -0400
> @@ -81,6 +81,14 @@ asmlinkage void __kprobes do_page_fault(
>  		return;
>  	}
>  
> +	trace_mark(kernel_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..
> @@ -133,6 +141,7 @@ survive:
>  		tsk->min_flt++;
>  
>  	up_read(&mm->mmap_sem);
> +	trace_mark(kernel_trap_exit, MARK_NOARGS);
>  	return;
>  
>  /*
> @@ -149,6 +158,7 @@ bad_area_nosemaphore:
>  		info.si_code = si_code;
>  		info.si_addr = (void *) address;
>  		force_sig_info(SIGSEGV, &info, tsk);
> +		trace_mark(kernel_trap_exit, MARK_NOARGS);
>  		return;
>  	}
>  
> @@ -228,6 +238,8 @@ do_sigbus:
>  	/* Kernel mode? Handle exceptions or die */
>  	if (!user_mode(regs))
>  		goto no_context;
> +
> +	trace_mark(kernel_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-10-11 14:46:08.000000000 -0400
> +++ linux-2.6-lttng/arch/sh/kernel/ptrace.c	2007-10-11 15:02:56.000000000 -0400
> @@ -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