Use num-enum crate to make everything typesafe
This commit is contained in:
parent
1e1455688d
commit
3b2ab313de
|
@ -5022,6 +5022,7 @@ dependencies = [
|
||||||
"lru",
|
"lru",
|
||||||
"matches",
|
"matches",
|
||||||
"min-max-heap",
|
"min-max-heap",
|
||||||
|
"num_enum",
|
||||||
"rand 0.7.3",
|
"rand 0.7.3",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.2.2",
|
||||||
"raptorq",
|
"raptorq",
|
||||||
|
|
|
@ -30,6 +30,7 @@ lazy_static = "1.4.0"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
lru = "0.7.7"
|
lru = "0.7.7"
|
||||||
min-max-heap = "1.3.0"
|
min-max-heap = "1.3.0"
|
||||||
|
num_enum = "0.5.7"
|
||||||
rand = "0.7.0"
|
rand = "0.7.0"
|
||||||
rand_chacha = "0.2.2"
|
rand_chacha = "0.2.2"
|
||||||
rayon = "1.5.3"
|
rayon = "1.5.3"
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
use core::arch::x86::{CpuidResult, __cpuid, __cpuid_count, __get_cpuid_max};
|
use core::arch::x86::{CpuidResult, __cpuid, __cpuid_count, __get_cpuid_max};
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
use core::arch::x86_64::{CpuidResult, __cpuid, __cpuid_count, __get_cpuid_max};
|
use core::arch::x86_64::{CpuidResult, __cpuid, __cpuid_count, __get_cpuid_max};
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
use num_enum::{IntoPrimitive, TryFromPrimitive};
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
use std::{fs::File, io::BufReader};
|
use std::{fs::File, io::BufReader};
|
||||||
use {
|
use {
|
||||||
|
@ -104,20 +106,30 @@ struct CpuInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
#[derive(IntoPrimitive)]
|
||||||
|
#[repr(i64)]
|
||||||
enum CpuManufacturer {
|
enum CpuManufacturer {
|
||||||
Other,
|
Other,
|
||||||
Intel,
|
Intel,
|
||||||
AMD,
|
Amd,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
#[derive(TryFromPrimitive, PartialEq, PartialOrd)]
|
||||||
|
#[repr(u32)]
|
||||||
// The value passed into cpuid via eax, to control what the result means
|
// The value passed into cpuid via eax, to control what the result means
|
||||||
enum CpuidParamValue {
|
enum CpuidParamValue {
|
||||||
|
Manufacturer = 0,
|
||||||
Processor = 1,
|
Processor = 1,
|
||||||
Cache = 2,
|
Cache = 2,
|
||||||
|
SerialNumber = 3,
|
||||||
Topology = 4,
|
Topology = 4,
|
||||||
|
Unsupported = 5,
|
||||||
|
ThermalAndPower = 6,
|
||||||
Extended = 7,
|
Extended = 7,
|
||||||
}
|
}
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
const CPUID_PARAM_MAX_SUPPORTED_VALUE: u32 = 7;
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
#[cfg_attr(not(target_os = "linux"), allow(dead_code))]
|
#[cfg_attr(not(target_os = "linux"), allow(dead_code))]
|
||||||
|
@ -728,25 +740,26 @@ impl SystemMonitorService {
|
||||||
edx: 0,
|
edx: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
let max_leaf = cpuid_mfr.eax;
|
let max_leaf = match CpuidParamValue::try_from(std::cmp::min(
|
||||||
let max_subleaf_7 = if 7 <= max_leaf {
|
cpuid_mfr.eax,
|
||||||
__get_cpuid_max(7).1
|
CPUID_PARAM_MAX_SUPPORTED_VALUE,
|
||||||
} else {
|
)) {
|
||||||
0
|
Ok(val) => val,
|
||||||
|
Err(_err) => CpuidParamValue::Manufacturer,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mfr_id: i64 = if cpuid_mfr.ebx == CPUID_MANUFACTURER_EBX_INTEL
|
let mfr_id: i64 = if cpuid_mfr.ebx == CPUID_MANUFACTURER_EBX_INTEL
|
||||||
&& cpuid_mfr.edx == CPUID_MANUFACTURER_EDX_INTEL
|
&& cpuid_mfr.edx == CPUID_MANUFACTURER_EDX_INTEL
|
||||||
&& cpuid_mfr.ecx == CPUID_MANUFACTURER_ECX_INTEL
|
&& cpuid_mfr.ecx == CPUID_MANUFACTURER_ECX_INTEL
|
||||||
{
|
{
|
||||||
CpuManufacturer::Intel // GenuineIntel
|
CpuManufacturer::Intel.into() // GenuineIntel
|
||||||
} else if cpuid_mfr.ebx == CPUID_MANUFACTURER_EBX_AMD
|
} else if cpuid_mfr.ebx == CPUID_MANUFACTURER_EBX_AMD
|
||||||
&& cpuid_mfr.edx == CPUID_MANUFACTURER_EDX_AMD
|
&& cpuid_mfr.edx == CPUID_MANUFACTURER_EDX_AMD
|
||||||
&& cpuid_mfr.ecx == CPUID_MANUFACTURER_ECX_AMD
|
&& cpuid_mfr.ecx == CPUID_MANUFACTURER_ECX_AMD
|
||||||
{
|
{
|
||||||
CpuManufacturer::AMD // AuthenticAMD
|
CpuManufacturer::Amd.into() // AuthenticAMD
|
||||||
} else {
|
} else {
|
||||||
CpuManufacturer::Other // anything else
|
CpuManufacturer::Other.into() // anything else
|
||||||
};
|
};
|
||||||
|
|
||||||
let cpuid_processor = if CpuidParamValue::Processor <= max_leaf {
|
let cpuid_processor = if CpuidParamValue::Processor <= max_leaf {
|
||||||
|
@ -769,10 +782,14 @@ impl SystemMonitorService {
|
||||||
} else {
|
} else {
|
||||||
cpuid_empty
|
cpuid_empty
|
||||||
};
|
};
|
||||||
let cpuid_extended_1 = if CpuidParamValue::Extended <= max_leaf && 1 <= max_subleaf_7 {
|
let cpuid_extended_1 = if CpuidParamValue::Extended <= max_leaf {
|
||||||
|
if 1 <= __get_cpuid_max(7).1 {
|
||||||
__cpuid_count(7, 1)
|
__cpuid_count(7, 1)
|
||||||
} else {
|
} else {
|
||||||
cpuid_empty
|
cpuid_empty
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cpuid_empty
|
||||||
};
|
};
|
||||||
|
|
||||||
datapoint_info!(
|
datapoint_info!(
|
||||||
|
|
Loading…
Reference in New Issue