xref: /aosp_15_r20/external/crosvm/devices/tests/irqchip/kvm/mod.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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(any(target_os = "android", target_os = "linux"))]
6 
7 mod x86_64;
8 
9 use devices::irqchip::IrqChip;
10 use devices::irqchip::KvmKernelIrqChip;
11 use hypervisor::kvm::Kvm;
12 use hypervisor::kvm::KvmVm;
13 use hypervisor::MPState;
14 use hypervisor::Vm;
15 #[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
16 use hypervisor::VmAArch64;
17 #[cfg(target_arch = "riscv64")]
18 use hypervisor::VmRiscv64;
19 #[cfg(target_arch = "x86_64")]
20 use hypervisor::VmX86_64;
21 use vm_memory::GuestMemory;
22 
23 #[test]
create_kvm_kernel_irqchip()24 fn create_kvm_kernel_irqchip() {
25     let kvm = Kvm::new().expect("failed to instantiate Kvm");
26     let mem = GuestMemory::new(&[]).unwrap();
27     let vm = KvmVm::new(&kvm, mem, Default::default()).expect("failed to instantiate vm");
28 
29     let mut chip = KvmKernelIrqChip::new(vm.try_clone().expect("failed to clone vm"), 1)
30         .expect("failed to instantiate KvmKernelIrqChip");
31 
32     let vcpu = vm.create_vcpu(0).expect("failed to instantiate vcpu");
33     chip.add_vcpu(0, vcpu.as_vcpu())
34         .expect("failed to add vcpu");
35 }
36 
37 #[test]
mp_state()38 fn mp_state() {
39     let kvm = Kvm::new().expect("failed to instantiate Kvm");
40     let mem = GuestMemory::new(&[]).unwrap();
41     let vm = KvmVm::new(&kvm, mem, Default::default()).expect("failed to instantiate vm");
42 
43     let mut chip = KvmKernelIrqChip::new(vm.try_clone().expect("failed to clone vm"), 1)
44         .expect("failed to instantiate KvmKernelIrqChip");
45 
46     let vcpu = vm.create_vcpu(0).expect("failed to instantiate vcpu");
47     chip.add_vcpu(0, vcpu.as_vcpu())
48         .expect("failed to add vcpu");
49 
50     let state = chip.get_mp_state(0).expect("failed to get mp state");
51     assert_eq!(state, MPState::Runnable);
52 
53     let new_mpstate = if cfg!(any(target_arch = "arm", target_arch = "aarch64")) {
54         MPState::Stopped
55     } else if cfg!(target_arch = "x86_64") {
56         MPState::Halted
57     } else {
58         unimplemented!();
59     };
60 
61     chip.set_mp_state(0, &new_mpstate)
62         .expect("failed to set mp state");
63 
64     let state = chip.get_mp_state(0).expect("failed to get mp state");
65     assert_eq!(state, new_mpstate);
66 }
67