mirror of
https://github.com/google/cpu_features.git
synced 2025-04-29 16:03:36 +02:00
Add support for ZHAOXIN CPU (#218)
This commit is contained in:
parent
9edae37fc7
commit
1d02169588
@ -25,6 +25,8 @@ CPU_FEATURES_START_CPP_NAMESPACE
|
|||||||
#define CPU_FEATURES_VENDOR_GENUINE_INTEL "GenuineIntel"
|
#define CPU_FEATURES_VENDOR_GENUINE_INTEL "GenuineIntel"
|
||||||
#define CPU_FEATURES_VENDOR_AUTHENTIC_AMD "AuthenticAMD"
|
#define CPU_FEATURES_VENDOR_AUTHENTIC_AMD "AuthenticAMD"
|
||||||
#define CPU_FEATURES_VENDOR_HYGON_GENUINE "HygonGenuine"
|
#define CPU_FEATURES_VENDOR_HYGON_GENUINE "HygonGenuine"
|
||||||
|
#define CPU_FEATURES_VENDOR_CENTAUR_HAULS "CentaurHauls"
|
||||||
|
#define CPU_FEATURES_VENDOR_SHANGHAI " Shanghai "
|
||||||
|
|
||||||
// See https://en.wikipedia.org/wiki/CPUID for a list of x86 cpu features.
|
// See https://en.wikipedia.org/wiki/CPUID for a list of x86 cpu features.
|
||||||
// The field names are based on the short name provided in the wikipedia tables.
|
// The field names are based on the short name provided in the wikipedia tables.
|
||||||
@ -117,6 +119,10 @@ CacheInfo GetX86CacheInfo(void);
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
X86_UNKNOWN,
|
X86_UNKNOWN,
|
||||||
|
ZHAOXIN_ZHANGJIANG, // ZhangJiang
|
||||||
|
ZHAOXIN_WUDAOKOU, // WuDaoKou
|
||||||
|
ZHAOXIN_LUJIAZUI, // LuJiaZui
|
||||||
|
ZHAOXIN_YONGFENG, // YongFeng
|
||||||
INTEL_80486, // 80486
|
INTEL_80486, // 80486
|
||||||
INTEL_P5, // P5
|
INTEL_P5, // P5
|
||||||
INTEL_LAKEMONT, // LAKEMONT
|
INTEL_LAKEMONT, // LAKEMONT
|
||||||
|
@ -406,8 +406,11 @@ X86Info GetX86Info(void) {
|
|||||||
IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
|
IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
|
||||||
const bool is_hygon =
|
const bool is_hygon =
|
||||||
IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_HYGON_GENUINE);
|
IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_HYGON_GENUINE);
|
||||||
|
const bool is_zhaoxin =
|
||||||
|
(IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_CENTAUR_HAULS) ||
|
||||||
|
IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_SHANGHAI));
|
||||||
SetVendor(leaves.leaf_0, info.vendor);
|
SetVendor(leaves.leaf_0, info.vendor);
|
||||||
if (is_intel || is_amd || is_hygon) {
|
if (is_intel || is_amd || is_hygon || is_zhaoxin) {
|
||||||
OsPreserves os_preserves = kEmptyOsPreserves;
|
OsPreserves os_preserves = kEmptyOsPreserves;
|
||||||
ParseCpuId(&leaves, &info, &os_preserves);
|
ParseCpuId(&leaves, &info, &os_preserves);
|
||||||
if (is_amd || is_hygon) {
|
if (is_amd || is_hygon) {
|
||||||
@ -570,6 +573,42 @@ X86Microarchitecture GetX86Microarchitecture(const X86Info* info) {
|
|||||||
return X86_UNKNOWN;
|
return X86_UNKNOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_CENTAUR_HAULS)) {
|
||||||
|
switch (CPUID(info->family, info->model)) {
|
||||||
|
case CPUID(0x06, 0x0F):
|
||||||
|
case CPUID(0x06, 0x19):
|
||||||
|
// https://en.wikichip.org/wiki/zhaoxin/microarchitectures/zhangjiang
|
||||||
|
return ZHAOXIN_ZHANGJIANG;
|
||||||
|
case CPUID(0x07, 0x1B):
|
||||||
|
// https://en.wikichip.org/wiki/zhaoxin/microarchitectures/wudaokou
|
||||||
|
return ZHAOXIN_WUDAOKOU;
|
||||||
|
case CPUID(0x07, 0x3B):
|
||||||
|
// https://en.wikichip.org/wiki/zhaoxin/microarchitectures/lujiazui
|
||||||
|
return ZHAOXIN_LUJIAZUI;
|
||||||
|
case CPUID(0x07, 0x5B):
|
||||||
|
return ZHAOXIN_YONGFENG;
|
||||||
|
default:
|
||||||
|
return X86_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_SHANGHAI)) {
|
||||||
|
switch (CPUID(info->family, info->model)) {
|
||||||
|
case CPUID(0x06, 0x0F):
|
||||||
|
case CPUID(0x06, 0x19):
|
||||||
|
// https://en.wikichip.org/wiki/zhaoxin/microarchitectures/zhangjiang
|
||||||
|
return ZHAOXIN_ZHANGJIANG;
|
||||||
|
case CPUID(0x07, 0x1B):
|
||||||
|
// https://en.wikichip.org/wiki/zhaoxin/microarchitectures/wudaokou
|
||||||
|
return ZHAOXIN_WUDAOKOU;
|
||||||
|
case CPUID(0x07, 0x3B):
|
||||||
|
// https://en.wikichip.org/wiki/zhaoxin/microarchitectures/lujiazui
|
||||||
|
return ZHAOXIN_LUJIAZUI;
|
||||||
|
case CPUID(0x07, 0x5B):
|
||||||
|
return ZHAOXIN_YONGFENG;
|
||||||
|
default:
|
||||||
|
return X86_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_AUTHENTIC_AMD)) {
|
if (IsVendorByX86Info(info, CPU_FEATURES_VENDOR_AUTHENTIC_AMD)) {
|
||||||
switch (CPUID(info->family, info->model)) {
|
switch (CPUID(info->family, info->model)) {
|
||||||
// https://en.wikichip.org/wiki/amd/cpuid
|
// https://en.wikichip.org/wiki/amd/cpuid
|
||||||
@ -1623,7 +1662,9 @@ static void ParseCacheInfo(const int max_cpuid_leaf, uint32_t leaf_id,
|
|||||||
CacheInfo GetX86CacheInfo(void) {
|
CacheInfo GetX86CacheInfo(void) {
|
||||||
CacheInfo info = kEmptyCacheInfo;
|
CacheInfo info = kEmptyCacheInfo;
|
||||||
const Leaves leaves = ReadLeaves();
|
const Leaves leaves = ReadLeaves();
|
||||||
if (IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_GENUINE_INTEL)) {
|
if (IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_GENUINE_INTEL) ||
|
||||||
|
IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_CENTAUR_HAULS) ||
|
||||||
|
IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_SHANGHAI)) {
|
||||||
ParseLeaf2(&leaves, &info);
|
ParseLeaf2(&leaves, &info);
|
||||||
ParseCacheInfo(leaves.max_cpuid_leaf, 4, &info);
|
ParseCacheInfo(leaves.max_cpuid_leaf, 4, &info);
|
||||||
} else if (IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_AUTHENTIC_AMD) ||
|
} else if (IsVendor(leaves.leaf_0, CPU_FEATURES_VENDOR_AUTHENTIC_AMD) ||
|
||||||
@ -1709,6 +1750,10 @@ CacheInfo GetX86CacheInfo(void) {
|
|||||||
|
|
||||||
#define X86_MICROARCHITECTURE_NAMES \
|
#define X86_MICROARCHITECTURE_NAMES \
|
||||||
LINE(X86_UNKNOWN) \
|
LINE(X86_UNKNOWN) \
|
||||||
|
LINE(ZHAOXIN_ZHANGJIANG) \
|
||||||
|
LINE(ZHAOXIN_WUDAOKOU) \
|
||||||
|
LINE(ZHAOXIN_LUJIAZUI) \
|
||||||
|
LINE(ZHAOXIN_YONGFENG) \
|
||||||
LINE(INTEL_80486) \
|
LINE(INTEL_80486) \
|
||||||
LINE(INTEL_P5) \
|
LINE(INTEL_P5) \
|
||||||
LINE(INTEL_LAKEMONT) \
|
LINE(INTEL_LAKEMONT) \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user