summaryrefslogtreecommitdiffstats
path: root/tapset/LKET/timestamp.stp
blob: 471177a93ea194a26e175549019abd5968ee7d59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
%}