summaryrefslogtreecommitdiffstats
path: root/tapset/LKET
diff options
context:
space:
mode:
Diffstat (limited to 'tapset/LKET')
-rw-r--r--tapset/LKET/Changelog16
-rwxr-xr-xtapset/LKET/hookid_defs.stp22
-rwxr-xr-xtapset/LKET/lket_trace.stp88
-rwxr-xr-xtapset/LKET/register_event.stp4
-rwxr-xr-xtapset/LKET/timestamp.stp67
5 files changed, 183 insertions, 14 deletions
diff --git a/tapset/LKET/Changelog b/tapset/LKET/Changelog
index 8f146973..e569bce5 100644
--- a/tapset/LKET/Changelog
+++ b/tapset/LKET/Changelog
@@ -1,3 +1,19 @@
+2006-08-29 Li Guanglei <guanglei@cn.ibm.com>
+
+ From Gui Jian <guijian@cn.ibm.com>
+
+ New tapset to add another two kinds of timing methods,
+ i.e, get_cycles() and sched_clock().
+
+ * hookid_defs.stp: add CPUFREQ related definitions add
+ lket_init_time/lket_kill_time to register/unregister
+ cpufreq notifier
+ * lket_trace.stp: print timing_method and cpufreq in
+ lket_init_header; use different timing methods in _lket_trace
+ * register_event.stp: register HOOKID_SWITCH_CPUFREQ event
+ * timestamp.stp: definitions of timing method related
+ functions and variables
+
2006-08-25 Li Guanglei <guanglei@cn.ibm.com>
* syscall.stp: add "probe never" to generate
diff --git a/tapset/LKET/hookid_defs.stp b/tapset/LKET/hookid_defs.stp
index efcf6489..d3c09db7 100755
--- a/tapset/LKET/hookid_defs.stp
+++ b/tapset/LKET/hookid_defs.stp
@@ -130,8 +130,13 @@ global
HOOKID_SIGNAL_PROC_MASK_ENTRY,
HOOKID_SIGNAL_PROC_MASK_RETURN,
- HOOKID_SIGNAL_FLUSH_ENTRY
-
+ HOOKID_SIGNAL_FLUSH_ENTRY,
+
+ /* CPU Frequency */
+ GROUP_CPUFREQ,
+
+ HOOKID_SWITCH_CPUFREQ
+
%{
/* used in embedded c codes */
@@ -147,6 +152,7 @@ int _GROUP_NETDEV = 8;
int _GROUP_IOSYSCALL = 9;
int _GROUP_AIO = 10;
int _GROUP_SIGNAL = 11;
+int _GROUP_CPUFREQ = 15;
/* hookIDs defined inside each group */
int _HOOKID_REGSYSEVT = 1;
@@ -253,6 +259,8 @@ int _HOOKID_SIGNAL_PROC_MASK_ENTRY = 13;
int _HOOKID_SIGNAL_PROC_MASK_RETURN = 14;
int _HOOKID_SIGNAL_FLUSH_ENTRY = 15;
+int _HOOKID_SWITCH_CPUFREQ = 1;
+
%}
function hookid_init()
@@ -379,6 +387,10 @@ function hookid_init()
HOOKID_SIGNAL_PROC_MASK_ENTRY = 13
HOOKID_SIGNAL_PROC_MASK_RETURN = 14
HOOKID_SIGNAL_FLUSH_ENTRY = 15
+
+ GROUP_CPUFREQ = 15
+
+ HOOKID_SWITCH_CPUFREQ = 2
}
@@ -386,7 +398,13 @@ probe begin
{
hookid_init()
lket_trace_init()
+ lket_init_time()
register_sys_events()
write_events_desc()
process_snapshot()
}
+
+probe end
+{
+ lket_kill_time()
+}
diff --git a/tapset/LKET/lket_trace.stp b/tapset/LKET/lket_trace.stp
index 59a08ec0..5764892a 100755
--- a/tapset/LKET/lket_trace.stp
+++ b/tapset/LKET/lket_trace.stp
@@ -6,6 +6,8 @@
// later version.
%{
+#include <linux/cpufreq.h>
+
#if defined(ASCII_TRACE)
#ifndef _FMT_
#define _FMT_ unsigned int
@@ -15,6 +17,28 @@
#define _FMT_ int64_t
#endif
#endif
+
+#ifndef TIMING_GETCYCLES
+#define TIMING_GETCYCLES 0x01
+#endif
+#ifndef TIMING_GETTIMEOFDAY
+#define TIMING_GETTIMEOFDAY 0x02
+#endif
+#ifndef TIMING_SCHEDCLOCK
+#define TIMING_SCHEDCLOCK 0x03
+#endif
+
+extern int _GROUP_CPUFREQ;
+extern int _HOOKID_SWITCH_CPUFREQ;
+
+extern long timing_method;
+
+#ifndef _PFN_SCHEDCLOCK_TYPE
+#define _PFN_SCHEDCLOCK_TYPE
+typedef unsigned long long (* pfn_schedclock_type)(void);
+#endif
+
+extern pfn_schedclock_type pfn_schedclock;
%}
function lket_trace_header_init()
@@ -30,12 +54,12 @@ function lket_trace_header_init()
#define BIG_ENDIAN 0x02
#define BITS_WIDTH 64 /* 32-bit or 64-bit environment*/
- _stp_printf("%4b%2n%1b%1b%1b%1b", (_FMT_)MAGIC_NUMBER,
+ _stp_printf("%4b%2n%1b%1b%1b%1b%1b%4b", (_FMT_)MAGIC_NUMBER,
(_FMT_)LKET_TRACE_VER_MAJOR, (_FMT_)LKET_TRACE_VER_MINOR,
- (_FMT_)BIG_ENDIAN, (_FMT_)BITS_WIDTH);
+ (_FMT_)BIG_ENDIAN, (_FMT_)timing_method,
+ (_FMT_)BITS_WIDTH, (_FMT_)__stp_estimate_cpufreq());
_stp_print_flush();
#endif
-
%}
function lket_trace_init()
@@ -124,19 +148,38 @@ static inline int this_event_len(void)
/* we use 2 bytes to store the length. */
#define _lket_trace(GroupID, hookID, fmt, args...) do { \
- struct timeval tv; \
- do_gettimeofday (&tv); \
- _stp_printf("%2b%2n%8b%8b"fmt, (_FMT_)0, \
- (_FMT_)(tv.tv_sec*1000000LL + tv.tv_usec),\
- (_FMT_)((int64_t)current->pid << 32 | (int32_t)GroupID << 24 |\
- (int32_t)hookID << 16 | (int16_t)current->thread_info->cpu << 8), args);\
+ if(timing_method == TIMING_GETCYCLES) { \
+ _stp_printf("%2b%2n%8b%8b"fmt, (_FMT_)0, \
+ (_FMT_)get_cycles(), \
+ (_FMT_)((int64_t)current->pid << 32 | \
+ (int32_t)GroupID << 24 | (int32_t)hookID << 16 | \
+ (int16_t)current->thread_info->cpu << 8), \
+ args); \
+ } \
+ else if(timing_method == TIMING_GETTIMEOFDAY) { \
+ struct timeval tv; \
+ do_gettimeofday (&tv); \
+ _stp_printf("%2b%2n%8b%8b"fmt, (_FMT_)0, \
+ (_FMT_)(tv.tv_sec*1000000LL + tv.tv_usec), \
+ (_FMT_)((int64_t)current->pid << 32 | \
+ (int32_t)GroupID << 24 | (int32_t)hookID << 16 | \
+ (int16_t)current->thread_info->cpu << 8), \
+ args); \
+ } \
+ else { \
+ _stp_printf("%2b%2n%8b%8b"fmt, (_FMT_)0, \
+ (_FMT_)pfn_schedclock(), \
+ (_FMT_)((int64_t)current->pid << 32 | \
+ (int32_t)GroupID << 24 | (int32_t)hookID << 16 | \
+ (int16_t)current->thread_info->cpu << 8), \
+ args); \
+ } \
} while(0)
-
#endif
+
#endif
%}
-
function update_record()
%{
#if !defined(ASCII_TRACE)
@@ -145,3 +188,26 @@ function update_record()
*(int16_t *)total_length = _stp_pbuf_len[cpu] - 4;
#endif
%}
+
+%{
+#ifdef CONFIG_CPU_FREQ
+static int __lket_time_cpufreq_callback(struct notifier_block *self,
+ unsigned long state, void *vfreqs)
+{
+ int cpu;
+ unsigned long flags;
+ struct cpufreq_freqs *freqs;
+ unsigned int freq_mhz;
+ stp_time_t *time;
+
+ switch (state) {
+ case CPUFREQ_POSTCHANGE:
+ case CPUFREQ_RESUMECHANGE:
+ _lket_trace(_GROUP_CPUFREQ, _HOOKID_SWITCH_CPUFREQ,
+ "%8b", __stp_estimate_cpufreq());
+ break;
+ }
+ return NOTIFY_OK;
+}
+#endif
+%}
diff --git a/tapset/LKET/register_event.stp b/tapset/LKET/register_event.stp
index 322be40b..e743c2ca 100755
--- a/tapset/LKET/register_event.stp
+++ b/tapset/LKET/register_event.stp
@@ -317,7 +317,9 @@ function register_sys_events()
register_sys_event(GROUP_SIGNAL, HOOKID_SIGNAL_FLUSH_ENTRY,
"INT32", "pid")
-
+
+ register_sys_event(GROUP_CPUFREQ, HOOKID_SWITCH_CPUFREQ,
+ "INT64", "cpufreq")
}
diff --git a/tapset/LKET/timestamp.stp b/tapset/LKET/timestamp.stp
new file mode 100755
index 00000000..471177a9
--- /dev/null
+++ b/tapset/LKET/timestamp.stp
@@ -0,0 +1,67 @@
+%{
+#ifndef TIMING_GETCYCLES
+#define TIMING_GETCYCLES 0x01
+#endif
+#ifndef TIMING_GETTIMEOFDAY
+#define TIMING_GETTIMEOFDAY 0x02
+#endif
+#ifndef TIMING_SCHEDCLOCK
+#define TIMING_SCHEDCLOCK 0x03
+#endif
+
+#define MAX_TIMING_METHOD TIMING_SCHEDCLOCK
+
+long timing_method = TIMING_GETTIMEOFDAY;
+
+#ifndef _PFN_SCHEDCLOCK_TYPE
+#define _PFN_SCHEDCLOCK_TYPE
+typedef unsigned long long (* pfn_schedclock_type)(void);
+#endif
+
+pfn_schedclock_type pfn_schedclock = NULL;
+%}
+
+%{
+#ifdef CONFIG_CPU_FREQ
+static int __lket_time_cpufreq_callback(struct notifier_block *self,
+ unsigned long state, void *vfreqs);
+
+struct notifier_block __lket_time_notifier = {
+ .notifier_call = __lket_time_cpufreq_callback,
+};
+
+#endif
+%}
+
+function set_timing_method(method:long)
+%{
+ if(THIS->method == TIMING_SCHEDCLOCK) {
+ pfn_schedclock = (pfn_schedclock_type)kallsyms_lookup_name("sched_clock");
+ if(!pfn_schedclock) {
+ _stp_warn("Failed to lookup specified timing method sched_clock()\n");
+ return;
+ }
+ }
+ if(THIS->method > 0 && THIS->method <= MAX_TIMING_METHOD)
+ timing_method = THIS->method;
+%}
+
+function lket_init_time:long()
+%{
+ int ret = 0;
+#ifdef CONFIG_CPU_FREQ
+ if(timing_method == TIMING_GETCYCLES)
+ ret = cpufreq_register_notifier(&__lket_time_notifier,
+ CPUFREQ_TRANSITION_NOTIFIER);
+#endif
+ THIS->__retvalue = ret;
+%}
+
+function lket_kill_time()
+%{
+#ifdef CONFIG_CPU_FREQ
+ if(timing_method == TIMING_GETCYCLES)
+ cpufreq_unregister_notifier(&__lket_time_notifier,
+ CPUFREQ_TRANSITION_NOTIFIER);
+#endif
+%}