1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(any(target_os = "android", target_os = "linux"))]
6*bb4ee6a4SAndroid Build Coastguard Worker
7*bb4ee6a4SAndroid Build Coastguard Worker mod x86_64;
8*bb4ee6a4SAndroid Build Coastguard Worker
9*bb4ee6a4SAndroid Build Coastguard Worker use devices::irqchip::IrqChip;
10*bb4ee6a4SAndroid Build Coastguard Worker use devices::irqchip::KvmKernelIrqChip;
11*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::kvm::Kvm;
12*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::kvm::KvmVm;
13*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::MPState;
14*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::Vm;
15*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
16*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::VmAArch64;
17*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "riscv64")]
18*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::VmRiscv64;
19*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
20*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::VmX86_64;
21*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestMemory;
22*bb4ee6a4SAndroid Build Coastguard Worker
23*bb4ee6a4SAndroid Build Coastguard Worker #[test]
create_kvm_kernel_irqchip()24*bb4ee6a4SAndroid Build Coastguard Worker fn create_kvm_kernel_irqchip() {
25*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().expect("failed to instantiate Kvm");
26*bb4ee6a4SAndroid Build Coastguard Worker let mem = GuestMemory::new(&[]).unwrap();
27*bb4ee6a4SAndroid Build Coastguard Worker let vm = KvmVm::new(&kvm, mem, Default::default()).expect("failed to instantiate vm");
28*bb4ee6a4SAndroid Build Coastguard Worker
29*bb4ee6a4SAndroid Build Coastguard Worker let mut chip = KvmKernelIrqChip::new(vm.try_clone().expect("failed to clone vm"), 1)
30*bb4ee6a4SAndroid Build Coastguard Worker .expect("failed to instantiate KvmKernelIrqChip");
31*bb4ee6a4SAndroid Build Coastguard Worker
32*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = vm.create_vcpu(0).expect("failed to instantiate vcpu");
33*bb4ee6a4SAndroid Build Coastguard Worker chip.add_vcpu(0, vcpu.as_vcpu())
34*bb4ee6a4SAndroid Build Coastguard Worker .expect("failed to add vcpu");
35*bb4ee6a4SAndroid Build Coastguard Worker }
36*bb4ee6a4SAndroid Build Coastguard Worker
37*bb4ee6a4SAndroid Build Coastguard Worker #[test]
mp_state()38*bb4ee6a4SAndroid Build Coastguard Worker fn mp_state() {
39*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().expect("failed to instantiate Kvm");
40*bb4ee6a4SAndroid Build Coastguard Worker let mem = GuestMemory::new(&[]).unwrap();
41*bb4ee6a4SAndroid Build Coastguard Worker let vm = KvmVm::new(&kvm, mem, Default::default()).expect("failed to instantiate vm");
42*bb4ee6a4SAndroid Build Coastguard Worker
43*bb4ee6a4SAndroid Build Coastguard Worker let mut chip = KvmKernelIrqChip::new(vm.try_clone().expect("failed to clone vm"), 1)
44*bb4ee6a4SAndroid Build Coastguard Worker .expect("failed to instantiate KvmKernelIrqChip");
45*bb4ee6a4SAndroid Build Coastguard Worker
46*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = vm.create_vcpu(0).expect("failed to instantiate vcpu");
47*bb4ee6a4SAndroid Build Coastguard Worker chip.add_vcpu(0, vcpu.as_vcpu())
48*bb4ee6a4SAndroid Build Coastguard Worker .expect("failed to add vcpu");
49*bb4ee6a4SAndroid Build Coastguard Worker
50*bb4ee6a4SAndroid Build Coastguard Worker let state = chip.get_mp_state(0).expect("failed to get mp state");
51*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(state, MPState::Runnable);
52*bb4ee6a4SAndroid Build Coastguard Worker
53*bb4ee6a4SAndroid Build Coastguard Worker let new_mpstate = if cfg!(any(target_arch = "arm", target_arch = "aarch64")) {
54*bb4ee6a4SAndroid Build Coastguard Worker MPState::Stopped
55*bb4ee6a4SAndroid Build Coastguard Worker } else if cfg!(target_arch = "x86_64") {
56*bb4ee6a4SAndroid Build Coastguard Worker MPState::Halted
57*bb4ee6a4SAndroid Build Coastguard Worker } else {
58*bb4ee6a4SAndroid Build Coastguard Worker unimplemented!();
59*bb4ee6a4SAndroid Build Coastguard Worker };
60*bb4ee6a4SAndroid Build Coastguard Worker
61*bb4ee6a4SAndroid Build Coastguard Worker chip.set_mp_state(0, &new_mpstate)
62*bb4ee6a4SAndroid Build Coastguard Worker .expect("failed to set mp state");
63*bb4ee6a4SAndroid Build Coastguard Worker
64*bb4ee6a4SAndroid Build Coastguard Worker let state = chip.get_mp_state(0).expect("failed to get mp state");
65*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(state, new_mpstate);
66*bb4ee6a4SAndroid Build Coastguard Worker }
67