aboutsummaryrefslogtreecommitdiff
path: root/arch/x86/include/asm/trace-clock.h
blob: 8ca73323366c050e71de094fda90d3f66c9a3d54 (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
68
69
70
71
72
73
#ifndef _ASM_X86_TRACE_CLOCK_H
#define _ASM_X86_TRACE_CLOCK_H

/*
 * linux/arch/x86/include/asm/trace-clock.h
 *
 * Copyright (C) 2005,2006,2008
 *   Mathieu Desnoyers (mathieu.desnoyers@polymtl.ca)
 *
 * Trace clock definitions for x86.
 */

#include <linux/timex.h>
#include <linux/time.h>
#include <asm/system.h>
#include <asm/processor.h>
#include <asm/atomic.h>

/* Minimum duration of a probe, in cycles */
#define TRACE_CLOCK_MIN_PROBE_DURATION 200
#define TRACE_CLOCK_RES TRACE_CLOCK_MIN_PROBE_DURATION

union lttng_timespec {
	struct timespec ts;
	u64 lttng_ts;
};

extern cycles_t trace_clock_async_tsc_read(void);

extern int _trace_clock_is_sync;
static inline int trace_clock_is_sync(void)
{
	return _trace_clock_is_sync;
}

static inline u32 trace_clock_read32(void)
{
	u32 cycles;

	if (likely(trace_clock_is_sync()))
		cycles = (u32)get_cycles(); /* only need the 32 LSB */
	else
		cycles = (u32)trace_clock_async_tsc_read();
	return cycles;
}

static inline u64 trace_clock_read64(void)
{
	u64 cycles;

	if (likely(trace_clock_is_sync()))
		cycles = get_cycles();
	else
		cycles = trace_clock_async_tsc_read();
	return cycles;
}

static inline u64 trace_clock_frequency(void)
{
	return (u64)cpu_khz * 1000;
}

static inline u32 trace_clock_freq_scale(void)
{
	return 1;
}

extern int get_trace_clock(void);
extern void put_trace_clock(void);

extern void set_trace_clock_is_sync(int state);

#endif /* _ASM_X86_TRACE_CLOCK_H */