x86: switch kernel TSC timecounter to RDTSCP on AMD Zen CPUs

Reported by:	many
Tested by:	gallatin, mikael, rhurlin
MFC after:	1 week
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Konstantin Belousov 2021-01-21 14:53:15 +02:00
parent f7d181543f
commit 9f47eeffa3

View File

@ -633,19 +633,12 @@ init:
/* /*
* Timecounter implementation selection, top to bottom: * Timecounter implementation selection, top to bottom:
* - For AMD Zens and newer, use LFENCE;RDTSC.
* - If RDTSCP is available, use RDTSCP. * - If RDTSCP is available, use RDTSCP.
* - If fence instructions are provided (SSE2), use LFENCE;RDTSC * - If fence instructions are provided (SSE2), use LFENCE;RDTSC
* on Intel, and MFENCE;RDTSC on AMD. * on Intel, and MFENCE;RDTSC on AMD.
* - For really old CPUs, just use RDTSC. * - For really old CPUs, just use RDTSC.
*/ */
if ((cpu_vendor_id == CPU_VENDOR_AMD || if ((amd_feature & AMDID_RDTSCP) != 0) {
cpu_vendor_id == CPU_VENDOR_HYGON) &&
CPUID_TO_FAMILY(cpu_id) >= 0x17) {
tsc_timecounter.tc_get_timecount = shift > 0 ?
tsc_get_timecount_low_lfence :
tsc_get_timecount_lfence;
} else if ((amd_feature & AMDID_RDTSCP) != 0) {
tsc_timecounter.tc_get_timecount = shift > 0 ? tsc_timecounter.tc_get_timecount = shift > 0 ?
tscp_get_timecount_low : tscp_get_timecount; tscp_get_timecount_low : tscp_get_timecount;
} else if ((cpu_feature & CPUID_SSE2) != 0 && mp_ncpus > 1) { } else if ((cpu_feature & CPUID_SSE2) != 0 && mp_ncpus > 1) {