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 use base::pagesize;
8*bb4ee6a4SAndroid Build Coastguard Worker use base::Event;
9*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_arch = "x86_64", target_arch = "arm", target_arch = "aarch64"))]
10*bb4ee6a4SAndroid Build Coastguard Worker use base::FromRawDescriptor;
11*bb4ee6a4SAndroid Build Coastguard Worker use base::IntoRawDescriptor;
12*bb4ee6a4SAndroid Build Coastguard Worker use base::MappedRegion;
13*bb4ee6a4SAndroid Build Coastguard Worker use base::MemoryMappingBuilder;
14*bb4ee6a4SAndroid Build Coastguard Worker use base::SIGRTMIN;
15*bb4ee6a4SAndroid Build Coastguard Worker use kvm::dirty_log_bitmap_size;
16*bb4ee6a4SAndroid Build Coastguard Worker use kvm::Cap;
17*bb4ee6a4SAndroid Build Coastguard Worker use kvm::Datamatch;
18*bb4ee6a4SAndroid Build Coastguard Worker use kvm::IoeventAddress;
19*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
20*bb4ee6a4SAndroid Build Coastguard Worker use kvm::IrqRoute;
21*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
22*bb4ee6a4SAndroid Build Coastguard Worker use kvm::IrqSource;
23*bb4ee6a4SAndroid Build Coastguard Worker use kvm::Kvm;
24*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
25*bb4ee6a4SAndroid Build Coastguard Worker use kvm::PicId;
26*bb4ee6a4SAndroid Build Coastguard Worker use kvm::Vcpu;
27*bb4ee6a4SAndroid Build Coastguard Worker use kvm::Vm;
28*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
29*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_enable_cap;
30*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
31*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_msr_entry;
32*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
33*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::KVM_CAP_HYPERV_SYNIC;
34*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
35*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::KVM_IRQCHIP_IOAPIC;
36*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
37*bb4ee6a4SAndroid Build Coastguard Worker use libc::EINVAL;
38*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestAddress;
39*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestMemory;
40*bb4ee6a4SAndroid Build Coastguard Worker
41*bb4ee6a4SAndroid Build Coastguard Worker #[test]
dirty_log_size()42*bb4ee6a4SAndroid Build Coastguard Worker fn dirty_log_size() {
43*bb4ee6a4SAndroid Build Coastguard Worker let page_size = pagesize();
44*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(dirty_log_bitmap_size(0), 0);
45*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(dirty_log_bitmap_size(page_size), 1);
46*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(dirty_log_bitmap_size(page_size * 8), 1);
47*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(dirty_log_bitmap_size(page_size * 8 + 1), 2);
48*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(dirty_log_bitmap_size(page_size * 100), 13);
49*bb4ee6a4SAndroid Build Coastguard Worker }
50*bb4ee6a4SAndroid Build Coastguard Worker
51*bb4ee6a4SAndroid Build Coastguard Worker #[test]
new()52*bb4ee6a4SAndroid Build Coastguard Worker fn new() {
53*bb4ee6a4SAndroid Build Coastguard Worker Kvm::new().unwrap();
54*bb4ee6a4SAndroid Build Coastguard Worker }
55*bb4ee6a4SAndroid Build Coastguard Worker
56*bb4ee6a4SAndroid Build Coastguard Worker #[test]
create_vm()57*bb4ee6a4SAndroid Build Coastguard Worker fn create_vm() {
58*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
59*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), pagesize() as u64)]).unwrap();
60*bb4ee6a4SAndroid Build Coastguard Worker Vm::new(&kvm, gm).unwrap();
61*bb4ee6a4SAndroid Build Coastguard Worker }
62*bb4ee6a4SAndroid Build Coastguard Worker
63*bb4ee6a4SAndroid Build Coastguard Worker #[test]
check_extension()64*bb4ee6a4SAndroid Build Coastguard Worker fn check_extension() {
65*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
66*bb4ee6a4SAndroid Build Coastguard Worker assert!(kvm.check_extension(Cap::UserMemory));
67*bb4ee6a4SAndroid Build Coastguard Worker // I assume nobody is testing this on s390
68*bb4ee6a4SAndroid Build Coastguard Worker assert!(!kvm.check_extension(Cap::S390UserSigp));
69*bb4ee6a4SAndroid Build Coastguard Worker }
70*bb4ee6a4SAndroid Build Coastguard Worker
71*bb4ee6a4SAndroid Build Coastguard Worker #[test]
check_vm_extension()72*bb4ee6a4SAndroid Build Coastguard Worker fn check_vm_extension() {
73*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
74*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), pagesize() as u64)]).unwrap();
75*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
76*bb4ee6a4SAndroid Build Coastguard Worker assert!(vm.check_extension(Cap::UserMemory));
77*bb4ee6a4SAndroid Build Coastguard Worker // I assume nobody is testing this on s390
78*bb4ee6a4SAndroid Build Coastguard Worker assert!(!vm.check_extension(Cap::S390UserSigp));
79*bb4ee6a4SAndroid Build Coastguard Worker }
80*bb4ee6a4SAndroid Build Coastguard Worker
81*bb4ee6a4SAndroid Build Coastguard Worker #[test]
82*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
get_supported_cpuid()83*bb4ee6a4SAndroid Build Coastguard Worker fn get_supported_cpuid() {
84*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
85*bb4ee6a4SAndroid Build Coastguard Worker let mut cpuid = kvm.get_supported_cpuid().unwrap();
86*bb4ee6a4SAndroid Build Coastguard Worker let cpuid_entries = cpuid.mut_entries_slice();
87*bb4ee6a4SAndroid Build Coastguard Worker assert!(!cpuid_entries.is_empty());
88*bb4ee6a4SAndroid Build Coastguard Worker }
89*bb4ee6a4SAndroid Build Coastguard Worker
90*bb4ee6a4SAndroid Build Coastguard Worker #[test]
91*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
get_emulated_cpuid()92*bb4ee6a4SAndroid Build Coastguard Worker fn get_emulated_cpuid() {
93*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
94*bb4ee6a4SAndroid Build Coastguard Worker kvm.get_emulated_cpuid().unwrap();
95*bb4ee6a4SAndroid Build Coastguard Worker }
96*bb4ee6a4SAndroid Build Coastguard Worker
97*bb4ee6a4SAndroid Build Coastguard Worker #[test]
98*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
get_msr_index_list()99*bb4ee6a4SAndroid Build Coastguard Worker fn get_msr_index_list() {
100*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
101*bb4ee6a4SAndroid Build Coastguard Worker let msr_list = kvm.get_msr_index_list().unwrap();
102*bb4ee6a4SAndroid Build Coastguard Worker assert!(msr_list.len() >= 2);
103*bb4ee6a4SAndroid Build Coastguard Worker }
104*bb4ee6a4SAndroid Build Coastguard Worker
105*bb4ee6a4SAndroid Build Coastguard Worker #[test]
add_memory()106*bb4ee6a4SAndroid Build Coastguard Worker fn add_memory() {
107*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
108*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[
109*bb4ee6a4SAndroid Build Coastguard Worker (GuestAddress(0), pagesize() as u64),
110*bb4ee6a4SAndroid Build Coastguard Worker (GuestAddress(5 * pagesize() as u64), 5 * pagesize() as u64),
111*bb4ee6a4SAndroid Build Coastguard Worker ])
112*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
113*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = Vm::new(&kvm, gm).unwrap();
114*bb4ee6a4SAndroid Build Coastguard Worker let mem_size = pagesize();
115*bb4ee6a4SAndroid Build Coastguard Worker let mem = MemoryMappingBuilder::new(mem_size).build().unwrap();
116*bb4ee6a4SAndroid Build Coastguard Worker vm.add_memory_region(GuestAddress(pagesize() as u64), Box::new(mem), false, false)
117*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
118*bb4ee6a4SAndroid Build Coastguard Worker let mem = MemoryMappingBuilder::new(mem_size).build().unwrap();
119*bb4ee6a4SAndroid Build Coastguard Worker vm.add_memory_region(
120*bb4ee6a4SAndroid Build Coastguard Worker GuestAddress(0x10 * pagesize() as u64),
121*bb4ee6a4SAndroid Build Coastguard Worker Box::new(mem),
122*bb4ee6a4SAndroid Build Coastguard Worker false,
123*bb4ee6a4SAndroid Build Coastguard Worker false,
124*bb4ee6a4SAndroid Build Coastguard Worker )
125*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
126*bb4ee6a4SAndroid Build Coastguard Worker }
127*bb4ee6a4SAndroid Build Coastguard Worker
128*bb4ee6a4SAndroid Build Coastguard Worker #[test]
add_memory_ro()129*bb4ee6a4SAndroid Build Coastguard Worker fn add_memory_ro() {
130*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
131*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), pagesize() as u64)]).unwrap();
132*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = Vm::new(&kvm, gm).unwrap();
133*bb4ee6a4SAndroid Build Coastguard Worker let mem_size = pagesize();
134*bb4ee6a4SAndroid Build Coastguard Worker let mem = MemoryMappingBuilder::new(mem_size).build().unwrap();
135*bb4ee6a4SAndroid Build Coastguard Worker vm.add_memory_region(GuestAddress(pagesize() as u64), Box::new(mem), true, false)
136*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
137*bb4ee6a4SAndroid Build Coastguard Worker }
138*bb4ee6a4SAndroid Build Coastguard Worker
139*bb4ee6a4SAndroid Build Coastguard Worker #[test]
remove_memory_region()140*bb4ee6a4SAndroid Build Coastguard Worker fn remove_memory_region() {
141*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
142*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), pagesize() as u64)]).unwrap();
143*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = Vm::new(&kvm, gm).unwrap();
144*bb4ee6a4SAndroid Build Coastguard Worker let mem_size = pagesize();
145*bb4ee6a4SAndroid Build Coastguard Worker let mem = MemoryMappingBuilder::new(mem_size).build().unwrap();
146*bb4ee6a4SAndroid Build Coastguard Worker let mem_ptr = mem.as_ptr();
147*bb4ee6a4SAndroid Build Coastguard Worker let slot = vm
148*bb4ee6a4SAndroid Build Coastguard Worker .add_memory_region(GuestAddress(pagesize() as u64), Box::new(mem), false, false)
149*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
150*bb4ee6a4SAndroid Build Coastguard Worker let removed_mem = vm.remove_memory_region(slot).unwrap();
151*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(removed_mem.size(), mem_size);
152*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(removed_mem.as_ptr(), mem_ptr);
153*bb4ee6a4SAndroid Build Coastguard Worker }
154*bb4ee6a4SAndroid Build Coastguard Worker
155*bb4ee6a4SAndroid Build Coastguard Worker #[test]
remove_invalid_memory()156*bb4ee6a4SAndroid Build Coastguard Worker fn remove_invalid_memory() {
157*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
158*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), pagesize() as u64)]).unwrap();
159*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = Vm::new(&kvm, gm).unwrap();
160*bb4ee6a4SAndroid Build Coastguard Worker assert!(vm.remove_memory_region(0).is_err());
161*bb4ee6a4SAndroid Build Coastguard Worker }
162*bb4ee6a4SAndroid Build Coastguard Worker
163*bb4ee6a4SAndroid Build Coastguard Worker #[test]
overlap_memory()164*bb4ee6a4SAndroid Build Coastguard Worker fn overlap_memory() {
165*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
166*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 0x10 * pagesize() as u64)]).unwrap();
167*bb4ee6a4SAndroid Build Coastguard Worker let mut vm = Vm::new(&kvm, gm).unwrap();
168*bb4ee6a4SAndroid Build Coastguard Worker let mem_size = 2 * pagesize();
169*bb4ee6a4SAndroid Build Coastguard Worker let mem = MemoryMappingBuilder::new(mem_size).build().unwrap();
170*bb4ee6a4SAndroid Build Coastguard Worker assert!(vm
171*bb4ee6a4SAndroid Build Coastguard Worker .add_memory_region(
172*bb4ee6a4SAndroid Build Coastguard Worker GuestAddress(2 * pagesize() as u64),
173*bb4ee6a4SAndroid Build Coastguard Worker Box::new(mem),
174*bb4ee6a4SAndroid Build Coastguard Worker false,
175*bb4ee6a4SAndroid Build Coastguard Worker false
176*bb4ee6a4SAndroid Build Coastguard Worker )
177*bb4ee6a4SAndroid Build Coastguard Worker .is_err());
178*bb4ee6a4SAndroid Build Coastguard Worker }
179*bb4ee6a4SAndroid Build Coastguard Worker
180*bb4ee6a4SAndroid Build Coastguard Worker #[test]
get_memory()181*bb4ee6a4SAndroid Build Coastguard Worker fn get_memory() {
182*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
183*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), pagesize() as u64)]).unwrap();
184*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
185*bb4ee6a4SAndroid Build Coastguard Worker let obj_addr = GuestAddress(0xf0);
186*bb4ee6a4SAndroid Build Coastguard Worker vm.get_memory().write_obj_at_addr(67u8, obj_addr).unwrap();
187*bb4ee6a4SAndroid Build Coastguard Worker let read_val: u8 = vm.get_memory().read_obj_from_addr(obj_addr).unwrap();
188*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(read_val, 67u8);
189*bb4ee6a4SAndroid Build Coastguard Worker }
190*bb4ee6a4SAndroid Build Coastguard Worker
191*bb4ee6a4SAndroid Build Coastguard Worker #[test]
192*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
clock_handling()193*bb4ee6a4SAndroid Build Coastguard Worker fn clock_handling() {
194*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
195*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
196*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
197*bb4ee6a4SAndroid Build Coastguard Worker let mut clock_data = vm.get_clock().unwrap();
198*bb4ee6a4SAndroid Build Coastguard Worker clock_data.clock += 1000;
199*bb4ee6a4SAndroid Build Coastguard Worker vm.set_clock(&clock_data).unwrap();
200*bb4ee6a4SAndroid Build Coastguard Worker }
201*bb4ee6a4SAndroid Build Coastguard Worker
202*bb4ee6a4SAndroid Build Coastguard Worker #[test]
203*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
pic_handling()204*bb4ee6a4SAndroid Build Coastguard Worker fn pic_handling() {
205*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
206*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
207*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
208*bb4ee6a4SAndroid Build Coastguard Worker vm.create_irq_chip().unwrap();
209*bb4ee6a4SAndroid Build Coastguard Worker let pic_state = vm.get_pic_state(PicId::Secondary).unwrap();
210*bb4ee6a4SAndroid Build Coastguard Worker vm.set_pic_state(PicId::Secondary, &pic_state).unwrap();
211*bb4ee6a4SAndroid Build Coastguard Worker }
212*bb4ee6a4SAndroid Build Coastguard Worker
213*bb4ee6a4SAndroid Build Coastguard Worker #[test]
214*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
ioapic_handling()215*bb4ee6a4SAndroid Build Coastguard Worker fn ioapic_handling() {
216*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
217*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
218*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
219*bb4ee6a4SAndroid Build Coastguard Worker vm.create_irq_chip().unwrap();
220*bb4ee6a4SAndroid Build Coastguard Worker let ioapic_state = vm.get_ioapic_state().unwrap();
221*bb4ee6a4SAndroid Build Coastguard Worker vm.set_ioapic_state(&ioapic_state).unwrap();
222*bb4ee6a4SAndroid Build Coastguard Worker }
223*bb4ee6a4SAndroid Build Coastguard Worker
224*bb4ee6a4SAndroid Build Coastguard Worker #[test]
225*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
pit_handling()226*bb4ee6a4SAndroid Build Coastguard Worker fn pit_handling() {
227*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
228*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
229*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
230*bb4ee6a4SAndroid Build Coastguard Worker vm.create_irq_chip().unwrap();
231*bb4ee6a4SAndroid Build Coastguard Worker vm.create_pit().unwrap();
232*bb4ee6a4SAndroid Build Coastguard Worker let pit_state = vm.get_pit_state().unwrap();
233*bb4ee6a4SAndroid Build Coastguard Worker vm.set_pit_state(&pit_state).unwrap();
234*bb4ee6a4SAndroid Build Coastguard Worker }
235*bb4ee6a4SAndroid Build Coastguard Worker
236*bb4ee6a4SAndroid Build Coastguard Worker #[test]
register_ioevent()237*bb4ee6a4SAndroid Build Coastguard Worker fn register_ioevent() {
238*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
239*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
240*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
241*bb4ee6a4SAndroid Build Coastguard Worker let evtfd = Event::new().unwrap();
242*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(&evtfd, IoeventAddress::Pio(0xf4), Datamatch::AnyLength)
243*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
244*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(&evtfd, IoeventAddress::Mmio(0x1000), Datamatch::AnyLength)
245*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
246*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(
247*bb4ee6a4SAndroid Build Coastguard Worker &evtfd,
248*bb4ee6a4SAndroid Build Coastguard Worker IoeventAddress::Pio(0xc1),
249*bb4ee6a4SAndroid Build Coastguard Worker Datamatch::U8(Some(0x7fu8)),
250*bb4ee6a4SAndroid Build Coastguard Worker )
251*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
252*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(
253*bb4ee6a4SAndroid Build Coastguard Worker &evtfd,
254*bb4ee6a4SAndroid Build Coastguard Worker IoeventAddress::Pio(0xc2),
255*bb4ee6a4SAndroid Build Coastguard Worker Datamatch::U16(Some(0x1337u16)),
256*bb4ee6a4SAndroid Build Coastguard Worker )
257*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
258*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(
259*bb4ee6a4SAndroid Build Coastguard Worker &evtfd,
260*bb4ee6a4SAndroid Build Coastguard Worker IoeventAddress::Pio(0xc4),
261*bb4ee6a4SAndroid Build Coastguard Worker Datamatch::U32(Some(0xdeadbeefu32)),
262*bb4ee6a4SAndroid Build Coastguard Worker )
263*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
264*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(
265*bb4ee6a4SAndroid Build Coastguard Worker &evtfd,
266*bb4ee6a4SAndroid Build Coastguard Worker IoeventAddress::Pio(0xc8),
267*bb4ee6a4SAndroid Build Coastguard Worker Datamatch::U64(Some(0xdeadbeefdeadbeefu64)),
268*bb4ee6a4SAndroid Build Coastguard Worker )
269*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
270*bb4ee6a4SAndroid Build Coastguard Worker }
271*bb4ee6a4SAndroid Build Coastguard Worker
272*bb4ee6a4SAndroid Build Coastguard Worker #[test]
unregister_ioevent()273*bb4ee6a4SAndroid Build Coastguard Worker fn unregister_ioevent() {
274*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
275*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
276*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
277*bb4ee6a4SAndroid Build Coastguard Worker let evtfd = Event::new().unwrap();
278*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(&evtfd, IoeventAddress::Pio(0xf4), Datamatch::AnyLength)
279*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
280*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(&evtfd, IoeventAddress::Mmio(0x1000), Datamatch::AnyLength)
281*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
282*bb4ee6a4SAndroid Build Coastguard Worker vm.register_ioevent(
283*bb4ee6a4SAndroid Build Coastguard Worker &evtfd,
284*bb4ee6a4SAndroid Build Coastguard Worker IoeventAddress::Mmio(0x1004),
285*bb4ee6a4SAndroid Build Coastguard Worker Datamatch::U8(Some(0x7fu8)),
286*bb4ee6a4SAndroid Build Coastguard Worker )
287*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
288*bb4ee6a4SAndroid Build Coastguard Worker vm.unregister_ioevent(&evtfd, IoeventAddress::Pio(0xf4), Datamatch::AnyLength)
289*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
290*bb4ee6a4SAndroid Build Coastguard Worker vm.unregister_ioevent(&evtfd, IoeventAddress::Mmio(0x1000), Datamatch::AnyLength)
291*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
292*bb4ee6a4SAndroid Build Coastguard Worker vm.unregister_ioevent(
293*bb4ee6a4SAndroid Build Coastguard Worker &evtfd,
294*bb4ee6a4SAndroid Build Coastguard Worker IoeventAddress::Mmio(0x1004),
295*bb4ee6a4SAndroid Build Coastguard Worker Datamatch::U8(Some(0x7fu8)),
296*bb4ee6a4SAndroid Build Coastguard Worker )
297*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
298*bb4ee6a4SAndroid Build Coastguard Worker }
299*bb4ee6a4SAndroid Build Coastguard Worker
300*bb4ee6a4SAndroid Build Coastguard Worker #[test]
301*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_arch = "x86_64", target_arch = "arm", target_arch = "aarch64"))]
irqfd_resample()302*bb4ee6a4SAndroid Build Coastguard Worker fn irqfd_resample() {
303*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
304*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
305*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
306*bb4ee6a4SAndroid Build Coastguard Worker let evtfd1 = Event::new().unwrap();
307*bb4ee6a4SAndroid Build Coastguard Worker let evtfd2 = Event::new().unwrap();
308*bb4ee6a4SAndroid Build Coastguard Worker vm.create_irq_chip().unwrap();
309*bb4ee6a4SAndroid Build Coastguard Worker vm.register_irqfd_resample(&evtfd1, &evtfd2, 4).unwrap();
310*bb4ee6a4SAndroid Build Coastguard Worker vm.unregister_irqfd(&evtfd1, 4).unwrap();
311*bb4ee6a4SAndroid Build Coastguard Worker
312*bb4ee6a4SAndroid Build Coastguard Worker // Ensures the ioctl is actually reading the resamplefd by providing an invalid fd and expecting
313*bb4ee6a4SAndroid Build Coastguard Worker // an error. File descriptor numbers are allocated sequentially, so this very large fd should
314*bb4ee6a4SAndroid Build Coastguard Worker // never practically be in use.
315*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: This is a bad idea! Don't try this at home! Professional driver on a closed course.
316*bb4ee6a4SAndroid Build Coastguard Worker let resample_evt = unsafe { Event::from_raw_descriptor(2147483647) };
317*bb4ee6a4SAndroid Build Coastguard Worker vm.register_irqfd_resample(&evtfd1, &resample_evt, 4)
318*bb4ee6a4SAndroid Build Coastguard Worker .unwrap_err();
319*bb4ee6a4SAndroid Build Coastguard Worker let _ = resample_evt.into_raw_descriptor(); // Don't try to close the invalid fd.
320*bb4ee6a4SAndroid Build Coastguard Worker }
321*bb4ee6a4SAndroid Build Coastguard Worker
322*bb4ee6a4SAndroid Build Coastguard Worker #[test]
323*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
set_gsi_routing()324*bb4ee6a4SAndroid Build Coastguard Worker fn set_gsi_routing() {
325*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
326*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
327*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
328*bb4ee6a4SAndroid Build Coastguard Worker vm.create_irq_chip().unwrap();
329*bb4ee6a4SAndroid Build Coastguard Worker vm.set_gsi_routing(&[]).unwrap();
330*bb4ee6a4SAndroid Build Coastguard Worker vm.set_gsi_routing(&[IrqRoute {
331*bb4ee6a4SAndroid Build Coastguard Worker gsi: 1,
332*bb4ee6a4SAndroid Build Coastguard Worker source: IrqSource::Irqchip {
333*bb4ee6a4SAndroid Build Coastguard Worker chip: KVM_IRQCHIP_IOAPIC,
334*bb4ee6a4SAndroid Build Coastguard Worker pin: 3,
335*bb4ee6a4SAndroid Build Coastguard Worker },
336*bb4ee6a4SAndroid Build Coastguard Worker }])
337*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
338*bb4ee6a4SAndroid Build Coastguard Worker vm.set_gsi_routing(&[IrqRoute {
339*bb4ee6a4SAndroid Build Coastguard Worker gsi: 1,
340*bb4ee6a4SAndroid Build Coastguard Worker source: IrqSource::Msi {
341*bb4ee6a4SAndroid Build Coastguard Worker address: 0xf000000,
342*bb4ee6a4SAndroid Build Coastguard Worker data: 0xa0,
343*bb4ee6a4SAndroid Build Coastguard Worker },
344*bb4ee6a4SAndroid Build Coastguard Worker }])
345*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
346*bb4ee6a4SAndroid Build Coastguard Worker vm.set_gsi_routing(&[
347*bb4ee6a4SAndroid Build Coastguard Worker IrqRoute {
348*bb4ee6a4SAndroid Build Coastguard Worker gsi: 1,
349*bb4ee6a4SAndroid Build Coastguard Worker source: IrqSource::Irqchip {
350*bb4ee6a4SAndroid Build Coastguard Worker chip: KVM_IRQCHIP_IOAPIC,
351*bb4ee6a4SAndroid Build Coastguard Worker pin: 3,
352*bb4ee6a4SAndroid Build Coastguard Worker },
353*bb4ee6a4SAndroid Build Coastguard Worker },
354*bb4ee6a4SAndroid Build Coastguard Worker IrqRoute {
355*bb4ee6a4SAndroid Build Coastguard Worker gsi: 2,
356*bb4ee6a4SAndroid Build Coastguard Worker source: IrqSource::Msi {
357*bb4ee6a4SAndroid Build Coastguard Worker address: 0xf000000,
358*bb4ee6a4SAndroid Build Coastguard Worker data: 0xa0,
359*bb4ee6a4SAndroid Build Coastguard Worker },
360*bb4ee6a4SAndroid Build Coastguard Worker },
361*bb4ee6a4SAndroid Build Coastguard Worker ])
362*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
363*bb4ee6a4SAndroid Build Coastguard Worker }
364*bb4ee6a4SAndroid Build Coastguard Worker
365*bb4ee6a4SAndroid Build Coastguard Worker #[test]
create_vcpu()366*bb4ee6a4SAndroid Build Coastguard Worker fn create_vcpu() {
367*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
368*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
369*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
370*bb4ee6a4SAndroid Build Coastguard Worker Vcpu::new(0, &kvm, &vm).unwrap();
371*bb4ee6a4SAndroid Build Coastguard Worker }
372*bb4ee6a4SAndroid Build Coastguard Worker
373*bb4ee6a4SAndroid Build Coastguard Worker #[test]
374*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
debugregs()375*bb4ee6a4SAndroid Build Coastguard Worker fn debugregs() {
376*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
377*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
378*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
379*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
380*bb4ee6a4SAndroid Build Coastguard Worker let mut dregs = vcpu.get_debugregs().unwrap();
381*bb4ee6a4SAndroid Build Coastguard Worker dregs.dr7 = 13;
382*bb4ee6a4SAndroid Build Coastguard Worker vcpu.set_debugregs(&dregs).unwrap();
383*bb4ee6a4SAndroid Build Coastguard Worker let dregs2 = vcpu.get_debugregs().unwrap();
384*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(dregs.dr7, dregs2.dr7);
385*bb4ee6a4SAndroid Build Coastguard Worker }
386*bb4ee6a4SAndroid Build Coastguard Worker
387*bb4ee6a4SAndroid Build Coastguard Worker #[test]
388*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
xcrs()389*bb4ee6a4SAndroid Build Coastguard Worker fn xcrs() {
390*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
391*bb4ee6a4SAndroid Build Coastguard Worker if !kvm.check_extension(Cap::Xcrs) {
392*bb4ee6a4SAndroid Build Coastguard Worker return;
393*bb4ee6a4SAndroid Build Coastguard Worker }
394*bb4ee6a4SAndroid Build Coastguard Worker
395*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
396*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
397*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
398*bb4ee6a4SAndroid Build Coastguard Worker let mut xcrs = vcpu.get_xcrs().unwrap();
399*bb4ee6a4SAndroid Build Coastguard Worker xcrs.xcrs[0].value = 1;
400*bb4ee6a4SAndroid Build Coastguard Worker vcpu.set_xcrs(&xcrs).unwrap();
401*bb4ee6a4SAndroid Build Coastguard Worker let xcrs2 = vcpu.get_xcrs().unwrap();
402*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(xcrs.xcrs[0].value, xcrs2.xcrs[0].value);
403*bb4ee6a4SAndroid Build Coastguard Worker }
404*bb4ee6a4SAndroid Build Coastguard Worker
405*bb4ee6a4SAndroid Build Coastguard Worker #[test]
406*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
get_msrs()407*bb4ee6a4SAndroid Build Coastguard Worker fn get_msrs() {
408*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
409*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
410*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
411*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
412*bb4ee6a4SAndroid Build Coastguard Worker let mut msrs = vec![
413*bb4ee6a4SAndroid Build Coastguard Worker // This one should succeed
414*bb4ee6a4SAndroid Build Coastguard Worker kvm_msr_entry {
415*bb4ee6a4SAndroid Build Coastguard Worker index: 0x0000011e,
416*bb4ee6a4SAndroid Build Coastguard Worker ..Default::default()
417*bb4ee6a4SAndroid Build Coastguard Worker },
418*bb4ee6a4SAndroid Build Coastguard Worker // This one will fail to fetch
419*bb4ee6a4SAndroid Build Coastguard Worker kvm_msr_entry {
420*bb4ee6a4SAndroid Build Coastguard Worker index: 0xffffffff,
421*bb4ee6a4SAndroid Build Coastguard Worker ..Default::default()
422*bb4ee6a4SAndroid Build Coastguard Worker },
423*bb4ee6a4SAndroid Build Coastguard Worker ];
424*bb4ee6a4SAndroid Build Coastguard Worker vcpu.get_msrs(&mut msrs).unwrap();
425*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(msrs.len(), 1);
426*bb4ee6a4SAndroid Build Coastguard Worker }
427*bb4ee6a4SAndroid Build Coastguard Worker
428*bb4ee6a4SAndroid Build Coastguard Worker #[test]
429*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
get_hyperv_cpuid()430*bb4ee6a4SAndroid Build Coastguard Worker fn get_hyperv_cpuid() {
431*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
432*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
433*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
434*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
435*bb4ee6a4SAndroid Build Coastguard Worker let cpuid = vcpu.get_hyperv_cpuid();
436*bb4ee6a4SAndroid Build Coastguard Worker // Older kernels don't support so tolerate this kind of failure.
437*bb4ee6a4SAndroid Build Coastguard Worker match cpuid {
438*bb4ee6a4SAndroid Build Coastguard Worker Ok(_) => {}
439*bb4ee6a4SAndroid Build Coastguard Worker Err(e) => {
440*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(e.errno(), EINVAL);
441*bb4ee6a4SAndroid Build Coastguard Worker }
442*bb4ee6a4SAndroid Build Coastguard Worker }
443*bb4ee6a4SAndroid Build Coastguard Worker }
444*bb4ee6a4SAndroid Build Coastguard Worker
445*bb4ee6a4SAndroid Build Coastguard Worker #[test]
446*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
enable_feature()447*bb4ee6a4SAndroid Build Coastguard Worker fn enable_feature() {
448*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
449*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
450*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
451*bb4ee6a4SAndroid Build Coastguard Worker vm.create_irq_chip().unwrap();
452*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
453*bb4ee6a4SAndroid Build Coastguard Worker let cap: kvm_enable_cap = kvm_sys::kvm_enable_cap {
454*bb4ee6a4SAndroid Build Coastguard Worker cap: KVM_CAP_HYPERV_SYNIC,
455*bb4ee6a4SAndroid Build Coastguard Worker ..Default::default()
456*bb4ee6a4SAndroid Build Coastguard Worker };
457*bb4ee6a4SAndroid Build Coastguard Worker // TODO(b/315998194): Add safety comment
458*bb4ee6a4SAndroid Build Coastguard Worker #[allow(clippy::undocumented_unsafe_blocks)]
459*bb4ee6a4SAndroid Build Coastguard Worker unsafe { vcpu.kvm_enable_cap(&cap) }.unwrap();
460*bb4ee6a4SAndroid Build Coastguard Worker }
461*bb4ee6a4SAndroid Build Coastguard Worker
462*bb4ee6a4SAndroid Build Coastguard Worker #[test]
463*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
mp_state()464*bb4ee6a4SAndroid Build Coastguard Worker fn mp_state() {
465*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
466*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
467*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
468*bb4ee6a4SAndroid Build Coastguard Worker vm.create_irq_chip().unwrap();
469*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
470*bb4ee6a4SAndroid Build Coastguard Worker let state = vcpu.get_mp_state().unwrap();
471*bb4ee6a4SAndroid Build Coastguard Worker vcpu.set_mp_state(&state).unwrap();
472*bb4ee6a4SAndroid Build Coastguard Worker }
473*bb4ee6a4SAndroid Build Coastguard Worker
474*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_signal_mask()475*bb4ee6a4SAndroid Build Coastguard Worker fn set_signal_mask() {
476*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
477*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
478*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
479*bb4ee6a4SAndroid Build Coastguard Worker let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
480*bb4ee6a4SAndroid Build Coastguard Worker vcpu.set_signal_mask(&[SIGRTMIN() + 0]).unwrap();
481*bb4ee6a4SAndroid Build Coastguard Worker }
482*bb4ee6a4SAndroid Build Coastguard Worker
483*bb4ee6a4SAndroid Build Coastguard Worker #[test]
vcpu_mmap_size()484*bb4ee6a4SAndroid Build Coastguard Worker fn vcpu_mmap_size() {
485*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
486*bb4ee6a4SAndroid Build Coastguard Worker let mmap_size = kvm.get_vcpu_mmap_size().unwrap();
487*bb4ee6a4SAndroid Build Coastguard Worker let page_size = pagesize();
488*bb4ee6a4SAndroid Build Coastguard Worker assert!(mmap_size >= page_size);
489*bb4ee6a4SAndroid Build Coastguard Worker assert!(mmap_size % page_size == 0);
490*bb4ee6a4SAndroid Build Coastguard Worker }
491*bb4ee6a4SAndroid Build Coastguard Worker
492*bb4ee6a4SAndroid Build Coastguard Worker #[test]
493*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")]
set_identity_map_addr()494*bb4ee6a4SAndroid Build Coastguard Worker fn set_identity_map_addr() {
495*bb4ee6a4SAndroid Build Coastguard Worker let kvm = Kvm::new().unwrap();
496*bb4ee6a4SAndroid Build Coastguard Worker let gm = GuestMemory::new(&[(GuestAddress(0), 10 * pagesize() as u64)]).unwrap();
497*bb4ee6a4SAndroid Build Coastguard Worker let vm = Vm::new(&kvm, gm).unwrap();
498*bb4ee6a4SAndroid Build Coastguard Worker vm.set_identity_map_addr(GuestAddress(20 * pagesize() as u64))
499*bb4ee6a4SAndroid Build Coastguard Worker .unwrap();
500*bb4ee6a4SAndroid Build Coastguard Worker }
501