1 // Copyright 2022 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #![cfg(all(unix, target_arch = "x86_64"))]
6
7 use std::arch::x86_64::CpuidResult;
8 use std::arch::x86_64::__cpuid;
9 use std::arch::x86_64::__cpuid_count;
10
11 use hypervisor::CpuConfigX86_64;
12 use x86_64::cpuid::filter_cpuid;
13 use x86_64::cpuid::EBX_CLFLUSH_CACHELINE;
14 use x86_64::cpuid::EBX_CLFLUSH_SIZE_SHIFT;
15 use x86_64::cpuid::EBX_CPUID_SHIFT;
16 use x86_64::cpuid::EBX_CPU_COUNT_SHIFT;
17 use x86_64::cpuid::ECX_HYPERVISOR_SHIFT;
18 use x86_64::cpuid::EDX_HTT_SHIFT;
19 use x86_64::CpuIdContext;
20
21 #[test]
feature_and_vendor_name()22 fn feature_and_vendor_name() {
23 let mut cpuid = hypervisor::CpuId::new(2);
24 let guest_mem = vm_memory::GuestMemory::new(&[(vm_memory::GuestAddress(0), 0x10000)]).unwrap();
25 let kvm = hypervisor::kvm::Kvm::new().unwrap();
26 let vm = hypervisor::kvm::KvmVm::new(&kvm, guest_mem, Default::default()).unwrap();
27 let irq_chip = devices::KvmKernelIrqChip::new(vm, 1).unwrap();
28
29 let entries = &mut cpuid.cpu_id_entries;
30 entries.push(hypervisor::CpuIdEntry {
31 function: 0,
32 index: 0,
33 flags: 0,
34 cpuid: CpuidResult {
35 eax: 0,
36 ebx: 0,
37 ecx: 0,
38 edx: 0,
39 },
40 });
41 entries.push(hypervisor::CpuIdEntry {
42 function: 1,
43 index: 0,
44 flags: 0,
45 cpuid: CpuidResult {
46 eax: 0,
47 ebx: 0,
48 ecx: 0x10,
49 edx: 0,
50 },
51 });
52
53 let cpu_config = CpuConfigX86_64::new(false, false, false, false, false, None);
54 filter_cpuid(
55 &mut cpuid,
56 &CpuIdContext::new(
57 1,
58 2,
59 Some(&irq_chip),
60 cpu_config,
61 false,
62 __cpuid_count,
63 __cpuid,
64 ),
65 );
66
67 let entries = &mut cpuid.cpu_id_entries;
68 assert_eq!(entries[0].function, 0);
69 assert_eq!(1, (entries[1].cpuid.ebx >> EBX_CPUID_SHIFT) & 0x000000ff);
70 assert_eq!(
71 2,
72 (entries[1].cpuid.ebx >> EBX_CPU_COUNT_SHIFT) & 0x000000ff
73 );
74 assert_eq!(
75 EBX_CLFLUSH_CACHELINE,
76 (entries[1].cpuid.ebx >> EBX_CLFLUSH_SIZE_SHIFT) & 0x000000ff
77 );
78 assert_ne!(0, entries[1].cpuid.ecx & (1 << ECX_HYPERVISOR_SHIFT));
79 assert_ne!(0, entries[1].cpuid.edx & (1 << EDX_HTT_SHIFT));
80 }
81