xref: /aosp_15_r20/external/crosvm/swap/tests/main.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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 //! Integration tests for vmm-swap feature
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(all(unix, feature = "enable"))]
8*bb4ee6a4SAndroid Build Coastguard Worker mod common;
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(all(unix, feature = "enable"))]
11*bb4ee6a4SAndroid Build Coastguard Worker mod test {
12*bb4ee6a4SAndroid Build Coastguard Worker     use std::time::Duration;
13*bb4ee6a4SAndroid Build Coastguard Worker 
14*bb4ee6a4SAndroid Build Coastguard Worker     use base::pagesize;
15*bb4ee6a4SAndroid Build Coastguard Worker     use base::sys::wait_for_pid;
16*bb4ee6a4SAndroid Build Coastguard Worker     use base::AsRawDescriptor;
17*bb4ee6a4SAndroid Build Coastguard Worker     use base::FromRawDescriptor;
18*bb4ee6a4SAndroid Build Coastguard Worker     use base::IntoRawDescriptor;
19*bb4ee6a4SAndroid Build Coastguard Worker     use base::SafeDescriptor;
20*bb4ee6a4SAndroid Build Coastguard Worker     use base::Tube;
21*bb4ee6a4SAndroid Build Coastguard Worker     use swap::userfaultfd::register_regions;
22*bb4ee6a4SAndroid Build Coastguard Worker     use swap::userfaultfd::unregister_regions;
23*bb4ee6a4SAndroid Build Coastguard Worker     use swap::userfaultfd::Userfaultfd;
24*bb4ee6a4SAndroid Build Coastguard Worker     use swap::SwapController;
25*bb4ee6a4SAndroid Build Coastguard Worker     use swap::SwapState;
26*bb4ee6a4SAndroid Build Coastguard Worker     use vm_memory::GuestAddress;
27*bb4ee6a4SAndroid Build Coastguard Worker     use vm_memory::GuestMemory;
28*bb4ee6a4SAndroid Build Coastguard Worker     use vm_memory::MemoryRegionOptions;
29*bb4ee6a4SAndroid Build Coastguard Worker 
30*bb4ee6a4SAndroid Build Coastguard Worker     use super::common::*;
31*bb4ee6a4SAndroid Build Coastguard Worker 
register_region_skip_obsolete_process()32*bb4ee6a4SAndroid Build Coastguard Worker     pub fn register_region_skip_obsolete_process() {
33*bb4ee6a4SAndroid Build Coastguard Worker         let shm = create_shared_memory("test", 3 * pagesize());
34*bb4ee6a4SAndroid Build Coastguard Worker         let uffd = create_uffd_for_test();
35*bb4ee6a4SAndroid Build Coastguard Worker         let base_addr = shm.base_addr();
36*bb4ee6a4SAndroid Build Coastguard Worker         let region = base_addr..(base_addr + 3 * pagesize());
37*bb4ee6a4SAndroid Build Coastguard Worker         let regions = [region];
38*bb4ee6a4SAndroid Build Coastguard Worker         let (tube_main, tube_child) = Tube::pair().unwrap();
39*bb4ee6a4SAndroid Build Coastguard Worker         // SAFETY: trivially safe
40*bb4ee6a4SAndroid Build Coastguard Worker         let pid = unsafe { libc::fork() };
41*bb4ee6a4SAndroid Build Coastguard Worker         if pid == 0 {
42*bb4ee6a4SAndroid Build Coastguard Worker             // child process
43*bb4ee6a4SAndroid Build Coastguard Worker             let uffd = create_uffd_for_test();
44*bb4ee6a4SAndroid Build Coastguard Worker             // TODO(b/315998194): Add safety comment
45*bb4ee6a4SAndroid Build Coastguard Worker             #[allow(clippy::undocumented_unsafe_blocks)]
46*bb4ee6a4SAndroid Build Coastguard Worker             tube_child
47*bb4ee6a4SAndroid Build Coastguard Worker                 .send(&unsafe { SafeDescriptor::from_raw_descriptor(uffd.as_raw_descriptor()) })
48*bb4ee6a4SAndroid Build Coastguard Worker                 .unwrap();
49*bb4ee6a4SAndroid Build Coastguard Worker             std::process::exit(0);
50*bb4ee6a4SAndroid Build Coastguard Worker         }
51*bb4ee6a4SAndroid Build Coastguard Worker         let uffd_descriptor = tube_main
52*bb4ee6a4SAndroid Build Coastguard Worker             .recv::<SafeDescriptor>()
53*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap()
54*bb4ee6a4SAndroid Build Coastguard Worker             .into_raw_descriptor();
55*bb4ee6a4SAndroid Build Coastguard Worker         wait_for_pid(pid, 0).unwrap();
56*bb4ee6a4SAndroid Build Coastguard Worker         // TODO(b/315998194): Add safety comment
57*bb4ee6a4SAndroid Build Coastguard Worker         #[allow(clippy::undocumented_unsafe_blocks)]
58*bb4ee6a4SAndroid Build Coastguard Worker         let uffd_child = unsafe { Userfaultfd::from_raw_descriptor(uffd_descriptor) };
59*bb4ee6a4SAndroid Build Coastguard Worker 
60*bb4ee6a4SAndroid Build Coastguard Worker         // TODO(b/315998194): Add safety comment
61*bb4ee6a4SAndroid Build Coastguard Worker         #[allow(clippy::undocumented_unsafe_blocks)]
62*bb4ee6a4SAndroid Build Coastguard Worker         let result = unsafe { register_regions(&regions, &[uffd, uffd_child]) };
63*bb4ee6a4SAndroid Build Coastguard Worker 
64*bb4ee6a4SAndroid Build Coastguard Worker         // no error from ENOMEM
65*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(result.is_ok(), true);
66*bb4ee6a4SAndroid Build Coastguard Worker     }
67*bb4ee6a4SAndroid Build Coastguard Worker 
unregister_region_skip_obsolete_process()68*bb4ee6a4SAndroid Build Coastguard Worker     pub fn unregister_region_skip_obsolete_process() {
69*bb4ee6a4SAndroid Build Coastguard Worker         let shm = create_shared_memory("test", 3 * pagesize());
70*bb4ee6a4SAndroid Build Coastguard Worker         let uffd = create_uffd_for_test();
71*bb4ee6a4SAndroid Build Coastguard Worker         let base_addr = shm.base_addr();
72*bb4ee6a4SAndroid Build Coastguard Worker         let region = base_addr..(base_addr + 3 * pagesize());
73*bb4ee6a4SAndroid Build Coastguard Worker         let regions = [region];
74*bb4ee6a4SAndroid Build Coastguard Worker         let (tube_main, tube_child) = Tube::pair().unwrap();
75*bb4ee6a4SAndroid Build Coastguard Worker         // SAFETY: trivially safe
76*bb4ee6a4SAndroid Build Coastguard Worker         let pid = unsafe { libc::fork() };
77*bb4ee6a4SAndroid Build Coastguard Worker         if pid == 0 {
78*bb4ee6a4SAndroid Build Coastguard Worker             // child process
79*bb4ee6a4SAndroid Build Coastguard Worker             let uffd = create_uffd_for_test();
80*bb4ee6a4SAndroid Build Coastguard Worker             // TODO(b/315998194): Add safety comment
81*bb4ee6a4SAndroid Build Coastguard Worker             #[allow(clippy::undocumented_unsafe_blocks)]
82*bb4ee6a4SAndroid Build Coastguard Worker             tube_child
83*bb4ee6a4SAndroid Build Coastguard Worker                 .send(&unsafe { SafeDescriptor::from_raw_descriptor(uffd.as_raw_descriptor()) })
84*bb4ee6a4SAndroid Build Coastguard Worker                 .unwrap();
85*bb4ee6a4SAndroid Build Coastguard Worker             tube_child.recv::<u8>().unwrap();
86*bb4ee6a4SAndroid Build Coastguard Worker             std::process::exit(0);
87*bb4ee6a4SAndroid Build Coastguard Worker         }
88*bb4ee6a4SAndroid Build Coastguard Worker         let uffd_descriptor = tube_main
89*bb4ee6a4SAndroid Build Coastguard Worker             .recv::<SafeDescriptor>()
90*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap()
91*bb4ee6a4SAndroid Build Coastguard Worker             .into_raw_descriptor();
92*bb4ee6a4SAndroid Build Coastguard Worker         // TODO(b/315998194): Add safety comment
93*bb4ee6a4SAndroid Build Coastguard Worker         #[allow(clippy::undocumented_unsafe_blocks)]
94*bb4ee6a4SAndroid Build Coastguard Worker         let uffd_child = unsafe { Userfaultfd::from_raw_descriptor(uffd_descriptor) };
95*bb4ee6a4SAndroid Build Coastguard Worker         let uffds = [uffd, uffd_child];
96*bb4ee6a4SAndroid Build Coastguard Worker 
97*bb4ee6a4SAndroid Build Coastguard Worker         // TODO(b/315998194): Add safety comment
98*bb4ee6a4SAndroid Build Coastguard Worker         #[allow(clippy::undocumented_unsafe_blocks)]
99*bb4ee6a4SAndroid Build Coastguard Worker         unsafe { register_regions(&regions, &uffds) }.unwrap();
100*bb4ee6a4SAndroid Build Coastguard Worker         tube_main.send(&0_u8).unwrap();
101*bb4ee6a4SAndroid Build Coastguard Worker         // wait until the child process die and the uffd_child become obsolete.
102*bb4ee6a4SAndroid Build Coastguard Worker         wait_for_pid(pid, 0).unwrap();
103*bb4ee6a4SAndroid Build Coastguard Worker         let result = unregister_regions(&regions, &uffds);
104*bb4ee6a4SAndroid Build Coastguard Worker 
105*bb4ee6a4SAndroid Build Coastguard Worker         // no error from ENOMEM
106*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(result.is_ok(), true);
107*bb4ee6a4SAndroid Build Coastguard Worker     }
108*bb4ee6a4SAndroid Build Coastguard Worker 
create_guest_memory() -> GuestMemory109*bb4ee6a4SAndroid Build Coastguard Worker     fn create_guest_memory() -> GuestMemory {
110*bb4ee6a4SAndroid Build Coastguard Worker         // guest memory with 2 regions. The address and size are from a real device.
111*bb4ee6a4SAndroid Build Coastguard Worker         GuestMemory::new_with_options(&[
112*bb4ee6a4SAndroid Build Coastguard Worker             (
113*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000000000000),
114*bb4ee6a4SAndroid Build Coastguard Worker                 3489660928,
115*bb4ee6a4SAndroid Build Coastguard Worker                 MemoryRegionOptions::new(),
116*bb4ee6a4SAndroid Build Coastguard Worker             ),
117*bb4ee6a4SAndroid Build Coastguard Worker             (
118*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000100000000),
119*bb4ee6a4SAndroid Build Coastguard Worker                 3537895424,
120*bb4ee6a4SAndroid Build Coastguard Worker                 MemoryRegionOptions::new(),
121*bb4ee6a4SAndroid Build Coastguard Worker             ),
122*bb4ee6a4SAndroid Build Coastguard Worker         ])
123*bb4ee6a4SAndroid Build Coastguard Worker         .unwrap()
124*bb4ee6a4SAndroid Build Coastguard Worker     }
125*bb4ee6a4SAndroid Build Coastguard Worker 
wait_for_state(controller: &SwapController, state: SwapState) -> bool126*bb4ee6a4SAndroid Build Coastguard Worker     fn wait_for_state(controller: &SwapController, state: SwapState) -> bool {
127*bb4ee6a4SAndroid Build Coastguard Worker         for _ in 0..20 {
128*bb4ee6a4SAndroid Build Coastguard Worker             if controller.status().unwrap().state == state {
129*bb4ee6a4SAndroid Build Coastguard Worker                 return true;
130*bb4ee6a4SAndroid Build Coastguard Worker             }
131*bb4ee6a4SAndroid Build Coastguard Worker             std::thread::sleep(Duration::from_millis(100));
132*bb4ee6a4SAndroid Build Coastguard Worker         }
133*bb4ee6a4SAndroid Build Coastguard Worker         false
134*bb4ee6a4SAndroid Build Coastguard Worker     }
135*bb4ee6a4SAndroid Build Coastguard Worker 
controller_enable()136*bb4ee6a4SAndroid Build Coastguard Worker     pub fn controller_enable() {
137*bb4ee6a4SAndroid Build Coastguard Worker         let dir = tempfile::tempdir().unwrap();
138*bb4ee6a4SAndroid Build Coastguard Worker         let guest_memory = create_guest_memory();
139*bb4ee6a4SAndroid Build Coastguard Worker 
140*bb4ee6a4SAndroid Build Coastguard Worker         let controller = SwapController::launch(guest_memory.clone(), dir.path(), &None).unwrap();
141*bb4ee6a4SAndroid Build Coastguard Worker 
142*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
143*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[1u8; 4096], GuestAddress(0x0000000000000000))
144*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
145*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
146*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[2u8; 4096], GuestAddress(0x0000000000000000 + 4096))
147*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
148*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
149*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[3u8; 4096], GuestAddress(0x0000000000000000 + 10 * 4096))
150*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
151*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
152*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
153*bb4ee6a4SAndroid Build Coastguard Worker                 &[4u8; 3 * 1024 * 1024],
154*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000000000000 + 20 * 4096),
155*bb4ee6a4SAndroid Build Coastguard Worker             )
156*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
157*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
158*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[5u8; 4096], GuestAddress(0x0000000100000000))
159*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
160*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
161*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[6u8; 4096], GuestAddress(0x0000000100000000 + 4096))
162*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
163*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
164*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[7u8; 4096], GuestAddress(0x0000000100000000 + 10 * 4096))
165*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
166*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
167*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
168*bb4ee6a4SAndroid Build Coastguard Worker                 &[8u8; 3 * 1024 * 1024],
169*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000100000000 + 20 * 4096),
170*bb4ee6a4SAndroid Build Coastguard Worker             )
171*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
172*bb4ee6a4SAndroid Build Coastguard Worker 
173*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
174*bb4ee6a4SAndroid Build Coastguard Worker 
175*bb4ee6a4SAndroid Build Coastguard Worker         let status = controller.status().unwrap();
176*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(status.state, SwapState::Pending);
177*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(status.state_transition.pages, 1542);
178*bb4ee6a4SAndroid Build Coastguard Worker 
179*bb4ee6a4SAndroid Build Coastguard Worker         let mut buf = [0u8; 4096];
180*bb4ee6a4SAndroid Build Coastguard Worker         let mut long_buf = [0u8; 3 * 1024 * 1024];
181*bb4ee6a4SAndroid Build Coastguard Worker 
182*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
183*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
184*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
185*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
186*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
187*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
188*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
189*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [2u8; 4096]);
190*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
191*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
192*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
193*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
194*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
195*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
196*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
197*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
198*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
199*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
200*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
201*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
202*bb4ee6a4SAndroid Build Coastguard Worker 
203*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
204*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
205*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
206*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
207*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
208*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
209*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
210*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
211*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
212*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
213*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
214*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
215*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
216*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
217*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
218*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
219*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
220*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
221*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
222*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
223*bb4ee6a4SAndroid Build Coastguard Worker 
224*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
225*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 1544);
226*bb4ee6a4SAndroid Build Coastguard Worker 
227*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
228*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[9u8; 4096], GuestAddress(0x0000000000000000 + 4096))
229*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
230*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
231*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[10u8; 4096], GuestAddress(0x0000000000000000 + 2 * 4096))
232*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
233*bb4ee6a4SAndroid Build Coastguard Worker 
234*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
235*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 2);
236*bb4ee6a4SAndroid Build Coastguard Worker 
237*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
238*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
239*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
240*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
241*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
242*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
243*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
244*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [9u8; 4096]);
245*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
246*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
247*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
248*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [10u8; 4096]);
249*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
250*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
251*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
252*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
253*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
254*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
255*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
256*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
257*bb4ee6a4SAndroid Build Coastguard Worker 
258*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
259*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
260*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
261*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
262*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
263*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
264*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
265*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
266*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
267*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
268*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
269*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
270*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
271*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
272*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
273*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
274*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
275*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
276*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
277*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
278*bb4ee6a4SAndroid Build Coastguard Worker 
279*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
280*bb4ee6a4SAndroid Build Coastguard Worker         drop(controller);
281*bb4ee6a4SAndroid Build Coastguard Worker 
282*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
283*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
284*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
285*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
286*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
287*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
288*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
289*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [9u8; 4096]);
290*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
291*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
292*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
293*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [10u8; 4096]);
294*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
295*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
296*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
297*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
298*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
299*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
300*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
301*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
302*bb4ee6a4SAndroid Build Coastguard Worker 
303*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
304*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
305*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
306*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
307*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
308*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
309*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
310*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
311*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
312*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
313*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
314*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
315*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
316*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
317*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
318*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
319*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
320*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
321*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
322*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
323*bb4ee6a4SAndroid Build Coastguard Worker     }
324*bb4ee6a4SAndroid Build Coastguard Worker 
controller_swap_out()325*bb4ee6a4SAndroid Build Coastguard Worker     pub fn controller_swap_out() {
326*bb4ee6a4SAndroid Build Coastguard Worker         let dir = tempfile::tempdir().unwrap();
327*bb4ee6a4SAndroid Build Coastguard Worker         let guest_memory = create_guest_memory();
328*bb4ee6a4SAndroid Build Coastguard Worker 
329*bb4ee6a4SAndroid Build Coastguard Worker         let controller = SwapController::launch(guest_memory.clone(), dir.path(), &None).unwrap();
330*bb4ee6a4SAndroid Build Coastguard Worker 
331*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
332*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[1u8; 4096], GuestAddress(0x0000000000000000))
333*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
334*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
335*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[2u8; 4096], GuestAddress(0x0000000000000000 + 4096))
336*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
337*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
338*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[3u8; 4096], GuestAddress(0x0000000000000000 + 10 * 4096))
339*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
340*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
341*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
342*bb4ee6a4SAndroid Build Coastguard Worker                 &[4u8; 3 * 1024 * 1024],
343*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000000000000 + 20 * 4096),
344*bb4ee6a4SAndroid Build Coastguard Worker             )
345*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
346*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
347*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[5u8; 4096], GuestAddress(0x0000000100000000))
348*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
349*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
350*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[6u8; 4096], GuestAddress(0x0000000100000000 + 4096))
351*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
352*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
353*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[7u8; 4096], GuestAddress(0x0000000100000000 + 10 * 4096))
354*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
355*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
356*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
357*bb4ee6a4SAndroid Build Coastguard Worker                 &[8u8; 3 * 1024 * 1024],
358*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000100000000 + 20 * 4096),
359*bb4ee6a4SAndroid Build Coastguard Worker             )
360*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
361*bb4ee6a4SAndroid Build Coastguard Worker 
362*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
363*bb4ee6a4SAndroid Build Coastguard Worker         controller.swap_out().unwrap();
364*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Active));
365*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 1542);
366*bb4ee6a4SAndroid Build Coastguard Worker 
367*bb4ee6a4SAndroid Build Coastguard Worker         let mut buf = [0u8; 4096];
368*bb4ee6a4SAndroid Build Coastguard Worker         let mut long_buf = [0u8; 3 * 1024 * 1024];
369*bb4ee6a4SAndroid Build Coastguard Worker 
370*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
371*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
372*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
373*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
374*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
375*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
376*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
377*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [2u8; 4096]);
378*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
379*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
380*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
381*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
382*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
383*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
384*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
385*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
386*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
387*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
388*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
389*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
390*bb4ee6a4SAndroid Build Coastguard Worker 
391*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
392*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
393*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
394*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
395*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
396*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
397*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
398*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
399*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
400*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
401*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
402*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
403*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
404*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
405*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
406*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
407*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
408*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
409*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
410*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
411*bb4ee6a4SAndroid Build Coastguard Worker 
412*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
413*bb4ee6a4SAndroid Build Coastguard Worker         controller.swap_out().unwrap();
414*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Active));
415*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 1544);
416*bb4ee6a4SAndroid Build Coastguard Worker 
417*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
418*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[9u8; 4096], GuestAddress(0x0000000000000000 + 4096))
419*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
420*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
421*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[10u8; 4096], GuestAddress(0x0000000000000000 + 2 * 4096))
422*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
423*bb4ee6a4SAndroid Build Coastguard Worker 
424*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
425*bb4ee6a4SAndroid Build Coastguard Worker         controller.swap_out().unwrap();
426*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Active));
427*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 2);
428*bb4ee6a4SAndroid Build Coastguard Worker 
429*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
430*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
431*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
432*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
433*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
434*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
435*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
436*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [9u8; 4096]);
437*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
438*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
439*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
440*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [10u8; 4096]);
441*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
442*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
443*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
444*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
445*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
446*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
447*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
448*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
449*bb4ee6a4SAndroid Build Coastguard Worker 
450*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
451*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
452*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
453*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
454*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
455*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
456*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
457*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
458*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
459*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
460*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
461*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
462*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
463*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
464*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
465*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
466*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
467*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
468*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
469*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
470*bb4ee6a4SAndroid Build Coastguard Worker 
471*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
472*bb4ee6a4SAndroid Build Coastguard Worker         controller.swap_out().unwrap();
473*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Active));
474*bb4ee6a4SAndroid Build Coastguard Worker         drop(controller);
475*bb4ee6a4SAndroid Build Coastguard Worker 
476*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
477*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
478*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
479*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
480*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
481*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
482*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
483*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [9u8; 4096]);
484*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
485*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
486*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
487*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [10u8; 4096]);
488*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
489*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
490*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
491*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
492*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
493*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
494*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
495*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
496*bb4ee6a4SAndroid Build Coastguard Worker 
497*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
498*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
499*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
500*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
501*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
502*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
503*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
504*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
505*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
506*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
507*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
508*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
509*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
510*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
511*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
512*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
513*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
514*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
515*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
516*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
517*bb4ee6a4SAndroid Build Coastguard Worker     }
518*bb4ee6a4SAndroid Build Coastguard Worker 
controller_trim()519*bb4ee6a4SAndroid Build Coastguard Worker     pub fn controller_trim() {
520*bb4ee6a4SAndroid Build Coastguard Worker         let dir = tempfile::tempdir().unwrap();
521*bb4ee6a4SAndroid Build Coastguard Worker         let guest_memory = create_guest_memory();
522*bb4ee6a4SAndroid Build Coastguard Worker 
523*bb4ee6a4SAndroid Build Coastguard Worker         let controller = SwapController::launch(guest_memory.clone(), dir.path(), &None).unwrap();
524*bb4ee6a4SAndroid Build Coastguard Worker 
525*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
526*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[1u8; 4096], GuestAddress(0x0000000000000000))
527*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
528*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
529*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[2u8; 4096], GuestAddress(0x0000000000000000 + 4096))
530*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
531*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
532*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[0u8; 4096], GuestAddress(0x0000000000000000 + 2 * 4096))
533*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
534*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
535*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[3u8; 4096], GuestAddress(0x0000000000000000 + 10 * 4096))
536*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
537*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
538*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
539*bb4ee6a4SAndroid Build Coastguard Worker                 &[4u8; 3 * 1024 * 1024],
540*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000000000000 + 20 * 4096),
541*bb4ee6a4SAndroid Build Coastguard Worker             )
542*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
543*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
544*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[5u8; 4096], GuestAddress(0x0000000100000000))
545*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
546*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
547*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[6u8; 4096], GuestAddress(0x0000000100000000 + 4096))
548*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
549*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
550*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[0u8; 4096], GuestAddress(0x0000000100000000 + 2 * 4096))
551*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
552*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
553*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[7u8; 4096], GuestAddress(0x0000000100000000 + 10 * 4096))
554*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
555*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
556*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
557*bb4ee6a4SAndroid Build Coastguard Worker                 &[8u8; 3 * 1024 * 1024],
558*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000100000000 + 20 * 4096),
559*bb4ee6a4SAndroid Build Coastguard Worker             )
560*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
561*bb4ee6a4SAndroid Build Coastguard Worker 
562*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
563*bb4ee6a4SAndroid Build Coastguard Worker         controller.trim().unwrap();
564*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Pending));
565*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 2);
566*bb4ee6a4SAndroid Build Coastguard Worker         controller.swap_out().unwrap();
567*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Active));
568*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 1542);
569*bb4ee6a4SAndroid Build Coastguard Worker 
570*bb4ee6a4SAndroid Build Coastguard Worker         let mut buf = [0u8; 4096];
571*bb4ee6a4SAndroid Build Coastguard Worker         let mut long_buf = [0u8; 3 * 1024 * 1024];
572*bb4ee6a4SAndroid Build Coastguard Worker 
573*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
574*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
575*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
576*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
577*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
578*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
579*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
580*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [2u8; 4096]);
581*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
582*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
583*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
584*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
585*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
586*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 3 * 4096))
587*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
588*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
589*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
590*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
591*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
592*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
593*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
594*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
595*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
596*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
597*bb4ee6a4SAndroid Build Coastguard Worker 
598*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
599*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
600*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
601*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
602*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
603*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
604*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
605*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
606*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
607*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
608*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
609*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
610*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
611*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 3 * 4096))
612*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
613*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
614*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
615*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
616*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
617*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
618*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
619*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
620*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
621*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
622*bb4ee6a4SAndroid Build Coastguard Worker 
623*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
624*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[9u8; 4096], GuestAddress(0x0000000000000000 + 4096))
625*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
626*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
627*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[10u8; 4096], GuestAddress(0x0000000000000000 + 3 * 4096))
628*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
629*bb4ee6a4SAndroid Build Coastguard Worker 
630*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
631*bb4ee6a4SAndroid Build Coastguard Worker         controller.trim().unwrap();
632*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Pending));
633*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 1544);
634*bb4ee6a4SAndroid Build Coastguard Worker         controller.swap_out().unwrap();
635*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Active));
636*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 2);
637*bb4ee6a4SAndroid Build Coastguard Worker         drop(controller);
638*bb4ee6a4SAndroid Build Coastguard Worker 
639*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
640*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
641*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
642*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
643*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
644*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
645*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
646*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [9u8; 4096]);
647*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
648*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
649*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
650*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
651*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
652*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 3 * 4096))
653*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
654*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [10u8; 4096]);
655*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
656*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
657*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
658*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
659*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
660*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
661*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
662*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
663*bb4ee6a4SAndroid Build Coastguard Worker 
664*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
665*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
666*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
667*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
668*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
669*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
670*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
671*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
672*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
673*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
674*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
675*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
676*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
677*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
678*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
679*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
680*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
681*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
682*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
683*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
684*bb4ee6a4SAndroid Build Coastguard Worker     }
685*bb4ee6a4SAndroid Build Coastguard Worker 
controller_disable()686*bb4ee6a4SAndroid Build Coastguard Worker     pub fn controller_disable() {
687*bb4ee6a4SAndroid Build Coastguard Worker         let dir = tempfile::tempdir().unwrap();
688*bb4ee6a4SAndroid Build Coastguard Worker         let guest_memory = create_guest_memory();
689*bb4ee6a4SAndroid Build Coastguard Worker 
690*bb4ee6a4SAndroid Build Coastguard Worker         let controller = SwapController::launch(guest_memory.clone(), dir.path(), &None).unwrap();
691*bb4ee6a4SAndroid Build Coastguard Worker 
692*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
693*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[1u8; 4096], GuestAddress(0x0000000000000000))
694*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
695*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
696*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[2u8; 4096], GuestAddress(0x0000000000000000 + 4096))
697*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
698*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
699*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[0u8; 4096], GuestAddress(0x0000000000000000 + 2 * 4096))
700*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
701*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
702*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[3u8; 4096], GuestAddress(0x0000000000000000 + 10 * 4096))
703*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
704*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
705*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
706*bb4ee6a4SAndroid Build Coastguard Worker                 &[4u8; 3 * 1024 * 1024],
707*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000000000000 + 20 * 4096),
708*bb4ee6a4SAndroid Build Coastguard Worker             )
709*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
710*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
711*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[5u8; 4096], GuestAddress(0x0000000100000000))
712*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
713*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
714*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[6u8; 4096], GuestAddress(0x0000000100000000 + 4096))
715*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
716*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
717*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[0u8; 4096], GuestAddress(0x0000000100000000 + 2 * 4096))
718*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
719*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
720*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(&[7u8; 4096], GuestAddress(0x0000000100000000 + 10 * 4096))
721*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
722*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
723*bb4ee6a4SAndroid Build Coastguard Worker             .write_all_at_addr(
724*bb4ee6a4SAndroid Build Coastguard Worker                 &[8u8; 3 * 1024 * 1024],
725*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(0x0000000100000000 + 20 * 4096),
726*bb4ee6a4SAndroid Build Coastguard Worker             )
727*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
728*bb4ee6a4SAndroid Build Coastguard Worker 
729*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
730*bb4ee6a4SAndroid Build Coastguard Worker         controller.disable(false).unwrap();
731*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Ready));
732*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 1544);
733*bb4ee6a4SAndroid Build Coastguard Worker 
734*bb4ee6a4SAndroid Build Coastguard Worker         let mut buf = [0u8; 4096];
735*bb4ee6a4SAndroid Build Coastguard Worker         let mut long_buf = [0u8; 3 * 1024 * 1024];
736*bb4ee6a4SAndroid Build Coastguard Worker 
737*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
738*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
739*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
740*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
741*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
742*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
743*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
744*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [2u8; 4096]);
745*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
746*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
747*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
748*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
749*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
750*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 3 * 4096))
751*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
752*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
753*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
754*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
755*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
756*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
757*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
758*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
759*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
760*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
761*bb4ee6a4SAndroid Build Coastguard Worker 
762*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
763*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
764*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
765*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
766*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
767*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
768*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
769*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
770*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
771*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
772*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
773*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
774*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
775*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 3 * 4096))
776*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
777*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
778*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
779*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
780*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
781*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
782*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
783*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
784*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
785*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
786*bb4ee6a4SAndroid Build Coastguard Worker 
787*bb4ee6a4SAndroid Build Coastguard Worker         controller.enable().unwrap();
788*bb4ee6a4SAndroid Build Coastguard Worker         controller.trim().unwrap();
789*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Pending));
790*bb4ee6a4SAndroid Build Coastguard Worker         controller.swap_out().unwrap();
791*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Active));
792*bb4ee6a4SAndroid Build Coastguard Worker         controller.disable(false).unwrap();
793*bb4ee6a4SAndroid Build Coastguard Worker         assert!(wait_for_state(&controller, SwapState::Ready));
794*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(controller.status().unwrap().state_transition.pages, 1542);
795*bb4ee6a4SAndroid Build Coastguard Worker 
796*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
797*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000))
798*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
799*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [1u8; 4096]);
800*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
801*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 4096))
802*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
803*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [2u8; 4096]);
804*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
805*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 2 * 4096))
806*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
807*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
808*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
809*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 3 * 4096))
810*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
811*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
812*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
813*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000000000000 + 10 * 4096))
814*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
815*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [3u8; 4096]);
816*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
817*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000000000000 + 20 * 4096))
818*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
819*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [4u8; 3 * 1024 * 1024]);
820*bb4ee6a4SAndroid Build Coastguard Worker 
821*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
822*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000))
823*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
824*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [5u8; 4096]);
825*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
826*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 4096))
827*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
828*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [6u8; 4096]);
829*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
830*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 2 * 4096))
831*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
832*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
833*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
834*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 3 * 4096))
835*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
836*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [0u8; 4096]);
837*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
838*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut buf, GuestAddress(0x0000000100000000 + 10 * 4096))
839*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
840*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(buf, [7u8; 4096]);
841*bb4ee6a4SAndroid Build Coastguard Worker         guest_memory
842*bb4ee6a4SAndroid Build Coastguard Worker             .read_exact_at_addr(&mut long_buf, GuestAddress(0x0000000100000000 + 20 * 4096))
843*bb4ee6a4SAndroid Build Coastguard Worker             .unwrap();
844*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(long_buf, [8u8; 3 * 1024 * 1024]);
845*bb4ee6a4SAndroid Build Coastguard Worker     }
846*bb4ee6a4SAndroid Build Coastguard Worker }
847*bb4ee6a4SAndroid Build Coastguard Worker 
main()848*bb4ee6a4SAndroid Build Coastguard Worker fn main() {
849*bb4ee6a4SAndroid Build Coastguard Worker     let args = libtest_mimic::Arguments {
850*bb4ee6a4SAndroid Build Coastguard Worker         // Force single-threaded execution to allow safe use of libc::fork in these tests.
851*bb4ee6a4SAndroid Build Coastguard Worker         test_threads: Some(1),
852*bb4ee6a4SAndroid Build Coastguard Worker         ..libtest_mimic::Arguments::from_args()
853*bb4ee6a4SAndroid Build Coastguard Worker     };
854*bb4ee6a4SAndroid Build Coastguard Worker 
855*bb4ee6a4SAndroid Build Coastguard Worker     let tests = vec![
856*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
857*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("register_region_skip_obsolete_process", move || {
858*bb4ee6a4SAndroid Build Coastguard Worker             base::test_utils::call_test_with_sudo("register_region_skip_obsolete_process_impl");
859*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
860*bb4ee6a4SAndroid Build Coastguard Worker         }),
861*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
862*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("unregister_region_skip_obsolete_process", move || {
863*bb4ee6a4SAndroid Build Coastguard Worker             base::test_utils::call_test_with_sudo("unregister_region_skip_obsolete_process_impl");
864*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
865*bb4ee6a4SAndroid Build Coastguard Worker         }),
866*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
867*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("register_region_skip_obsolete_process_impl", move || {
868*bb4ee6a4SAndroid Build Coastguard Worker             test::register_region_skip_obsolete_process();
869*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
870*bb4ee6a4SAndroid Build Coastguard Worker         })
871*bb4ee6a4SAndroid Build Coastguard Worker         .with_ignored_flag(true),
872*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
873*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("unregister_region_skip_obsolete_process_impl", move || {
874*bb4ee6a4SAndroid Build Coastguard Worker             test::unregister_region_skip_obsolete_process();
875*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
876*bb4ee6a4SAndroid Build Coastguard Worker         })
877*bb4ee6a4SAndroid Build Coastguard Worker         .with_ignored_flag(true),
878*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
879*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_enable", move || {
880*bb4ee6a4SAndroid Build Coastguard Worker             base::test_utils::call_test_with_sudo("controller_enable_impl");
881*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
882*bb4ee6a4SAndroid Build Coastguard Worker         }),
883*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
884*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_enable_impl", move || {
885*bb4ee6a4SAndroid Build Coastguard Worker             test::controller_enable();
886*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
887*bb4ee6a4SAndroid Build Coastguard Worker         })
888*bb4ee6a4SAndroid Build Coastguard Worker         .with_ignored_flag(true),
889*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
890*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_swap_out", move || {
891*bb4ee6a4SAndroid Build Coastguard Worker             base::test_utils::call_test_with_sudo("controller_swap_out_impl");
892*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
893*bb4ee6a4SAndroid Build Coastguard Worker         }),
894*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
895*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_swap_out_impl", move || {
896*bb4ee6a4SAndroid Build Coastguard Worker             test::controller_swap_out();
897*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
898*bb4ee6a4SAndroid Build Coastguard Worker         })
899*bb4ee6a4SAndroid Build Coastguard Worker         .with_ignored_flag(true),
900*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
901*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_trim", move || {
902*bb4ee6a4SAndroid Build Coastguard Worker             base::test_utils::call_test_with_sudo("controller_trim_impl");
903*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
904*bb4ee6a4SAndroid Build Coastguard Worker         }),
905*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
906*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_trim_impl", move || {
907*bb4ee6a4SAndroid Build Coastguard Worker             test::controller_trim();
908*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
909*bb4ee6a4SAndroid Build Coastguard Worker         })
910*bb4ee6a4SAndroid Build Coastguard Worker         .with_ignored_flag(true),
911*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
912*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_disable", move || {
913*bb4ee6a4SAndroid Build Coastguard Worker             base::test_utils::call_test_with_sudo("controller_disable_impl");
914*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
915*bb4ee6a4SAndroid Build Coastguard Worker         }),
916*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(all(unix, feature = "enable"))]
917*bb4ee6a4SAndroid Build Coastguard Worker         libtest_mimic::Trial::test("controller_disable_impl", move || {
918*bb4ee6a4SAndroid Build Coastguard Worker             test::controller_disable();
919*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
920*bb4ee6a4SAndroid Build Coastguard Worker         })
921*bb4ee6a4SAndroid Build Coastguard Worker         .with_ignored_flag(true),
922*bb4ee6a4SAndroid Build Coastguard Worker     ];
923*bb4ee6a4SAndroid Build Coastguard Worker     libtest_mimic::run(&args, tests).exit();
924*bb4ee6a4SAndroid Build Coastguard Worker }
925