blob: 42fc6003d02aa641ecb95349d2d54cf114e39cb1 [file] [log] [blame] [edit]
//! An example that displays the type/features/configuration of the CPU.
//!
//! This example only compiles on x86 platforms.
extern crate raw_cpuid;
fn main() {
let cpuid = raw_cpuid::CpuId::new();
println!(
"Vendor is: {}",
cpuid
.get_vendor_info()
.as_ref()
.map_or_else(|| "unknown", |vf| vf.as_str(),)
);
println!(
"CPU Model is: {}",
cpuid
.get_processor_brand_string()
.as_ref()
.map_or_else(|| "n/a", |pbs| pbs.as_str())
);
println!(
"APIC ID is: {}",
cpuid.get_feature_info().as_ref().map_or_else(
|| String::from("n/a"),
|finfo| format!("{}", finfo.initial_local_apic_id()),
)
);
// 10.12.8.1 Consistency of APIC IDs and CPUID: "Initial APIC ID (CPUID.01H:EBX[31:24]) is always equal to CPUID.0BH:EDX[7:0]."
println!(
"x2APIC ID is: {}",
cpuid.get_extended_topology_info().map_or_else(
|| String::from("n/a"),
|mut topiter| format!("{}", topiter.next().as_ref().unwrap().x2apic_id()),
)
);
cpuid.get_feature_info().as_ref().map_or_else(
|| println!("Family: n/a\nExtended Family: n/a\nModel: n/a\nExtended Model: n/a\nStepping: n/a\nBrand Index: n/a"),
|finfo| {
println!(
"Base Family: {}\nExtended Family: {}\nFamily: {}\nBase Model: {}\nExtended Model: {}\nModel: {}\nStepping: {}\nBrand Index: {}",
finfo.base_family_id(),
finfo.extended_family_id(),
finfo.family_id(),
finfo.base_model_id(),
finfo.extended_model_id(),
finfo.model_id(),
finfo.stepping_id(),
finfo.brand_index(),
);
},
);
println!(
"Serial# is: {}",
cpuid.get_processor_serial().as_ref().map_or_else(
|| String::from("n/a"),
|serial_info| format!("{}", serial_info.serial())
)
);
let mut features = Vec::with_capacity(80);
cpuid.get_feature_info().map(|finfo| {
if finfo.has_sse3() {
features.push("sse3")
}
if finfo.has_pclmulqdq() {
features.push("pclmulqdq")
}
if finfo.has_ds_area() {
features.push("ds_area")
}
if finfo.has_monitor_mwait() {
features.push("monitor_mwait")
}
if finfo.has_cpl() {
features.push("cpl")
}
if finfo.has_vmx() {
features.push("vmx")
}
if finfo.has_smx() {
features.push("smx")
}
if finfo.has_eist() {
features.push("eist")
}
if finfo.has_tm2() {
features.push("tm2")
}
if finfo.has_ssse3() {
features.push("ssse3")
}
if finfo.has_cnxtid() {
features.push("cnxtid")
}
if finfo.has_fma() {
features.push("fma")
}
if finfo.has_cmpxchg16b() {
features.push("cmpxchg16b")
}
if finfo.has_pdcm() {
features.push("pdcm")
}
if finfo.has_pcid() {
features.push("pcid")
}
if finfo.has_dca() {
features.push("dca")
}
if finfo.has_sse41() {
features.push("sse41")
}
if finfo.has_sse42() {
features.push("sse42")
}
if finfo.has_x2apic() {
features.push("x2apic")
}
if finfo.has_movbe() {
features.push("movbe")
}
if finfo.has_popcnt() {
features.push("popcnt")
}
if finfo.has_tsc_deadline() {
features.push("tsc_deadline")
}
if finfo.has_aesni() {
features.push("aesni")
}
if finfo.has_xsave() {
features.push("xsave")
}
if finfo.has_oxsave() {
features.push("oxsave")
}
if finfo.has_avx() {
features.push("avx")
}
if finfo.has_f16c() {
features.push("f16c")
}
if finfo.has_rdrand() {
features.push("rdrand")
}
if finfo.has_fpu() {
features.push("fpu")
}
if finfo.has_vme() {
features.push("vme")
}
if finfo.has_de() {
features.push("de")
}
if finfo.has_pse() {
features.push("pse")
}
if finfo.has_tsc() {
features.push("tsc")
}
if finfo.has_msr() {
features.push("msr")
}
if finfo.has_pae() {
features.push("pae")
}
if finfo.has_mce() {
features.push("mce")
}
if finfo.has_cmpxchg8b() {
features.push("cmpxchg8b")
}
if finfo.has_apic() {
features.push("apic")
}
if finfo.has_sysenter_sysexit() {
features.push("sysenter_sysexit")
}
if finfo.has_mtrr() {
features.push("mtrr")
}
if finfo.has_pge() {
features.push("pge")
}
if finfo.has_mca() {
features.push("mca")
}
if finfo.has_cmov() {
features.push("cmov")
}
if finfo.has_pat() {
features.push("pat")
}
if finfo.has_pse36() {
features.push("pse36")
}
if finfo.has_psn() {
features.push("psn")
}
if finfo.has_clflush() {
features.push("clflush")
}
if finfo.has_ds() {
features.push("ds")
}
if finfo.has_acpi() {
features.push("acpi")
}
if finfo.has_mmx() {
features.push("mmx")
}
if finfo.has_fxsave_fxstor() {
features.push("fxsave_fxstor")
}
if finfo.has_sse() {
features.push("sse")
}
if finfo.has_sse2() {
features.push("sse2")
}
if finfo.has_ss() {
features.push("ss")
}
if finfo.has_htt() {
features.push("htt")
}
if finfo.has_tm() {
features.push("tm")
}
if finfo.has_pbe() {
features.push("pbe")
}
});
cpuid.get_extended_feature_info().map(|finfo| {
if finfo.has_bmi1() {
features.push("bmi1")
}
if finfo.has_hle() {
features.push("hle")
}
if finfo.has_avx2() {
features.push("avx2")
}
if finfo.has_fdp() {
features.push("fdp")
}
if finfo.has_smep() {
features.push("smep")
}
if finfo.has_bmi2() {
features.push("bmi2")
}
if finfo.has_rep_movsb_stosb() {
features.push("rep_movsb_stosb")
}
if finfo.has_invpcid() {
features.push("invpcid")
}
if finfo.has_rtm() {
features.push("rtm")
}
if finfo.has_rdtm() {
features.push("rdtm")
}
if finfo.has_fpu_cs_ds_deprecated() {
features.push("fpu_cs_ds_deprecated")
}
if finfo.has_mpx() {
features.push("mpx")
}
if finfo.has_rdta() {
features.push("rdta")
}
if finfo.has_rdseed() {
features.push("rdseed")
}
if finfo.has_adx() {
features.push("adx")
}
if finfo.has_smap() {
features.push("smap")
}
if finfo.has_clflushopt() {
features.push("clflushopt")
}
if finfo.has_processor_trace() {
features.push("processor_trace")
}
if finfo.has_sha() {
features.push("sha")
}
if finfo.has_sgx() {
features.push("sgx")
}
if finfo.has_avx512f() {
features.push("avx512f")
}
if finfo.has_avx512dq() {
features.push("avx512dq")
}
if finfo.has_avx512_ifma() {
features.push("avx512_ifma")
}
if finfo.has_avx512pf() {
features.push("avx512pf")
}
if finfo.has_avx512er() {
features.push("avx512er")
}
if finfo.has_avx512cd() {
features.push("avx512cd")
}
if finfo.has_avx512bw() {
features.push("avx512bw")
}
if finfo.has_avx512vl() {
features.push("avx512vl")
}
if finfo.has_clwb() {
features.push("clwb")
}
if finfo.has_prefetchwt1() {
features.push("prefetchwt1")
}
if finfo.has_umip() {
features.push("umip")
}
if finfo.has_pku() {
features.push("pku")
}
if finfo.has_ospke() {
features.push("ospke")
}
if finfo.has_rdpid() {
features.push("rdpid")
}
if finfo.has_sgx_lc() {
features.push("sgx_lc")
}
});
println!("CPU Features: {}", features.join(" "));
}