//! 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(" ")); }