2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
4
use std:: arch:: x86_64:: __cpuid as host_cpuid;
5
- use std:: cmp:: { Eq , Ordering , PartialEq , PartialOrd } ;
5
+ use std:: cmp:: { Eq , PartialEq } ;
6
6
7
7
/// Structure representing x86_64 CPU model.
8
8
#[ derive( Debug , Eq , PartialEq ) ]
@@ -19,6 +19,42 @@ pub struct CpuModel {
19
19
pub stepping : u8 ,
20
20
}
21
21
22
+ /// Family / Model / Stepping for Intel Skylake
23
+ pub const SKYLAKE_FMS : CpuModel = CpuModel {
24
+ extended_family : 0x0 ,
25
+ extended_model : 0x5 ,
26
+ family : 0x6 ,
27
+ model : 0x5 ,
28
+ stepping : 0x4 ,
29
+ } ;
30
+
31
+ /// Family / Model / Stepping for Intel Cascade Lake
32
+ pub const CASCADE_LAKE_FMS : CpuModel = CpuModel {
33
+ extended_family : 0x0 ,
34
+ extended_model : 0x5 ,
35
+ family : 0x6 ,
36
+ model : 0x5 ,
37
+ stepping : 0x7 ,
38
+ } ;
39
+
40
+ /// Family / Model / Stepping for Intel Ice Lake
41
+ pub const ICE_LAKE_FMS : CpuModel = CpuModel {
42
+ extended_family : 0x0 ,
43
+ extended_model : 0x6 ,
44
+ family : 0x6 ,
45
+ model : 0xa ,
46
+ stepping : 0x6 ,
47
+ } ;
48
+
49
+ /// Family / Model / Stepping for AMD Milan
50
+ pub const MILAN_FMS : CpuModel = CpuModel {
51
+ extended_family : 0xa ,
52
+ extended_model : 0x0 ,
53
+ family : 0xf ,
54
+ model : 0x1 ,
55
+ stepping : 0x1 ,
56
+ } ;
57
+
22
58
impl CpuModel {
23
59
/// Get CPU model from current machine.
24
60
pub fn get_cpu_model ( ) -> Self {
@@ -27,19 +63,6 @@ impl CpuModel {
27
63
let eax = unsafe { host_cpuid ( 0x1 ) } . eax ;
28
64
CpuModel :: from ( & eax)
29
65
}
30
-
31
- /// Check if the current CPU model is Intel Cascade Lake or later.
32
- pub fn is_at_least_cascade_lake ( & self ) -> bool {
33
- let cascade_lake = CpuModel {
34
- extended_family : 0 ,
35
- extended_model : 5 ,
36
- family : 6 ,
37
- model : 5 ,
38
- stepping : 7 ,
39
- } ;
40
-
41
- self >= & cascade_lake
42
- }
43
66
}
44
67
45
68
impl From < & u32 > for CpuModel {
@@ -54,59 +77,22 @@ impl From<&u32> for CpuModel {
54
77
}
55
78
}
56
79
57
- impl From < & CpuModel > for u32 {
58
- fn from ( cpu_model : & CpuModel ) -> Self {
59
- ( u32:: from ( cpu_model. extended_family ) << 20 )
60
- | ( u32:: from ( cpu_model. extended_model ) << 16 )
61
- | ( u32:: from ( cpu_model. family ) << 8 )
62
- | ( u32:: from ( cpu_model. model ) << 4 )
63
- | u32:: from ( cpu_model. stepping )
64
- }
65
- }
66
-
67
- impl PartialOrd for CpuModel {
68
- fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
69
- Some ( u32:: from ( self ) . cmp ( & u32:: from ( other) ) )
70
- }
71
- }
72
-
73
- impl Ord for CpuModel {
74
- fn cmp ( & self , other : & Self ) -> Ordering {
75
- u32:: from ( self ) . cmp ( & u32:: from ( other) )
76
- }
77
- }
78
-
79
80
#[ cfg( test) ]
80
81
mod tests {
81
82
use super :: * ;
82
83
83
- const SKYLAKE : CpuModel = CpuModel {
84
- extended_family : 0 ,
85
- extended_model : 5 ,
86
- family : 6 ,
87
- model : 5 ,
88
- stepping : 4 ,
89
- } ;
90
-
91
- const CASCADE_LAKE : CpuModel = CpuModel {
92
- extended_family : 0 ,
93
- extended_model : 5 ,
94
- family : 6 ,
95
- model : 5 ,
96
- stepping : 7 ,
97
- } ;
98
-
99
84
#[ test]
100
85
fn cpu_model_from ( ) {
101
86
let skylake_eax = 0x00050654 ;
102
- assert_eq ! ( u32 :: from( & SKYLAKE ) , skylake_eax) ;
103
- assert_eq ! ( CpuModel :: from( & skylake_eax) , SKYLAKE ) ;
104
- }
87
+ assert_eq ! ( CpuModel :: from( & skylake_eax) , SKYLAKE_FMS ) ;
105
88
106
- #[ test]
107
- fn cpu_model_ord ( ) {
108
- assert_eq ! ( SKYLAKE , SKYLAKE ) ;
109
- assert ! ( SKYLAKE < CASCADE_LAKE ) ;
110
- assert ! ( CASCADE_LAKE > SKYLAKE ) ;
89
+ let cascade_lake_eax = 0x00050657 ;
90
+ assert_eq ! ( CpuModel :: from( & cascade_lake_eax) , CASCADE_LAKE_FMS ) ;
91
+
92
+ let ice_lake_eax = 0x000606a6 ;
93
+ assert_eq ! ( CpuModel :: from( & ice_lake_eax) , ICE_LAKE_FMS ) ;
94
+
95
+ let milan_eax = 0x00a00f11 ;
96
+ assert_eq ! ( CpuModel :: from( & milan_eax) , MILAN_FMS ) ;
111
97
}
112
98
}
0 commit comments