40 lines
763 B
C
40 lines
763 B
C
#ifndef _IPXE_RDTSC_TIMER_H
|
|
#define _IPXE_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 /* _IPXE_RDTSC_TIMER_H */
|