Skip to main content

vmaware/
cpu.rs

1//! CPU identification utilities: CPUID wrapper, brand string, databases,
2//! vmid template, stepping extraction.
3
4use crate::types::VMBrand;
5
6// ── Leaf-result cache ─────────────────────────────────────────────────────────
7// 64-slot rolling array of (leaf, result).
8const LEAF_CACHE_SIZE: usize = 64;
9
10use std::sync::Mutex;
11static LEAF_CACHE: Mutex<[(u32, bool); LEAF_CACHE_SIZE]> =
12    Mutex::new([(u32::MAX, false); LEAF_CACHE_SIZE]);
13static LEAF_CACHE_IDX: Mutex<usize> = Mutex::new(0);
14
15// ── CPUID result structure ────────────────────────────────────────────────────
16#[derive(Debug, Clone, Copy, Default)]
17pub struct CpuidResult {
18    pub eax: u32,
19    pub ebx: u32,
20    pub ecx: u32,
21    pub edx: u32,
22}
23
24/// Execute CPUID for (leaf, subleaf). Returns zeros on non-x86 platforms.
25#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
26pub fn cpuid(leaf: u32, subleaf: u32) -> CpuidResult {
27    let r = raw_cpuid::native_cpuid::cpuid_count(leaf, subleaf);
28    CpuidResult {
29        eax: r.eax,
30        ebx: r.ebx,
31        ecx: r.ecx,
32        edx: r.edx,
33    }
34}
35
36#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
37pub fn cpuid(_leaf: u32, _subleaf: u32) -> CpuidResult {
38    CpuidResult::default()
39}
40
41/// Check whether CPUID leaf `leaf` is supported by this CPU.
42pub fn is_leaf_supported(leaf: u32) -> bool {
43    // Check cache first
44    {
45        let cache = LEAF_CACHE.lock().unwrap();
46        for &(l, v) in cache.iter() {
47            if l == leaf {
48                return v;
49            }
50        }
51    }
52
53    // Query CPUID max leaf
54    let max_leaf = if leaf >= 0x8000_0000 {
55        cpuid(0x8000_0000, 0).eax
56    } else if leaf >= 0x4000_0000 {
57        cpuid(0x4000_0000, 0).eax
58    } else {
59        cpuid(0, 0).eax
60    };
61
62    let result = leaf <= max_leaf;
63
64    // Store in cache
65    let mut cache = LEAF_CACHE.lock().unwrap();
66    let mut idx = LEAF_CACHE_IDX.lock().unwrap();
67    cache[*idx % LEAF_CACHE_SIZE] = (leaf, result);
68    *idx = idx.wrapping_add(1);
69
70    result
71}
72
73/// Returns true if the CPU manufacturer is Intel.
74pub fn is_intel() -> bool {
75    let r = cpuid(0, 0);
76    // "GenuineIntel" in EBX/EDX/ECX
77    r.ebx == 0x756e_6547 && r.edx == 0x4965_6e69 && r.ecx == 0x6c65_746e
78}
79
80/// Returns true if the CPU manufacturer is AMD.
81pub fn is_amd() -> bool {
82    let r = cpuid(0, 0);
83    // "AuthenticAMD" in EBX/EDX/ECX
84    r.ebx == 0x6874_7541 && r.edx == 0x6974_6e65 && r.ecx == 0x444d_4163
85}
86
87/// Reconstruct a 12-byte vendor string from EBX/ECX/EDX of a CPUID result.
88pub fn vendor_string(ebx: u32, ecx: u32, edx: u32) -> String {
89    let mut bytes = [0u8; 12];
90    bytes[0..4].copy_from_slice(&ebx.to_le_bytes());
91    bytes[4..8].copy_from_slice(&edx.to_le_bytes());
92    bytes[8..12].copy_from_slice(&ecx.to_le_bytes());
93    String::from_utf8_lossy(&bytes).to_string()
94}
95
96/// Return the CPU brand string (from leaves 0x80000002-4). Empty on failure.
97pub fn cpu_brand_string() -> String {
98    if !is_leaf_supported(0x8000_0004) {
99        return String::new();
100    }
101    let mut brand = [0u8; 48];
102    for (i, leaf) in (0x8000_0002u32..=0x8000_0004).enumerate() {
103        let r = cpuid(leaf, 0);
104        let off = i * 16;
105        brand[off..off + 4].copy_from_slice(&r.eax.to_le_bytes());
106        brand[off + 4..off + 8].copy_from_slice(&r.ebx.to_le_bytes());
107        brand[off + 8..off + 12].copy_from_slice(&r.ecx.to_le_bytes());
108        brand[off + 12..off + 16].copy_from_slice(&r.edx.to_le_bytes());
109    }
110    let s = String::from_utf8_lossy(&brand);
111    s.trim_end_matches('\0').trim().to_string()
112}
113
114/// CPU stepping information (model, family, ext-model).
115#[derive(Debug, Clone, Copy, Default)]
116pub struct CpuStepping {
117    pub model: u32,
118    pub family: u32,
119    pub extmodel: u32,
120}
121
122/// Extract stepping info from CPUID leaf 1 EAX.
123pub fn fetch_steppings() -> CpuStepping {
124    let eax = cpuid(1, 0).eax;
125    let model = (eax >> 4) & 0xf;
126    let family = (eax >> 8) & 0xf;
127    let extmodel = (eax >> 16) & 0xf;
128    CpuStepping { model, family, extmodel }
129}
130
131/// Returns true if the CPU is a Celeron based on its brand string.
132pub fn is_celeron(brand: &str) -> bool {
133    brand.contains("Celeron")
134}
135
136// ── Known hypervisor vendor strings (leaf 0x40000000 EBX/ECX/EDX) ─────────────
137/// Matches vendor strings against 30+ known VM signatures.
138/// Returns (`found: bool`, `brand: VMBrand`).
139pub fn vmid_template(leaf: u32) -> (bool, VMBrand) {
140    if !is_leaf_supported(leaf) {
141        return (false, VMBrand::Invalid);
142    }
143    let r = cpuid(leaf, 0);
144    let v = vendor_string(r.ebx, r.ecx, r.edx);
145
146    // Table: (substring, brand)
147    static TABLE: &[(&str, VMBrand)] = &[
148        ("KVMKVMKVM",      VMBrand::KVM),
149        ("Microsoft Hv",   VMBrand::HyperV),
150        ("VMwareVMware",   VMBrand::VMware),
151        ("XenVMMXenVMM",   VMBrand::Xen),
152        ("prl hyperv",     VMBrand::Parallels),
153        ("prl hv",         VMBrand::Parallels),
154        ("VBoxVBoxVBox",   VMBrand::VBox),
155        (" lrpepyh  vr",   VMBrand::Parallels),   // "prl hyperv" scrambled
156        ("bhyve bhyve",    VMBrand::Bhyve),
157        ("ACRNACRNACRN",   VMBrand::ACRN),
158        ("QNXQVMBSQG",     VMBrand::QNX),
159        ("GenuineIntel",   VMBrand::Invalid),      // not a VM id
160        ("AuthenticAMD",   VMBrand::Invalid),
161        ("HygonGenuine",   VMBrand::Invalid),
162        (" KVMH",          VMBrand::KVMHyperV),
163        ("QEMU",           VMBrand::QEMU),
164        ("Jailhouse",      VMBrand::Jailhouse),
165        ("Apple VZ",       VMBrand::AppleVZ),
166        ("UnisysSpar64",   VMBrand::Unisys),
167        ("LMHS",           VMBrand::LMHS),
168        ("NoirVisor",      VMBrand::NoirVisor),
169        ("SimpleVisor",    VMBrand::SimpleVisor),
170        ("Barevisor",      VMBrand::Barevisor),
171        ("HyperPlatform",  VMBrand::HyperPlatform),
172        ("MiniVisor",      VMBrand::MiniVisor),
173        ("DBVM",           VMBrand::DBVM),
174        ("Intel TDX",      VMBrand::IntelTDX),
175        ("VirtualApple",   VMBrand::UTM),
176    ];
177
178    for &(sig, brand) in TABLE {
179        if v.contains(sig) {
180            if brand == VMBrand::Invalid {
181                return (false, VMBrand::Invalid);
182            }
183            return (true, brand);
184        }
185    }
186
187    // KGT (Intel Kernel Guard Technology) uses leaf 0x40000001
188    if leaf == 0x4000_0001 {
189        let eax = r.eax;
190        if eax == 0x4d_494b54 {
191            // "TKIM"
192            return (true, VMBrand::IntelKGT);
193        }
194    }
195
196    (false, VMBrand::Invalid)
197}
198
199// ── CPU thread-count databases ─────────────────────────────────────────────────
200// Each (model substring, logical thread count) entry
201pub struct CpuEntry {
202    pub model: &'static str,
203    pub threads: u32,
204}
205
206/// Intel Core i3/i5/i7/i9 database.
207pub static INTEL_CORE_DB: &[CpuEntry] = &[
208    CpuEntry { model: "i3-1000G1",  threads: 4  },
209    CpuEntry { model: "i3-1000G4",  threads: 4  },
210    CpuEntry { model: "i3-10100",   threads: 8  },
211    CpuEntry { model: "i3-10100E",  threads: 8  },
212    CpuEntry { model: "i3-10100F",  threads: 8  },
213    CpuEntry { model: "i3-10100T",  threads: 8  },
214    CpuEntry { model: "i3-10100TE", threads: 8  },
215    CpuEntry { model: "i3-10105",   threads: 8  },
216    CpuEntry { model: "i3-10105F",  threads: 8  },
217    CpuEntry { model: "i3-10105T",  threads: 8  },
218    CpuEntry { model: "i3-10110U",  threads: 4  },
219    CpuEntry { model: "i3-10110Y",  threads: 4  },
220    CpuEntry { model: "i3-10300",   threads: 8  },
221    CpuEntry { model: "i3-10300T",  threads: 8  },
222    CpuEntry { model: "i3-10305",   threads: 8  },
223    CpuEntry { model: "i3-10305T",  threads: 8  },
224    CpuEntry { model: "i3-10320",   threads: 8  },
225    CpuEntry { model: "i3-10325",   threads: 8  },
226    CpuEntry { model: "i3-1110G4",  threads: 4  },
227    CpuEntry { model: "i3-1115G4E", threads: 4  },
228    CpuEntry { model: "i3-1115GRE", threads: 4  },
229    CpuEntry { model: "i3-1115G4",  threads: 4  },
230    CpuEntry { model: "i3-1120G4",  threads: 8  },
231    CpuEntry { model: "i3-1125G4",  threads: 8  },
232    CpuEntry { model: "i3-12100",   threads: 8  },
233    CpuEntry { model: "i3-12100F",  threads: 8  },
234    CpuEntry { model: "i3-12100T",  threads: 8  },
235    CpuEntry { model: "i3-12300",   threads: 8  },
236    CpuEntry { model: "i3-12300T",  threads: 8  },
237    CpuEntry { model: "i3-1210U",   threads: 8  },
238    CpuEntry { model: "i3-1215U",   threads: 8  },
239    CpuEntry { model: "i3-1215UE",  threads: 8  },
240    CpuEntry { model: "i3-1215UL",  threads: 8  },
241    CpuEntry { model: "i3-1220P",   threads: 12 },
242    CpuEntry { model: "i3-13100",   threads: 8  },
243    CpuEntry { model: "i3-13100F",  threads: 8  },
244    CpuEntry { model: "i3-13100T",  threads: 8  },
245    CpuEntry { model: "i3-1315U",   threads: 8  },
246    CpuEntry { model: "i3-1315UE",  threads: 8  },
247    CpuEntry { model: "i3-14100",   threads: 8  },
248    CpuEntry { model: "i3-14100F",  threads: 8  },
249    CpuEntry { model: "i3-14100T",  threads: 8  },
250    CpuEntry { model: "i5-10200H",  threads: 8  },
251    CpuEntry { model: "i5-10210U",  threads: 8  },
252    CpuEntry { model: "i5-10210Y",  threads: 8  },
253    CpuEntry { model: "i5-10300H",  threads: 8  },
254    CpuEntry { model: "i5-10310U",  threads: 8  },
255    CpuEntry { model: "i5-10400",   threads: 12 },
256    CpuEntry { model: "i5-10400F",  threads: 12 },
257    CpuEntry { model: "i5-10400H",  threads: 8  },
258    CpuEntry { model: "i5-10400T",  threads: 12 },
259    CpuEntry { model: "i5-10500",   threads: 12 },
260    CpuEntry { model: "i5-10500H",  threads: 12 },
261    CpuEntry { model: "i5-10500T",  threads: 12 },
262    CpuEntry { model: "i5-10500TE", threads: 12 },
263    CpuEntry { model: "i5-10505",   threads: 12 },
264    CpuEntry { model: "i5-10600",   threads: 12 },
265    CpuEntry { model: "i5-10600K",  threads: 12 },
266    CpuEntry { model: "i5-10600KF", threads: 12 },
267    CpuEntry { model: "i5-10600T",  threads: 12 },
268    CpuEntry { model: "i5-1030G4",  threads: 8  },
269    CpuEntry { model: "i5-1030G7",  threads: 8  },
270    CpuEntry { model: "i5-1035G1",  threads: 8  },
271    CpuEntry { model: "i5-1035G4",  threads: 8  },
272    CpuEntry { model: "i5-1035G7",  threads: 8  },
273    CpuEntry { model: "i5-1130G7",  threads: 8  },
274    CpuEntry { model: "i5-1135G7",  threads: 8  },
275    CpuEntry { model: "i5-11260H",  threads: 12 },
276    CpuEntry { model: "i5-11300H",  threads: 8  },
277    CpuEntry { model: "i5-11320H",  threads: 8  },
278    CpuEntry { model: "i5-11400",   threads: 12 },
279    CpuEntry { model: "i5-11400F",  threads: 12 },
280    CpuEntry { model: "i5-11400H",  threads: 12 },
281    CpuEntry { model: "i5-11400T",  threads: 12 },
282    CpuEntry { model: "i5-11500",   threads: 12 },
283    CpuEntry { model: "i5-11500H",  threads: 12 },
284    CpuEntry { model: "i5-11500T",  threads: 12 },
285    CpuEntry { model: "i5-11600",   threads: 12 },
286    CpuEntry { model: "i5-11600K",  threads: 12 },
287    CpuEntry { model: "i5-11600KF", threads: 12 },
288    CpuEntry { model: "i5-11600T",  threads: 12 },
289    CpuEntry { model: "i5-1230U",   threads: 12 },
290    CpuEntry { model: "i5-1235U",   threads: 12 },
291    CpuEntry { model: "i5-1235UL",  threads: 12 },
292    CpuEntry { model: "i5-12400",   threads: 12 },
293    CpuEntry { model: "i5-12400F",  threads: 12 },
294    CpuEntry { model: "i5-12400T",  threads: 12 },
295    CpuEntry { model: "i5-12450H",  threads: 12 },
296    CpuEntry { model: "i5-12450HX", threads: 12 },
297    CpuEntry { model: "i5-12500",   threads: 12 },
298    CpuEntry { model: "i5-12500H",  threads: 16 },
299    CpuEntry { model: "i5-12500T",  threads: 12 },
300    CpuEntry { model: "i5-12600",   threads: 12 },
301    CpuEntry { model: "i5-12600H",  threads: 16 },
302    CpuEntry { model: "i5-12600HX", threads: 16 },
303    CpuEntry { model: "i5-12600K",  threads: 16 },
304    CpuEntry { model: "i5-12600KF", threads: 16 },
305    CpuEntry { model: "i5-12600T",  threads: 12 },
306    CpuEntry { model: "i5-1240P",   threads: 16 },
307    CpuEntry { model: "i5-1240U",   threads: 12 },
308    CpuEntry { model: "i5-1245U",   threads: 12 },
309    CpuEntry { model: "i5-1245UE",  threads: 12 },
310    CpuEntry { model: "i5-1250P",   threads: 16 },
311    CpuEntry { model: "i5-1250PE",  threads: 16 },
312    CpuEntry { model: "i5-13400",   threads: 16 },
313    CpuEntry { model: "i5-13400F",  threads: 16 },
314    CpuEntry { model: "i5-13400T",  threads: 16 },
315    CpuEntry { model: "i5-13450HX", threads: 16 },
316    CpuEntry { model: "i5-13490F",  threads: 16 },
317    CpuEntry { model: "i5-13500",   threads: 20 },
318    CpuEntry { model: "i5-13500H",  threads: 16 },
319    CpuEntry { model: "i5-13500HX", threads: 16 },
320    CpuEntry { model: "i5-13500T",  threads: 20 },
321    CpuEntry { model: "i5-13600",   threads: 20 },
322    CpuEntry { model: "i5-13600H",  threads: 16 },
323    CpuEntry { model: "i5-13600HX", threads: 20 },
324    CpuEntry { model: "i5-13600K",  threads: 20 },
325    CpuEntry { model: "i5-13600KF", threads: 20 },
326    CpuEntry { model: "i5-13600T",  threads: 20 },
327    CpuEntry { model: "i5-1340P",   threads: 16 },
328    CpuEntry { model: "i5-1345U",   threads: 12 },
329    CpuEntry { model: "i5-1345UE",  threads: 12 },
330    CpuEntry { model: "i5-14400",   threads: 16 },
331    CpuEntry { model: "i5-14400F",  threads: 16 },
332    CpuEntry { model: "i5-14400T",  threads: 16 },
333    CpuEntry { model: "i5-14500",   threads: 20 },
334    CpuEntry { model: "i5-14500HX", threads: 20 },
335    CpuEntry { model: "i5-14500T",  threads: 20 },
336    CpuEntry { model: "i5-14600",   threads: 20 },
337    CpuEntry { model: "i5-14600K",  threads: 20 },
338    CpuEntry { model: "i5-14600KF", threads: 20 },
339    CpuEntry { model: "i5-14600T",  threads: 20 },
340    CpuEntry { model: "i7-10510U",  threads: 8  },
341    CpuEntry { model: "i7-10510Y",  threads: 8  },
342    CpuEntry { model: "i7-10700",   threads: 16 },
343    CpuEntry { model: "i7-10700E",  threads: 16 },
344    CpuEntry { model: "i7-10700F",  threads: 16 },
345    CpuEntry { model: "i7-10700K",  threads: 16 },
346    CpuEntry { model: "i7-10700KF", threads: 16 },
347    CpuEntry { model: "i7-10700T",  threads: 16 },
348    CpuEntry { model: "i7-10700TE", threads: 16 },
349    CpuEntry { model: "i7-10710U",  threads: 12 },
350    CpuEntry { model: "i7-10750H",  threads: 12 },
351    CpuEntry { model: "i7-10810U",  threads: 12 },
352    CpuEntry { model: "i7-10850H",  threads: 12 },
353    CpuEntry { model: "i7-10870H",  threads: 16 },
354    CpuEntry { model: "i7-10875H",  threads: 16 },
355    CpuEntry { model: "i7-1060G7",  threads: 8  },
356    CpuEntry { model: "i7-1060NG7", threads: 8  },
357    CpuEntry { model: "i7-1065G7",  threads: 8  },
358    CpuEntry { model: "i7-1068G7",  threads: 8  },
359    CpuEntry { model: "i7-1068NG7", threads: 8  },
360    CpuEntry { model: "i7-1160G7",  threads: 8  },
361    CpuEntry { model: "i7-1165G7",  threads: 8  },
362    CpuEntry { model: "i7-11370H",  threads: 8  },
363    CpuEntry { model: "i7-11375H",  threads: 8  },
364    CpuEntry { model: "i7-11390H",  threads: 8  },
365    CpuEntry { model: "i7-11600H",  threads: 12 },
366    CpuEntry { model: "i7-1180G7",  threads: 8  },
367    CpuEntry { model: "i7-11800H",  threads: 16 },
368    CpuEntry { model: "i7-11850H",  threads: 16 },
369    CpuEntry { model: "i7-11850HE", threads: 16 },
370    CpuEntry { model: "i7-1185G7",  threads: 8  },
371    CpuEntry { model: "i7-1185G7E", threads: 8  },
372    CpuEntry { model: "i7-1185GRE", threads: 8  },
373    CpuEntry { model: "i7-11700",   threads: 16 },
374    CpuEntry { model: "i7-11700F",  threads: 16 },
375    CpuEntry { model: "i7-11700K",  threads: 16 },
376    CpuEntry { model: "i7-11700KF", threads: 16 },
377    CpuEntry { model: "i7-11700T",  threads: 16 },
378    CpuEntry { model: "i7-1260P",   threads: 16 },
379    CpuEntry { model: "i7-1260U",   threads: 12 },
380    CpuEntry { model: "i7-1265U",   threads: 12 },
381    CpuEntry { model: "i7-1265UE",  threads: 12 },
382    CpuEntry { model: "i7-12650H",  threads: 16 },
383    CpuEntry { model: "i7-12700",   threads: 20 },
384    CpuEntry { model: "i7-12700F",  threads: 20 },
385    CpuEntry { model: "i7-12700H",  threads: 20 },
386    CpuEntry { model: "i7-12700K",  threads: 20 },
387    CpuEntry { model: "i7-12700KF", threads: 20 },
388    CpuEntry { model: "i7-12700T",  threads: 20 },
389    CpuEntry { model: "i7-12800H",  threads: 20 },
390    CpuEntry { model: "i7-12800HE", threads: 20 },
391    CpuEntry { model: "i7-12800HX", threads: 24 },
392    CpuEntry { model: "i7-12850HX", threads: 24 },
393    CpuEntry { model: "i7-1280P",   threads: 20 },
394    CpuEntry { model: "i7-13620H",  threads: 16 },
395    CpuEntry { model: "i7-13650HX", threads: 20 },
396    CpuEntry { model: "i7-13700",   threads: 24 },
397    CpuEntry { model: "i7-13700F",  threads: 24 },
398    CpuEntry { model: "i7-13700H",  threads: 20 },
399    CpuEntry { model: "i7-13700HX", threads: 24 },
400    CpuEntry { model: "i7-13700K",  threads: 24 },
401    CpuEntry { model: "i7-13700KF", threads: 24 },
402    CpuEntry { model: "i7-13700T",  threads: 24 },
403    CpuEntry { model: "i7-1360P",   threads: 16 },
404    CpuEntry { model: "i7-1365U",   threads: 12 },
405    CpuEntry { model: "i7-1365UE",  threads: 12 },
406    CpuEntry { model: "i7-14700",   threads: 28 },
407    CpuEntry { model: "i7-14700F",  threads: 28 },
408    CpuEntry { model: "i7-14700HX", threads: 28 },
409    CpuEntry { model: "i7-14700K",  threads: 28 },
410    CpuEntry { model: "i7-14700KF", threads: 28 },
411    CpuEntry { model: "i7-14700T",  threads: 28 },
412    CpuEntry { model: "i9-10850K",  threads: 20 },
413    CpuEntry { model: "i9-10900",   threads: 20 },
414    CpuEntry { model: "i9-10900E",  threads: 20 },
415    CpuEntry { model: "i9-10900F",  threads: 20 },
416    CpuEntry { model: "i9-10900K",  threads: 20 },
417    CpuEntry { model: "i9-10900KF", threads: 20 },
418    CpuEntry { model: "i9-10900T",  threads: 20 },
419    CpuEntry { model: "i9-10900TE", threads: 20 },
420    CpuEntry { model: "i9-10900X",  threads: 20 },
421    CpuEntry { model: "i9-10940X",  threads: 28 },
422    CpuEntry { model: "i9-10980HK", threads: 16 },
423    CpuEntry { model: "i9-10980XE", threads: 36 },
424    CpuEntry { model: "i9-11900",   threads: 16 },
425    CpuEntry { model: "i9-11900F",  threads: 16 },
426    CpuEntry { model: "i9-11900H",  threads: 16 },
427    CpuEntry { model: "i9-11900K",  threads: 16 },
428    CpuEntry { model: "i9-11900KB", threads: 16 },
429    CpuEntry { model: "i9-11900KF", threads: 16 },
430    CpuEntry { model: "i9-11900T",  threads: 16 },
431    CpuEntry { model: "i9-11950H",  threads: 16 },
432    CpuEntry { model: "i9-11980HK", threads: 16 },
433    CpuEntry { model: "i9-12900",   threads: 24 },
434    CpuEntry { model: "i9-12900F",  threads: 24 },
435    CpuEntry { model: "i9-12900H",  threads: 20 },
436    CpuEntry { model: "i9-12900HK", threads: 20 },
437    CpuEntry { model: "i9-12900HX", threads: 32 },
438    CpuEntry { model: "i9-12900K",  threads: 24 },
439    CpuEntry { model: "i9-12900KF", threads: 24 },
440    CpuEntry { model: "i9-12900KS", threads: 24 },
441    CpuEntry { model: "i9-12900T",  threads: 24 },
442    CpuEntry { model: "i9-13900",   threads: 32 },
443    CpuEntry { model: "i9-13900E",  threads: 32 },
444    CpuEntry { model: "i9-13900F",  threads: 32 },
445    CpuEntry { model: "i9-13900H",  threads: 20 },
446    CpuEntry { model: "i9-13900HK", threads: 20 },
447    CpuEntry { model: "i9-13900HX", threads: 32 },
448    CpuEntry { model: "i9-13900K",  threads: 32 },
449    CpuEntry { model: "i9-13900KF", threads: 32 },
450    CpuEntry { model: "i9-13900KS", threads: 32 },
451    CpuEntry { model: "i9-13900T",  threads: 32 },
452    CpuEntry { model: "i9-13900TE", threads: 32 },
453    CpuEntry { model: "i9-13950HX", threads: 32 },
454    CpuEntry { model: "i9-13980HX", threads: 32 },
455    CpuEntry { model: "i9-14900",   threads: 32 },
456    CpuEntry { model: "i9-14900F",  threads: 32 },
457    CpuEntry { model: "i9-14900HX", threads: 32 },
458    CpuEntry { model: "i9-14900K",  threads: 32 },
459    CpuEntry { model: "i9-14900KF", threads: 32 },
460    CpuEntry { model: "i9-14900KS", threads: 32 },
461    CpuEntry { model: "i9-14900T",  threads: 32 },
462];
463
464/// Intel Xeon D/E/W series database.
465pub static INTEL_XEON_DB: &[CpuEntry] = &[
466    CpuEntry { model: "Xeon D-1513N",  threads: 10 },
467    CpuEntry { model: "Xeon D-1523N",  threads: 8  },
468    CpuEntry { model: "Xeon D-1533N",  threads: 10 },
469    CpuEntry { model: "Xeon D-1543N",  threads: 16 },
470    CpuEntry { model: "Xeon D-1553N",  threads: 16 },
471    CpuEntry { model: "Xeon D-2123IT", threads: 8  },
472    CpuEntry { model: "Xeon D-2141I",  threads: 16 },
473    CpuEntry { model: "Xeon D-2143IT", threads: 16 },
474    CpuEntry { model: "Xeon D-2145NT", threads: 16 },
475    CpuEntry { model: "Xeon D-2146NT", threads: 16 },
476    CpuEntry { model: "Xeon D-2161I",  threads: 24 },
477    CpuEntry { model: "Xeon D-2163IT", threads: 24 },
478    CpuEntry { model: "Xeon D-2166NT", threads: 24 },
479    CpuEntry { model: "Xeon D-2173IT", threads: 28 },
480    CpuEntry { model: "Xeon D-2177NT", threads: 28 },
481    CpuEntry { model: "Xeon D-2183IT", threads: 32 },
482    CpuEntry { model: "Xeon D-2187NT", threads: 32 },
483    CpuEntry { model: "Xeon E-2224",   threads: 4  },
484    CpuEntry { model: "Xeon E-2224G",  threads: 4  },
485    CpuEntry { model: "Xeon E-2226G",  threads: 6  },
486    CpuEntry { model: "Xeon E-2226GE", threads: 6  },
487    CpuEntry { model: "Xeon E-2234",   threads: 8  },
488    CpuEntry { model: "Xeon E-2236",   threads: 12 },
489    CpuEntry { model: "Xeon E-2244G",  threads: 8  },
490    CpuEntry { model: "Xeon E-2246G",  threads: 12 },
491    CpuEntry { model: "Xeon E-2254ME", threads: 8  },
492    CpuEntry { model: "Xeon E-2254ML", threads: 8  },
493    CpuEntry { model: "Xeon E-2256G",  threads: 12 },
494    CpuEntry { model: "Xeon E-2274G",  threads: 8  },
495    CpuEntry { model: "Xeon E-2276G",  threads: 12 },
496    CpuEntry { model: "Xeon E-2276ME", threads: 12 },
497    CpuEntry { model: "Xeon E-2276ML", threads: 12 },
498    CpuEntry { model: "Xeon E-2278G",  threads: 16 },
499    CpuEntry { model: "Xeon E-2278GE", threads: 16 },
500    CpuEntry { model: "Xeon E-2278GEL", threads: 16},
501    CpuEntry { model: "Xeon E-2278MEL", threads: 16},
502    CpuEntry { model: "Xeon E-2286G",  threads: 12 },
503    CpuEntry { model: "Xeon E-2286M",  threads: 16 },
504    CpuEntry { model: "Xeon E-2288G",  threads: 16 },
505    CpuEntry { model: "Xeon E-2314",   threads: 4  },
506    CpuEntry { model: "Xeon E-2324G",  threads: 4  },
507    CpuEntry { model: "Xeon E-2334",   threads: 8  },
508    CpuEntry { model: "Xeon E-2336",   threads: 12 },
509    CpuEntry { model: "Xeon E-2356G",  threads: 12 },
510    CpuEntry { model: "Xeon E-2374G",  threads: 8  },
511    CpuEntry { model: "Xeon E-2378",   threads: 16 },
512    CpuEntry { model: "Xeon E-2378G",  threads: 16 },
513    CpuEntry { model: "Xeon E-2386G",  threads: 12 },
514    CpuEntry { model: "Xeon E-2388G",  threads: 16 },
515    CpuEntry { model: "Xeon W-1250",   threads: 12 },
516    CpuEntry { model: "Xeon W-1250E",  threads: 12 },
517    CpuEntry { model: "Xeon W-1250P",  threads: 12 },
518    CpuEntry { model: "Xeon W-1250TE", threads: 12 },
519    CpuEntry { model: "Xeon W-1270",   threads: 16 },
520    CpuEntry { model: "Xeon W-1270E",  threads: 16 },
521    CpuEntry { model: "Xeon W-1270P",  threads: 16 },
522    CpuEntry { model: "Xeon W-1270TE", threads: 16 },
523    CpuEntry { model: "Xeon W-1290",   threads: 20 },
524    CpuEntry { model: "Xeon W-1290E",  threads: 20 },
525    CpuEntry { model: "Xeon W-1290P",  threads: 20 },
526    CpuEntry { model: "Xeon W-1290T",  threads: 20 },
527    CpuEntry { model: "Xeon W-1290TE", threads: 20 },
528    CpuEntry { model: "Xeon W-1350",   threads: 12 },
529    CpuEntry { model: "Xeon W-1350P",  threads: 12 },
530    CpuEntry { model: "Xeon W-1370",   threads: 16 },
531    CpuEntry { model: "Xeon W-1370P",  threads: 16 },
532    CpuEntry { model: "Xeon W-1390",   threads: 20 },
533    CpuEntry { model: "Xeon W-1390P",  threads: 20 },
534    CpuEntry { model: "Xeon W-1390T",  threads: 20 },
535    CpuEntry { model: "Xeon W-3323",   threads: 24 },
536    CpuEntry { model: "Xeon W-3335",   threads: 32 },
537    CpuEntry { model: "Xeon W-3345",   threads: 48 },
538    CpuEntry { model: "Xeon W-3365",   threads: 64 },
539    CpuEntry { model: "Xeon W-3375",   threads: 72 },
540    CpuEntry { model: "Xeon W-9-3575X", threads: 112},
541    CpuEntry { model: "Xeon W-7-2595X", threads: 64},
542    CpuEntry { model: "Xeon W-5-3435X", threads: 32},
543    CpuEntry { model: "Xeon W-3-2435",  threads: 24},
544];
545
546/// Intel Core Ultra (Series 1 / Series 2) database.
547pub static INTEL_ULTRA_DB: &[CpuEntry] = &[
548    CpuEntry { model: "Ultra 5 125U",  threads: 12 },
549    CpuEntry { model: "Ultra 5 125H",  threads: 14 },
550    CpuEntry { model: "Ultra 5 135U",  threads: 12 },
551    CpuEntry { model: "Ultra 5 135H",  threads: 14 },
552    CpuEntry { model: "Ultra 5 138U",  threads: 12 },
553    CpuEntry { model: "Ultra 5 225",   threads: 14 },
554    CpuEntry { model: "Ultra 5 226V",  threads: 8  },
555    CpuEntry { model: "Ultra 5 245",   threads: 14 },
556    CpuEntry { model: "Ultra 5 245K",  threads: 14 },
557    CpuEntry { model: "Ultra 7 155U",  threads: 12 },
558    CpuEntry { model: "Ultra 7 155H",  threads: 22 },
559    CpuEntry { model: "Ultra 7 165U",  threads: 12 },
560    CpuEntry { model: "Ultra 7 165H",  threads: 22 },
561    CpuEntry { model: "Ultra 7 165UX", threads: 12 },
562    CpuEntry { model: "Ultra 7 255U",  threads: 12 },
563    CpuEntry { model: "Ultra 7 258V",  threads: 8  },
564    CpuEntry { model: "Ultra 7 265",   threads: 20 },
565    CpuEntry { model: "Ultra 7 265K",  threads: 20 },
566    CpuEntry { model: "Ultra 7 265KF", threads: 20 },
567    CpuEntry { model: "Ultra 9 185H",  threads: 22 },
568    CpuEntry { model: "Ultra 9 285K",  threads: 24 },
569];
570
571/// AMD Ryzen / Threadripper database.
572pub static AMD_RYZEN_DB: &[CpuEntry] = &[
573    CpuEntry { model: "Ryzen 3 2200G",     threads: 4  },
574    CpuEntry { model: "Ryzen 3 2300X",     threads: 4  },
575    CpuEntry { model: "Ryzen 3 3100",      threads: 8  },
576    CpuEntry { model: "Ryzen 3 3200G",     threads: 4  },
577    CpuEntry { model: "Ryzen 3 3200U",     threads: 4  },
578    CpuEntry { model: "Ryzen 3 3300U",     threads: 8  },
579    CpuEntry { model: "Ryzen 3 3300X",     threads: 8  },
580    CpuEntry { model: "Ryzen 3 4100",      threads: 8  },
581    CpuEntry { model: "Ryzen 3 4300G",     threads: 8  },
582    CpuEntry { model: "Ryzen 3 4300GE",    threads: 8  },
583    CpuEntry { model: "Ryzen 3 4300U",     threads: 8  },
584    CpuEntry { model: "Ryzen 3 5300G",     threads: 8  },
585    CpuEntry { model: "Ryzen 3 5300GE",    threads: 8  },
586    CpuEntry { model: "Ryzen 3 5300U",     threads: 8  },
587    CpuEntry { model: "Ryzen 3 5400U",     threads: 8  },
588    CpuEntry { model: "Ryzen 3 5425C",     threads: 8  },
589    CpuEntry { model: "Ryzen 3 5425U",     threads: 8  },
590    CpuEntry { model: "Ryzen 3 7320C",     threads: 8  },
591    CpuEntry { model: "Ryzen 3 7320U",     threads: 8  },
592    CpuEntry { model: "Ryzen 3 7330U",     threads: 8  },
593    CpuEntry { model: "Ryzen 5 1400",      threads: 8  },
594    CpuEntry { model: "Ryzen 5 1500X",     threads: 8  },
595    CpuEntry { model: "Ryzen 5 1600",      threads: 12 },
596    CpuEntry { model: "Ryzen 5 1600X",     threads: 12 },
597    CpuEntry { model: "Ryzen 5 2400G",     threads: 8  },
598    CpuEntry { model: "Ryzen 5 2600",      threads: 12 },
599    CpuEntry { model: "Ryzen 5 2600X",     threads: 12 },
600    CpuEntry { model: "Ryzen 5 3400G",     threads: 8  },
601    CpuEntry { model: "Ryzen 5 3500",      threads: 6  },
602    CpuEntry { model: "Ryzen 5 3500U",     threads: 8  },
603    CpuEntry { model: "Ryzen 5 3500X",     threads: 6  },
604    CpuEntry { model: "Ryzen 5 3600",      threads: 12 },
605    CpuEntry { model: "Ryzen 5 3600X",     threads: 12 },
606    CpuEntry { model: "Ryzen 5 3600XT",    threads: 12 },
607    CpuEntry { model: "Ryzen 5 4500",      threads: 12 },
608    CpuEntry { model: "Ryzen 5 4500G",     threads: 12 },
609    CpuEntry { model: "Ryzen 5 4500GE",    threads: 12 },
610    CpuEntry { model: "Ryzen 5 4500U",     threads: 8  },
611    CpuEntry { model: "Ryzen 5 4600G",     threads: 12 },
612    CpuEntry { model: "Ryzen 5 4600GE",    threads: 12 },
613    CpuEntry { model: "Ryzen 5 4600H",     threads: 12 },
614    CpuEntry { model: "Ryzen 5 4600U",     threads: 12 },
615    CpuEntry { model: "Ryzen 5 4680U",     threads: 12 },
616    CpuEntry { model: "Ryzen 5 5500",      threads: 12 },
617    CpuEntry { model: "Ryzen 5 5500G",     threads: 12 },
618    CpuEntry { model: "Ryzen 5 5500GE",    threads: 12 },
619    CpuEntry { model: "Ryzen 5 5500U",     threads: 12 },
620    CpuEntry { model: "Ryzen 5 5505",      threads: 12 },
621    CpuEntry { model: "Ryzen 5 5600",      threads: 12 },
622    CpuEntry { model: "Ryzen 5 5600G",     threads: 12 },
623    CpuEntry { model: "Ryzen 5 5600GE",    threads: 12 },
624    CpuEntry { model: "Ryzen 5 5600H",     threads: 12 },
625    CpuEntry { model: "Ryzen 5 5600HS",    threads: 12 },
626    CpuEntry { model: "Ryzen 5 5600T",     threads: 12 },
627    CpuEntry { model: "Ryzen 5 5600U",     threads: 12 },
628    CpuEntry { model: "Ryzen 5 5600X",     threads: 12 },
629    CpuEntry { model: "Ryzen 5 5600X3D",   threads: 12 },
630    CpuEntry { model: "Ryzen 5 5625C",     threads: 12 },
631    CpuEntry { model: "Ryzen 5 5625U",     threads: 12 },
632    CpuEntry { model: "Ryzen 5 7500F",     threads: 12 },
633    CpuEntry { model: "Ryzen 5 7520C",     threads: 8  },
634    CpuEntry { model: "Ryzen 5 7520U",     threads: 8  },
635    CpuEntry { model: "Ryzen 5 7530U",     threads: 12 },
636    CpuEntry { model: "Ryzen 5 7535HS",    threads: 12 },
637    CpuEntry { model: "Ryzen 5 7535U",     threads: 12 },
638    CpuEntry { model: "Ryzen 5 7540U",     threads: 12 },
639    CpuEntry { model: "Ryzen 5 7545U",     threads: 12 },
640    CpuEntry { model: "Ryzen 5 7600",      threads: 12 },
641    CpuEntry { model: "Ryzen 5 7600X",     threads: 12 },
642    CpuEntry { model: "Ryzen 5 7600X3D",   threads: 12 },
643    CpuEntry { model: "Ryzen 5 7640HS",    threads: 12 },
644    CpuEntry { model: "Ryzen 5 7640U",     threads: 12 },
645    CpuEntry { model: "Ryzen 5 7645HX",    threads: 12 },
646    CpuEntry { model: "Ryzen 7 1700",      threads: 16 },
647    CpuEntry { model: "Ryzen 7 1700X",     threads: 16 },
648    CpuEntry { model: "Ryzen 7 1800X",     threads: 16 },
649    CpuEntry { model: "Ryzen 7 2700",      threads: 16 },
650    CpuEntry { model: "Ryzen 7 2700X",     threads: 16 },
651    CpuEntry { model: "Ryzen 7 3700U",     threads: 8  },
652    CpuEntry { model: "Ryzen 7 3700X",     threads: 16 },
653    CpuEntry { model: "Ryzen 7 3750H",     threads: 8  },
654    CpuEntry { model: "Ryzen 7 3800X",     threads: 16 },
655    CpuEntry { model: "Ryzen 7 3800XT",    threads: 16 },
656    CpuEntry { model: "Ryzen 7 3780U",     threads: 8  },
657    CpuEntry { model: "Ryzen 7 4700G",     threads: 16 },
658    CpuEntry { model: "Ryzen 7 4700GE",    threads: 16 },
659    CpuEntry { model: "Ryzen 7 4700U",     threads: 8  },
660    CpuEntry { model: "Ryzen 7 4800H",     threads: 16 },
661    CpuEntry { model: "Ryzen 7 4800HS",    threads: 16 },
662    CpuEntry { model: "Ryzen 7 4800U",     threads: 16 },
663    CpuEntry { model: "Ryzen 7 4980U",     threads: 16 },
664    CpuEntry { model: "Ryzen 7 5700G",     threads: 16 },
665    CpuEntry { model: "Ryzen 7 5700GE",    threads: 16 },
666    CpuEntry { model: "Ryzen 7 5700U",     threads: 16 },
667    CpuEntry { model: "Ryzen 7 5700X",     threads: 16 },
668    CpuEntry { model: "Ryzen 7 5700X3D",   threads: 16 },
669    CpuEntry { model: "Ryzen 7 5800",      threads: 16 },
670    CpuEntry { model: "Ryzen 7 5800H",     threads: 16 },
671    CpuEntry { model: "Ryzen 7 5800HS",    threads: 16 },
672    CpuEntry { model: "Ryzen 7 5800U",     threads: 16 },
673    CpuEntry { model: "Ryzen 7 5800X",     threads: 16 },
674    CpuEntry { model: "Ryzen 7 5800X3D",   threads: 16 },
675    CpuEntry { model: "Ryzen 7 5825C",     threads: 16 },
676    CpuEntry { model: "Ryzen 7 5825U",     threads: 16 },
677    CpuEntry { model: "Ryzen 7 7700",      threads: 16 },
678    CpuEntry { model: "Ryzen 7 7700X",     threads: 16 },
679    CpuEntry { model: "Ryzen 7 7730U",     threads: 16 },
680    CpuEntry { model: "Ryzen 7 7735HS",    threads: 16 },
681    CpuEntry { model: "Ryzen 7 7735U",     threads: 16 },
682    CpuEntry { model: "Ryzen 7 7736U",     threads: 16 },
683    CpuEntry { model: "Ryzen 7 7745HX",    threads: 16 },
684    CpuEntry { model: "Ryzen 7 7800X3D",   threads: 16 },
685    CpuEntry { model: "Ryzen 7 7840HS",    threads: 16 },
686    CpuEntry { model: "Ryzen 7 7840U",     threads: 16 },
687    CpuEntry { model: "Ryzen 9 3900",      threads: 24 },
688    CpuEntry { model: "Ryzen 9 3900X",     threads: 24 },
689    CpuEntry { model: "Ryzen 9 3900XT",    threads: 24 },
690    CpuEntry { model: "Ryzen 9 3950X",     threads: 32 },
691    CpuEntry { model: "Ryzen 9 4900H",     threads: 16 },
692    CpuEntry { model: "Ryzen 9 4900HS",    threads: 16 },
693    CpuEntry { model: "Ryzen 9 5900",      threads: 24 },
694    CpuEntry { model: "Ryzen 9 5900X",     threads: 24 },
695    CpuEntry { model: "Ryzen 9 5950X",     threads: 32 },
696    CpuEntry { model: "Ryzen 9 5900HS",    threads: 16 },
697    CpuEntry { model: "Ryzen 9 5900HX",    threads: 16 },
698    CpuEntry { model: "Ryzen 9 5980HX",    threads: 16 },
699    CpuEntry { model: "Ryzen 9 5980HS",    threads: 16 },
700    CpuEntry { model: "Ryzen 9 7900",      threads: 24 },
701    CpuEntry { model: "Ryzen 9 7900X",     threads: 24 },
702    CpuEntry { model: "Ryzen 9 7900X3D",   threads: 24 },
703    CpuEntry { model: "Ryzen 9 7940HS",    threads: 16 },
704    CpuEntry { model: "Ryzen 9 7945HX",    threads: 32 },
705    CpuEntry { model: "Ryzen 9 7945HX3D",  threads: 32 },
706    CpuEntry { model: "Ryzen 9 7950X",     threads: 32 },
707    CpuEntry { model: "Ryzen 9 7950X3D",   threads: 32 },
708    CpuEntry { model: "Threadripper 2920X",  threads: 24 },
709    CpuEntry { model: "Threadripper 2950X",  threads: 32 },
710    CpuEntry { model: "Threadripper 2970WX", threads: 48 },
711    CpuEntry { model: "Threadripper 2990WX", threads: 64 },
712    CpuEntry { model: "Threadripper 3960X",  threads: 48 },
713    CpuEntry { model: "Threadripper 3970X",  threads: 64 },
714    CpuEntry { model: "Threadripper 3990X",  threads: 128},
715    CpuEntry { model: "Threadripper PRO 3945WX", threads: 24},
716    CpuEntry { model: "Threadripper PRO 3955WX", threads: 32},
717    CpuEntry { model: "Threadripper PRO 3975WX", threads: 64},
718    CpuEntry { model: "Threadripper PRO 3995WX", threads: 128},
719    CpuEntry { model: "Threadripper PRO 5945WX", threads: 24},
720    CpuEntry { model: "Threadripper PRO 5955WX", threads: 32},
721    CpuEntry { model: "Threadripper PRO 5965WX", threads: 48},
722    CpuEntry { model: "Threadripper PRO 5975WX", threads: 64},
723    CpuEntry { model: "Threadripper PRO 5995WX", threads: 128},
724    CpuEntry { model: "Threadripper PRO 7965WX", threads: 48},
725    CpuEntry { model: "Threadripper PRO 7975WX", threads: 64},
726    CpuEntry { model: "Threadripper PRO 7985WX", threads: 128},
727    CpuEntry { model: "Threadripper PRO 7995WX", threads: 192},
728];
729
730/// Look up the expected thread count for a given CPU brand string.
731/// Returns `None` if not found in any database.
732pub fn lookup_expected_threads(brand: &str) -> Option<u32> {
733    // Intel Core
734    for e in INTEL_CORE_DB {
735        if brand.contains(e.model) {
736            return Some(e.threads);
737        }
738    }
739    // Intel Xeon
740    for e in INTEL_XEON_DB {
741        if brand.contains(e.model) {
742            return Some(e.threads);
743        }
744    }
745    // Intel Ultra
746    for e in INTEL_ULTRA_DB {
747        if brand.contains(e.model) {
748            return Some(e.threads);
749        }
750    }
751    // AMD Ryzen
752    for e in AMD_RYZEN_DB {
753        if brand.contains(e.model) {
754            return Some(e.threads);
755        }
756    }
757    None
758}