include/cpu/x86/tsc: Fix rdtsc on x86_64
The used assembler code only works on x86_32, but not on x86_64. Use the inline functions to provide valid rdtsc readings on both x86_32 and x86_64. Tested on Lenovo T410 with additional x86_64 patches. Change-Id: Icf706d6fb751372651e5e56d1856ddad688d9fa3 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/45702 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
This commit is contained in:
parent
597922ecb4
commit
0348bbe971
|
@ -41,22 +41,16 @@ static inline void multiply_to_tsc(tsc_t *const tsc, const u32 a, const u32 b)
|
||||||
tsc->hi = ((a >> 16) * (b >> 16)) + (tsc->hi >> 16);
|
tsc->hi = ((a >> 16) * (b >> 16)) + (tsc->hi >> 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long long rdtscll(void)
|
|
||||||
{
|
|
||||||
unsigned long long val;
|
|
||||||
asm volatile (
|
|
||||||
TSC_SYNC
|
|
||||||
"rdtsc"
|
|
||||||
: "=A" (val)
|
|
||||||
);
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint64_t tsc_to_uint64(tsc_t tstamp)
|
static inline uint64_t tsc_to_uint64(tsc_t tstamp)
|
||||||
{
|
{
|
||||||
return (((uint64_t)tstamp.hi) << 32) + tstamp.lo;
|
return (((uint64_t)tstamp.hi) << 32) + tstamp.lo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned long long rdtscll(void)
|
||||||
|
{
|
||||||
|
return tsc_to_uint64(rdtsc());
|
||||||
|
}
|
||||||
|
|
||||||
/* Provided by CPU/chipset code for the TSC rate in MHz. */
|
/* Provided by CPU/chipset code for the TSC rate in MHz. */
|
||||||
unsigned long tsc_freq_mhz(void);
|
unsigned long tsc_freq_mhz(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue