]>
git.proxmox.com Git - rustc.git/blob - src/stdsimd/stdsimd/arch/detect/os/linux/cpuinfo.rs
1 //! Parses /proc/cpuinfo
2 #![cfg_attr(not(target_arch = "arm"), allow(dead_code))]
14 /// Reads /proc/cpuinfo into CpuInfo.
15 pub fn new() -> Result
<Self, io
::Error
> {
16 let mut file
= File
::open("/proc/cpuinfo")?
;
17 let mut cpui
= Self { raw: String::new() }
;
18 file
.read_to_string(&mut cpui
.raw
)?
;
21 /// Returns the value of the cpuinfo `field`.
22 pub fn field(&self, field
: &str) -> CpuInfoField
{
23 for l
in self.raw
.lines() {
24 if l
.trim().starts_with(field
) {
25 return CpuInfoField
::new(l
.split(": ").nth(1));
31 /// Returns the `raw` contents of `/proc/cpuinfo`
33 fn raw(&self) -> &String
{
38 fn from_str(other
: &str) -> Result
<Self, ::std
::io
::Error
> {
40 raw
: String
::from(other
),
47 pub struct CpuInfoField
<'a
>(Option
<&'a
str>);
49 impl<'a
> PartialEq
<&'a
str> for CpuInfoField
<'a
> {
50 fn eq(&self, other
: &&'a
str) -> bool
{
52 None
=> other
.is_empty(),
53 Some(f
) => f
== other
.trim(),
58 impl<'a
> CpuInfoField
<'a
> {
59 pub fn new
<'b
>(v
: Option
<&'b
str>) -> CpuInfoField
<'b
> {
61 None
=> CpuInfoField
::<'b
>(None
),
62 Some(f
) => CpuInfoField
::<'b
>(Some(f
.trim())),
65 /// Does the field exist?
67 pub fn exists(&self) -> bool
{
70 /// Does the field contain `other`?
71 pub fn has(&self, other
: &str) -> bool
{
73 None
=> other
.is_empty(),
75 let other
= other
.trim();
76 for v
in f
.split(' '
) {
93 let cpuinfo
= CpuInfo
::new().unwrap();
94 if cpuinfo
.field("vendor_id") == "GenuineIntel" {
95 assert
!(cpuinfo
.field("flags").exists());
96 assert
!(!cpuinfo
.field("vendor33_id").exists());
97 assert
!(cpuinfo
.field("flags").has("sse"));
98 assert
!(!cpuinfo
.field("flags").has("avx314"));
100 println
!("{}", cpuinfo
.raw());
103 const CORE_DUO_T6500
: &str = r
"processor : 0
104 vendor_id : GenuineIntel
107 model name : Intel(R) Core(TM)2 Duo CPU T6500 @ 2.10GHz
126 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm
130 address sizes : 36 bits physical, 48 bits virtual
135 fn core_duo_t6500() {
136 let cpuinfo
= CpuInfo
::from_str(CORE_DUO_T6500
).unwrap();
137 assert_eq
!(cpuinfo
.field("vendor_id"), "GenuineIntel");
138 assert_eq
!(cpuinfo
.field("cpu family"), "6");
139 assert_eq
!(cpuinfo
.field("model"), "23");
141 cpuinfo
.field("model name"),
142 "Intel(R) Core(TM)2 Duo CPU T6500 @ 2.10GHz"
145 cpuinfo
.field("flags"),
146 "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm"
148 assert
!(cpuinfo
.field("flags").has("fpu"));
149 assert
!(cpuinfo
.field("flags").has("dtherm"));
150 assert
!(cpuinfo
.field("flags").has("sse2"));
151 assert
!(!cpuinfo
.field("flags").has("avx"));
154 const ARM_CORTEX_A53
: &str =
155 r
"Processor : AArch64 Processor rev 3 (aarch64)
164 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
165 CPU implementer : 0x41
166 CPU architecture: AArch64
171 Hardware : HiKey Development Board
175 fn arm_cortex_a53() {
176 let cpuinfo
= CpuInfo
::from_str(ARM_CORTEX_A53
).unwrap();
178 cpuinfo
.field("Processor"),
179 "AArch64 Processor rev 3 (aarch64)"
182 cpuinfo
.field("Features"),
183 "fp asimd evtstrm aes pmull sha1 sha2 crc32"
185 assert
!(cpuinfo
.field("Features").has("pmull"));
186 assert
!(!cpuinfo
.field("Features").has("neon"));
187 assert
!(cpuinfo
.field("Features").has("asimd"));
190 const ARM_CORTEX_A57
: &str = r
"Processor : Cortex A57 Processor rev 1 (aarch64)
195 Features : fp asimd aes pmull sha1 sha2 crc32 wp half thumb fastmult vfp edsp neon vfpv3 tlsi vfpv4 idiva idivt
196 CPU implementer : 0x41
203 fn arm_cortex_a57() {
204 let cpuinfo
= CpuInfo
::from_str(ARM_CORTEX_A57
).unwrap();
206 cpuinfo
.field("Processor"),
207 "Cortex A57 Processor rev 1 (aarch64)"
210 cpuinfo
.field("Features"),
211 "fp asimd aes pmull sha1 sha2 crc32 wp half thumb fastmult vfp edsp neon vfpv3 tlsi vfpv4 idiva idivt"
213 assert
!(cpuinfo
.field("Features").has("pmull"));
214 assert
!(cpuinfo
.field("Features").has("neon"));
215 assert
!(cpuinfo
.field("Features").has("asimd"));
218 const POWER8E_POWERKVM
: &str = r
"processor : 0
219 cpu : POWER8E (raw), altivec supported
220 clock : 3425.000000MHz
221 revision : 2.1 (pvr 004b 0201)
224 cpu : POWER8E (raw), altivec supported
225 clock : 3425.000000MHz
226 revision : 2.1 (pvr 004b 0201)
229 cpu : POWER8E (raw), altivec supported
230 clock : 3425.000000MHz
231 revision : 2.1 (pvr 004b 0201)
234 cpu : POWER8E (raw), altivec supported
235 clock : 3425.000000MHz
236 revision : 2.1 (pvr 004b 0201)
240 model : IBM pSeries (emulated by qemu)
241 machine : CHRP IBM pSeries (emulated by qemu)";
244 fn power8_powerkvm() {
245 let cpuinfo
= CpuInfo
::from_str(POWER8E_POWERKVM
).unwrap();
246 assert_eq
!(cpuinfo
.field("cpu"), "POWER8E (raw), altivec supported");
248 assert
!(cpuinfo
.field("cpu").has("altivec"));
251 const POWER5P
: &str = r
"processor : 0
253 clock : 1900.098000MHz
254 revision : 2.1 (pvr 003b 0201)
258 clock : 1900.098000MHz
259 revision : 2.1 (pvr 003b 0201)
263 clock : 1900.098000MHz
264 revision : 2.1 (pvr 003b 0201)
268 clock : 1900.098000MHz
269 revision : 2.1 (pvr 003b 0201)
273 clock : 1900.098000MHz
274 revision : 2.1 (pvr 003b 0201)
278 clock : 1900.098000MHz
279 revision : 2.1 (pvr 003b 0201)
283 clock : 1900.098000MHz
284 revision : 2.1 (pvr 003b 0201)
288 clock : 1900.098000MHz
289 revision : 2.1 (pvr 003b 0201)
293 machine : CHRP IBM,9133-55A";
297 let cpuinfo
= CpuInfo
::from_str(POWER5P
).unwrap();
298 assert_eq
!(cpuinfo
.field("cpu"), "POWER5+ (gs)");
300 assert
!(!cpuinfo
.field("cpu").has("altivec"));