[timer] Formalise the timer API
[people/asdlkf/gpxe.git] / src / arch / i386 / include / gpxe / rdtsc_timer.h
1 #ifndef _GPXE_RDTSC_TIMER_H
2 #define _GPXE_RDTSC_TIMER_H
3
4 /** @file
5  *
6  * RDTSC timer
7  *
8  */
9
10 #ifdef TIMER_RDTSC
11 #define TIMER_PREFIX_rdtsc
12 #else
13 #define TIMER_PREFIX_rdtsc __rdtsc_
14 #endif
15
16 /**
17  * RDTSC values can easily overflow an unsigned long.  We discard the
18  * low-order bits in order to obtain sensibly-scaled values.
19  */
20 #define TSC_SHIFT 8
21
22 /**
23  * Get current system time in ticks
24  *
25  * @ret ticks           Current time, in ticks
26  */
27 static inline __always_inline unsigned long
28 TIMER_INLINE ( rdtsc, currticks ) ( void ) {
29         unsigned long ticks;
30
31         __asm__ __volatile__ ( "rdtsc\n\t"
32                                "shrdl %1, %%edx, %%eax\n\t"
33                                : "=a" ( ticks ) : "i" ( TSC_SHIFT ) : "edx" );
34         return ticks;
35 }
36
37 #endif /* _GPXE_RDTSC_TIMER_H */