• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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