summaryrefslogtreecommitdiff
path: root/gpxe/src/arch/i386/include/gpxe/rdtsc_timer.h
blob: 67ba22f004432ccb108d050d5fed9de0ae8ca7d9 (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
#ifndef _GPXE_RDTSC_TIMER_H
#define _GPXE_RDTSC_TIMER_H

/** @file
 *
 * RDTSC timer
 *
 */

FILE_LICENCE ( GPL2_OR_LATER );

#ifdef TIMER_RDTSC
#define TIMER_PREFIX_rdtsc
#else
#define TIMER_PREFIX_rdtsc __rdtsc_
#endif

/**
 * RDTSC values can easily overflow an unsigned long.  We discard the
 * low-order bits in order to obtain sensibly-scaled values.
 */
#define TSC_SHIFT 8

/**
 * Get current system time in ticks
 *
 * @ret ticks		Current time, in ticks
 */
static inline __always_inline unsigned long
TIMER_INLINE ( rdtsc, currticks ) ( void ) {
	unsigned long ticks;

	__asm__ __volatile__ ( "rdtsc\n\t"
			       "shrdl %1, %%edx, %%eax\n\t"
			       : "=a" ( ticks ) : "i" ( TSC_SHIFT ) : "edx" );
	return ticks;
}

#endif /* _GPXE_RDTSC_TIMER_H */