22// SPDX-License-Identifier: Apache-2.0
33
44use std:: arch:: x86_64:: __cpuid as host_cpuid;
5- use std:: cmp:: { Eq , Ordering , PartialEq , PartialOrd } ;
5+ use std:: cmp:: { Eq , PartialEq } ;
66
77/// Structure representing x86_64 CPU model.
88#[ derive( Debug , Eq , PartialEq ) ]
@@ -19,6 +19,42 @@ pub struct CpuModel {
1919 pub stepping : u8 ,
2020}
2121
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+
2258impl CpuModel {
2359 /// Get CPU model from current machine.
2460 pub fn get_cpu_model ( ) -> Self {
@@ -27,19 +63,6 @@ impl CpuModel {
2763 let eax = unsafe { host_cpuid ( 0x1 ) } . eax ;
2864 CpuModel :: from ( & eax)
2965 }
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- }
4366}
4467
4568impl From < & u32 > for CpuModel {
@@ -54,59 +77,22 @@ impl From<&u32> for CpuModel {
5477 }
5578}
5679
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-
7980#[ cfg( test) ]
8081mod tests {
8182 use super :: * ;
8283
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-
9984 #[ test]
10085 fn cpu_model_from ( ) {
10186 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 ) ;
10588
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 ) ;
11197 }
11298}
0 commit comments