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:
Patrick Rudolph 2020-09-24 20:32:53 +02:00 committed by Patrick Georgi
parent 597922ecb4
commit 0348bbe971
1 changed files with 5 additions and 11 deletions

View File

@ -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);