Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/x86/identcpu.c
Show First 20 Lines • Show All 217 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
static struct { | static struct { | ||||
char *vendor; | char *vendor; | ||||
u_int vendor_id; | u_int vendor_id; | ||||
} cpu_vendors[] = { | } cpu_vendors[] = { | ||||
{ INTEL_VENDOR_ID, CPU_VENDOR_INTEL }, /* GenuineIntel */ | { INTEL_VENDOR_ID, CPU_VENDOR_INTEL }, /* GenuineIntel */ | ||||
{ AMD_VENDOR_ID, CPU_VENDOR_AMD }, /* AuthenticAMD */ | { AMD_VENDOR_ID, CPU_VENDOR_AMD }, /* AuthenticAMD */ | ||||
{ HYGON_VENDOR_ID, CPU_VENDOR_HYGON }, /* HygonGenuine*/ | |||||
{ CENTAUR_VENDOR_ID, CPU_VENDOR_CENTAUR }, /* CentaurHauls */ | { CENTAUR_VENDOR_ID, CPU_VENDOR_CENTAUR }, /* CentaurHauls */ | ||||
#ifdef __i386__ | #ifdef __i386__ | ||||
{ NSC_VENDOR_ID, CPU_VENDOR_NSC }, /* Geode by NSC */ | { NSC_VENDOR_ID, CPU_VENDOR_NSC }, /* Geode by NSC */ | ||||
{ CYRIX_VENDOR_ID, CPU_VENDOR_CYRIX }, /* CyrixInstead */ | { CYRIX_VENDOR_ID, CPU_VENDOR_CYRIX }, /* CyrixInstead */ | ||||
{ TRANSMETA_VENDOR_ID, CPU_VENDOR_TRANSMETA }, /* GenuineTMx86 */ | { TRANSMETA_VENDOR_ID, CPU_VENDOR_TRANSMETA }, /* GenuineTMx86 */ | ||||
{ SIS_VENDOR_ID, CPU_VENDOR_SIS }, /* SiS SiS SiS */ | { SIS_VENDOR_ID, CPU_VENDOR_SIS }, /* SiS SiS SiS */ | ||||
{ UMC_VENDOR_ID, CPU_VENDOR_UMC }, /* UMC UMC UMC */ | { UMC_VENDOR_ID, CPU_VENDOR_UMC }, /* UMC UMC UMC */ | ||||
{ NEXGEN_VENDOR_ID, CPU_VENDOR_NEXGEN }, /* NexGenDriven */ | { NEXGEN_VENDOR_ID, CPU_VENDOR_NEXGEN }, /* NexGenDriven */ | ||||
▲ Show 20 Lines • Show All 443 Lines • ▼ Show 20 Lines | case 0x540: | ||||
cpu = CPU_GEODE1100; | cpu = CPU_GEODE1100; | ||||
break; | break; | ||||
default: | default: | ||||
strcpy(cpu_model, "Geode/NSC unknown"); | strcpy(cpu_model, "Geode/NSC unknown"); | ||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
#endif | #endif | ||||
case CPU_VENDOR_HYGON: | |||||
strcpy(cpu_model, "Hygon "); | |||||
#ifdef __i386__ | |||||
strcat(cpu_model, "Unknown"); | |||||
#else | |||||
if ((cpu_id & 0xf00) == 0xf00) | |||||
strcat(cpu_model, "AMD64 Processor"); | |||||
else | |||||
strcat(cpu_model, "Unknown"); | |||||
#endif | |||||
break; | |||||
default: | default: | ||||
strcat(cpu_model, "Unknown"); | strcat(cpu_model, "Unknown"); | ||||
break; | break; | ||||
} | } | ||||
/* | /* | ||||
* Replace cpu_model with cpu_brand minus leading spaces if | * Replace cpu_model with cpu_brand minus leading spaces if | ||||
* we have one. | * we have one. | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | #endif | ||||
printf("-class CPU)\n"); | printf("-class CPU)\n"); | ||||
if (*cpu_vendor) | if (*cpu_vendor) | ||||
printf(" Origin=\"%s\"", cpu_vendor); | printf(" Origin=\"%s\"", cpu_vendor); | ||||
if (cpu_id) | if (cpu_id) | ||||
printf(" Id=0x%x", cpu_id); | printf(" Id=0x%x", cpu_id); | ||||
if (cpu_vendor_id == CPU_VENDOR_INTEL || | if (cpu_vendor_id == CPU_VENDOR_INTEL || | ||||
cpu_vendor_id == CPU_VENDOR_AMD || | cpu_vendor_id == CPU_VENDOR_AMD || | ||||
cpu_vendor_id == CPU_VENDOR_HYGON || | |||||
cpu_vendor_id == CPU_VENDOR_CENTAUR || | cpu_vendor_id == CPU_VENDOR_CENTAUR || | ||||
#ifdef __i386__ | #ifdef __i386__ | ||||
cpu_vendor_id == CPU_VENDOR_TRANSMETA || | cpu_vendor_id == CPU_VENDOR_TRANSMETA || | ||||
cpu_vendor_id == CPU_VENDOR_RISE || | cpu_vendor_id == CPU_VENDOR_RISE || | ||||
cpu_vendor_id == CPU_VENDOR_NSC || | cpu_vendor_id == CPU_VENDOR_NSC || | ||||
(cpu_vendor_id == CPU_VENDOR_CYRIX && ((cpu_id & 0xf00) > 0x500)) || | (cpu_vendor_id == CPU_VENDOR_CYRIX && ((cpu_id & 0xf00) > 0x500)) || | ||||
#endif | #endif | ||||
0) { | 0) { | ||||
▲ Show 20 Lines • Show All 338 Lines • ▼ Show 20 Lines | if (cpu_high > 0) { | ||||
if (cpu_feature2 & CPUID2_VMX) | if (cpu_feature2 & CPUID2_VMX) | ||||
print_vmx_info(); | print_vmx_info(); | ||||
if (amd_feature2 & AMDID2_SVM) | if (amd_feature2 & AMDID2_SVM) | ||||
print_svm_info(); | print_svm_info(); | ||||
if ((cpu_feature & CPUID_HTT) && | if ((cpu_feature & CPUID_HTT) && | ||||
cpu_vendor_id == CPU_VENDOR_AMD) | (cpu_vendor_id == CPU_VENDOR_AMD || | ||||
cpu_vendor_id == CPU_VENDOR_HYGON)) | |||||
cpu_feature &= ~CPUID_HTT; | cpu_feature &= ~CPUID_HTT; | ||||
/* | /* | ||||
* If this CPU supports P-state invariant TSC then | * If this CPU supports P-state invariant TSC then | ||||
* mention the capability. | * mention the capability. | ||||
*/ | */ | ||||
if (tsc_is_invariant) { | if (tsc_is_invariant) { | ||||
printf("\n TSC: P-state invariant"); | printf("\n TSC: P-state invariant"); | ||||
Show All 13 Lines | |||||
#endif | #endif | ||||
} | } | ||||
/* Avoid ugly blank lines: only print newline when we have to. */ | /* Avoid ugly blank lines: only print newline when we have to. */ | ||||
if (*cpu_vendor || cpu_id) | if (*cpu_vendor || cpu_id) | ||||
printf("\n"); | printf("\n"); | ||||
if (bootverbose) { | if (bootverbose) { | ||||
if (cpu_vendor_id == CPU_VENDOR_AMD) | if (cpu_vendor_id == CPU_VENDOR_AMD || | ||||
cpu_vendor_id == CPU_VENDOR_HYGON) | |||||
print_AMD_info(); | print_AMD_info(); | ||||
else if (cpu_vendor_id == CPU_VENDOR_INTEL) | else if (cpu_vendor_id == CPU_VENDOR_INTEL) | ||||
print_INTEL_info(); | print_INTEL_info(); | ||||
#ifdef __i386__ | #ifdef __i386__ | ||||
else if (cpu_vendor_id == CPU_VENDOR_TRANSMETA) | else if (cpu_vendor_id == CPU_VENDOR_TRANSMETA) | ||||
print_transmeta_info(); | print_transmeta_info(); | ||||
#endif | #endif | ||||
} | } | ||||
▲ Show 20 Lines • Show All 489 Lines • ▼ Show 20 Lines | #endif | ||||
} | } | ||||
identify_cpu2(); | identify_cpu2(); | ||||
#ifdef __i386__ | #ifdef __i386__ | ||||
if (cpu_high > 0 && | if (cpu_high > 0 && | ||||
(cpu_vendor_id == CPU_VENDOR_INTEL || | (cpu_vendor_id == CPU_VENDOR_INTEL || | ||||
cpu_vendor_id == CPU_VENDOR_AMD || | cpu_vendor_id == CPU_VENDOR_AMD || | ||||
cpu_vendor_id == CPU_VENDOR_HYGON || | |||||
cpu_vendor_id == CPU_VENDOR_TRANSMETA || | cpu_vendor_id == CPU_VENDOR_TRANSMETA || | ||||
cpu_vendor_id == CPU_VENDOR_CENTAUR || | cpu_vendor_id == CPU_VENDOR_CENTAUR || | ||||
cpu_vendor_id == CPU_VENDOR_NSC)) { | cpu_vendor_id == CPU_VENDOR_NSC)) { | ||||
do_cpuid(0x80000000, regs); | do_cpuid(0x80000000, regs); | ||||
if (regs[0] >= 0x80000000) | if (regs[0] >= 0x80000000) | ||||
cpu_exthigh = regs[0]; | cpu_exthigh = regs[0]; | ||||
} | } | ||||
#else | #else | ||||
if (cpu_vendor_id == CPU_VENDOR_INTEL || | if (cpu_vendor_id == CPU_VENDOR_INTEL || | ||||
cpu_vendor_id == CPU_VENDOR_AMD || | cpu_vendor_id == CPU_VENDOR_AMD || | ||||
cpu_vendor_id == CPU_VENDOR_HYGON || | |||||
cpu_vendor_id == CPU_VENDOR_CENTAUR) { | cpu_vendor_id == CPU_VENDOR_CENTAUR) { | ||||
do_cpuid(0x80000000, regs); | do_cpuid(0x80000000, regs); | ||||
cpu_exthigh = regs[0]; | cpu_exthigh = regs[0]; | ||||
} | } | ||||
#endif | #endif | ||||
if (cpu_exthigh >= 0x80000001) { | if (cpu_exthigh >= 0x80000001) { | ||||
do_cpuid(0x80000001, regs); | do_cpuid(0x80000001, regs); | ||||
amd_feature = regs[3] & ~(cpu_feature & 0x0183f3ff); | amd_feature = regs[3] & ~(cpu_feature & 0x0183f3ff); | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | #ifdef __i386__ | ||||
} | } | ||||
#endif | #endif | ||||
} | } | ||||
int | int | ||||
pti_get_default(void) | pti_get_default(void) | ||||
{ | { | ||||
if (strcmp(cpu_vendor, AMD_VENDOR_ID) == 0) | if (strcmp(cpu_vendor, AMD_VENDOR_ID) == 0 || | ||||
strcmp(cpu_vendor, HYGON_VENDOR_ID) == 0) | |||||
return (0); | return (0); | ||||
if ((cpu_ia32_arch_caps & IA32_ARCH_CAP_RDCL_NO) != 0) | if ((cpu_ia32_arch_caps & IA32_ARCH_CAP_RDCL_NO) != 0) | ||||
return (0); | return (0); | ||||
return (1); | return (1); | ||||
} | } | ||||
static u_int | static u_int | ||||
find_cpu_vendor_id(void) | find_cpu_vendor_id(void) | ||||
▲ Show 20 Lines • Show All 880 Lines • Show Last 20 Lines |