amd64: identify small cores

Reviewed by:	alc
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D37770
This commit is contained in:
Konstantin Belousov 2022-12-21 13:04:14 +02:00
parent 89ffac3b01
commit 45ac7755a7
3 changed files with 16 additions and 1 deletions

View File

@ -255,6 +255,7 @@ initializecpu(void)
{
uint64_t msr;
uint32_t cr4;
u_int r[4];
cr4 = rcr4();
if ((cpu_feature & CPUID_XMM) && (cpu_feature & CPUID_FXSR)) {
@ -317,6 +318,14 @@ initializecpu(void)
if ((amd_feature & AMDID_RDTSCP) != 0 ||
(cpu_stdext_feature2 & CPUID_STDEXT2_RDPID) != 0)
wrmsr(MSR_TSC_AUX, cpu_auxmsr());
if (cpu_high >= 0x1a) {
cpuid_count(0x1a, 0, r);
if ((r[0] & CPUID_HYBRID_CORE_MASK) ==
CPUID_HYBRID_SMALL_CORE) {
PCPU_SET(small_core, 1);
}
}
}
void

View File

@ -99,7 +99,8 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache line");
uint32_t pc_smp_tlb_gen; \
u_int pc_smp_tlb_op; \
uint64_t pc_ucr3_load_mask; \
char __pad[2916] /* pad to UMA_PCPU_ALLOC_SIZE */
u_int pc_small_core; \
char __pad[2912] /* pad to UMA_PCPU_ALLOC_SIZE */
#define PC_DBREG_CMD_NONE 0
#define PC_DBREG_CMD_LOAD 1

View File

@ -490,6 +490,11 @@
#define CPUID_STDEXT3_CORE_CAP 0x40000000
#define CPUID_STDEXT3_SSBD 0x80000000
/* CPUID_HYBRID_ID leaf 0x1a */
#define CPUID_HYBRID_CORE_MASK 0xff000000
#define CPUID_HYBRID_SMALL_CORE 0x20000000
#define CPUID_HYBRID_LARGE_CORE 0x40000000
/* MSR IA32_ARCH_CAP(ABILITIES) bits */
#define IA32_ARCH_CAP_RDCL_NO 0x00000001
#define IA32_ARCH_CAP_IBRS_ALL 0x00000002