diff options
| author | Michael Brown | 2017-01-25 21:59:15 +0100 |
|---|---|---|
| committer | Michael Brown | 2017-01-26 09:17:37 +0100 |
| commit | 302f1eeb80706fb10067efedb1279fa3f85ddda2 (patch) | |
| tree | 90e58309094b20a26cedc8244fabf72d96fe6135 /src/arch/x86/include/ipxe/rdtsc_timer.h | |
| parent | [cpuid] Provide cpuid_supported() to test for supported functions (diff) | |
| download | ipxe-302f1eeb80706fb10067efedb1279fa3f85ddda2.tar.gz ipxe-302f1eeb80706fb10067efedb1279fa3f85ddda2.tar.xz ipxe-302f1eeb80706fb10067efedb1279fa3f85ddda2.zip | |
[time] Allow timer to be selected at runtime
Allow the active timer (providing udelay() and currticks()) to be
selected at runtime based on probing during the INIT_EARLY stage of
initialisation.
TICKS_PER_SEC is now a fixed compile-time constant for all builds, and
is independent of the underlying clock tick rate. We choose the value
1024 to allow multiplications and divisions on seconds to be converted
to bit shifts.
TICKS_PER_MS is defined as 1, allowing multiplications and divisions
on milliseconds to be omitted entirely. The 2% inaccuracy in this
definition is negligible when using the standard BIOS timer (running
at around 18.2Hz).
TIMER_RDTSC now checks for a constant TSC before claiming to be a
usable timer. (This timer can be tested in KVM via the command-line
option "-cpu host,+invtsc".)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/x86/include/ipxe/rdtsc_timer.h')
| -rw-r--r-- | src/arch/x86/include/ipxe/rdtsc_timer.h | 39 |
1 files changed, 0 insertions, 39 deletions
diff --git a/src/arch/x86/include/ipxe/rdtsc_timer.h b/src/arch/x86/include/ipxe/rdtsc_timer.h deleted file mode 100644 index 598f4bb08..000000000 --- a/src/arch/x86/include/ipxe/rdtsc_timer.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _IPXE_RDTSC_TIMER_H -#define _IPXE_RDTSC_TIMER_H - -/** @file - * - * RDTSC timer - * - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); - -#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 */ |
