xref: /aosp_15_r20/external/crosvm/vm_control/src/sys/linux.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 #[cfg(feature = "gpu")]
6*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) mod gpu;
7*bb4ee6a4SAndroid Build Coastguard Worker 
8*bb4ee6a4SAndroid Build Coastguard Worker use std::path::Path;
9*bb4ee6a4SAndroid Build Coastguard Worker use std::time::Duration;
10*bb4ee6a4SAndroid Build Coastguard Worker 
11*bb4ee6a4SAndroid Build Coastguard Worker use base::error;
12*bb4ee6a4SAndroid Build Coastguard Worker use base::AsRawDescriptor;
13*bb4ee6a4SAndroid Build Coastguard Worker use base::Descriptor;
14*bb4ee6a4SAndroid Build Coastguard Worker use base::Error as SysError;
15*bb4ee6a4SAndroid Build Coastguard Worker use base::MemoryMappingArena;
16*bb4ee6a4SAndroid Build Coastguard Worker use base::MmapError;
17*bb4ee6a4SAndroid Build Coastguard Worker use base::Protection;
18*bb4ee6a4SAndroid Build Coastguard Worker use base::SafeDescriptor;
19*bb4ee6a4SAndroid Build Coastguard Worker use base::Tube;
20*bb4ee6a4SAndroid Build Coastguard Worker use base::UnixSeqpacket;
21*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::MemCacheType;
22*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::MemSlot;
23*bb4ee6a4SAndroid Build Coastguard Worker use hypervisor::Vm;
24*bb4ee6a4SAndroid Build Coastguard Worker use libc::EINVAL;
25*bb4ee6a4SAndroid Build Coastguard Worker use libc::ERANGE;
26*bb4ee6a4SAndroid Build Coastguard Worker use once_cell::sync::Lazy;
27*bb4ee6a4SAndroid Build Coastguard Worker use resources::Alloc;
28*bb4ee6a4SAndroid Build Coastguard Worker use resources::SystemAllocator;
29*bb4ee6a4SAndroid Build Coastguard Worker use serde::Deserialize;
30*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize;
31*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestAddress;
32*bb4ee6a4SAndroid Build Coastguard Worker 
33*bb4ee6a4SAndroid Build Coastguard Worker use crate::client::HandleRequestResult;
34*bb4ee6a4SAndroid Build Coastguard Worker use crate::VmMappedMemoryRegion;
35*bb4ee6a4SAndroid Build Coastguard Worker use crate::VmRequest;
36*bb4ee6a4SAndroid Build Coastguard Worker use crate::VmResponse;
37*bb4ee6a4SAndroid Build Coastguard Worker 
handle_request<T: AsRef<Path> + std::fmt::Debug>( request: &VmRequest, socket_path: T, ) -> HandleRequestResult38*bb4ee6a4SAndroid Build Coastguard Worker pub fn handle_request<T: AsRef<Path> + std::fmt::Debug>(
39*bb4ee6a4SAndroid Build Coastguard Worker     request: &VmRequest,
40*bb4ee6a4SAndroid Build Coastguard Worker     socket_path: T,
41*bb4ee6a4SAndroid Build Coastguard Worker ) -> HandleRequestResult {
42*bb4ee6a4SAndroid Build Coastguard Worker     handle_request_with_timeout(request, socket_path, None)
43*bb4ee6a4SAndroid Build Coastguard Worker }
44*bb4ee6a4SAndroid Build Coastguard Worker 
handle_request_with_timeout<T: AsRef<Path> + std::fmt::Debug>( request: &VmRequest, socket_path: T, timeout: Option<Duration>, ) -> HandleRequestResult45*bb4ee6a4SAndroid Build Coastguard Worker pub fn handle_request_with_timeout<T: AsRef<Path> + std::fmt::Debug>(
46*bb4ee6a4SAndroid Build Coastguard Worker     request: &VmRequest,
47*bb4ee6a4SAndroid Build Coastguard Worker     socket_path: T,
48*bb4ee6a4SAndroid Build Coastguard Worker     timeout: Option<Duration>,
49*bb4ee6a4SAndroid Build Coastguard Worker ) -> HandleRequestResult {
50*bb4ee6a4SAndroid Build Coastguard Worker     match UnixSeqpacket::connect(&socket_path) {
51*bb4ee6a4SAndroid Build Coastguard Worker         Ok(s) => {
52*bb4ee6a4SAndroid Build Coastguard Worker             let socket = Tube::new_from_unix_seqpacket(s).map_err(|_| ())?;
53*bb4ee6a4SAndroid Build Coastguard Worker             if timeout.is_some() {
54*bb4ee6a4SAndroid Build Coastguard Worker                 if let Err(e) = socket.set_recv_timeout(timeout) {
55*bb4ee6a4SAndroid Build Coastguard Worker                     error!(
56*bb4ee6a4SAndroid Build Coastguard Worker                         "failed to set recv timeout on socket at '{:?}': {}",
57*bb4ee6a4SAndroid Build Coastguard Worker                         socket_path, e
58*bb4ee6a4SAndroid Build Coastguard Worker                     );
59*bb4ee6a4SAndroid Build Coastguard Worker                     return Err(());
60*bb4ee6a4SAndroid Build Coastguard Worker                 }
61*bb4ee6a4SAndroid Build Coastguard Worker             }
62*bb4ee6a4SAndroid Build Coastguard Worker             if let Err(e) = socket.send(request) {
63*bb4ee6a4SAndroid Build Coastguard Worker                 error!(
64*bb4ee6a4SAndroid Build Coastguard Worker                     "failed to send request to socket at '{:?}': {}",
65*bb4ee6a4SAndroid Build Coastguard Worker                     socket_path, e
66*bb4ee6a4SAndroid Build Coastguard Worker                 );
67*bb4ee6a4SAndroid Build Coastguard Worker                 return Err(());
68*bb4ee6a4SAndroid Build Coastguard Worker             }
69*bb4ee6a4SAndroid Build Coastguard Worker             match socket.recv() {
70*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(response) => Ok(response),
71*bb4ee6a4SAndroid Build Coastguard Worker                 Err(e) => {
72*bb4ee6a4SAndroid Build Coastguard Worker                     error!(
73*bb4ee6a4SAndroid Build Coastguard Worker                         "failed to recv response from socket at '{:?}': {}",
74*bb4ee6a4SAndroid Build Coastguard Worker                         socket_path, e
75*bb4ee6a4SAndroid Build Coastguard Worker                     );
76*bb4ee6a4SAndroid Build Coastguard Worker                     Err(())
77*bb4ee6a4SAndroid Build Coastguard Worker                 }
78*bb4ee6a4SAndroid Build Coastguard Worker             }
79*bb4ee6a4SAndroid Build Coastguard Worker         }
80*bb4ee6a4SAndroid Build Coastguard Worker         Err(e) => {
81*bb4ee6a4SAndroid Build Coastguard Worker             error!("failed to connect to socket at '{:?}': {}", socket_path, e);
82*bb4ee6a4SAndroid Build Coastguard Worker             Err(())
83*bb4ee6a4SAndroid Build Coastguard Worker         }
84*bb4ee6a4SAndroid Build Coastguard Worker     }
85*bb4ee6a4SAndroid Build Coastguard Worker }
86*bb4ee6a4SAndroid Build Coastguard Worker 
87*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug)]
88*bb4ee6a4SAndroid Build Coastguard Worker pub enum VmMemoryMappingRequest {
89*bb4ee6a4SAndroid Build Coastguard Worker     /// Flush the content of a memory mapping to its backing file.
90*bb4ee6a4SAndroid Build Coastguard Worker     /// `slot` selects the arena (as returned by `Vm::add_mmap_arena`).
91*bb4ee6a4SAndroid Build Coastguard Worker     /// `offset` is the offset of the mapping to sync within the arena.
92*bb4ee6a4SAndroid Build Coastguard Worker     /// `size` is the size of the mapping to sync within the arena.
93*bb4ee6a4SAndroid Build Coastguard Worker     MsyncArena {
94*bb4ee6a4SAndroid Build Coastguard Worker         slot: MemSlot,
95*bb4ee6a4SAndroid Build Coastguard Worker         offset: usize,
96*bb4ee6a4SAndroid Build Coastguard Worker         size: usize,
97*bb4ee6a4SAndroid Build Coastguard Worker     },
98*bb4ee6a4SAndroid Build Coastguard Worker 
99*bb4ee6a4SAndroid Build Coastguard Worker     /// Gives a MADV_PAGEOUT advice to the memory region mapped at `slot`, with the address range
100*bb4ee6a4SAndroid Build Coastguard Worker     /// starting at `offset` from the start of the region, and with size `size`.
101*bb4ee6a4SAndroid Build Coastguard Worker     MadvisePageout {
102*bb4ee6a4SAndroid Build Coastguard Worker         slot: MemSlot,
103*bb4ee6a4SAndroid Build Coastguard Worker         offset: usize,
104*bb4ee6a4SAndroid Build Coastguard Worker         size: usize,
105*bb4ee6a4SAndroid Build Coastguard Worker     },
106*bb4ee6a4SAndroid Build Coastguard Worker 
107*bb4ee6a4SAndroid Build Coastguard Worker     /// Gives a MADV_REMOVE advice to the memory region mapped at `slot`, with the address range
108*bb4ee6a4SAndroid Build Coastguard Worker     /// starting at `offset` from the start of the region, and with size `size`.
109*bb4ee6a4SAndroid Build Coastguard Worker     MadviseRemove {
110*bb4ee6a4SAndroid Build Coastguard Worker         slot: MemSlot,
111*bb4ee6a4SAndroid Build Coastguard Worker         offset: usize,
112*bb4ee6a4SAndroid Build Coastguard Worker         size: usize,
113*bb4ee6a4SAndroid Build Coastguard Worker     },
114*bb4ee6a4SAndroid Build Coastguard Worker }
115*bb4ee6a4SAndroid Build Coastguard Worker 
116*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug)]
117*bb4ee6a4SAndroid Build Coastguard Worker pub enum VmMemoryMappingResponse {
118*bb4ee6a4SAndroid Build Coastguard Worker     Ok,
119*bb4ee6a4SAndroid Build Coastguard Worker     Err(SysError),
120*bb4ee6a4SAndroid Build Coastguard Worker }
121*bb4ee6a4SAndroid Build Coastguard Worker 
122*bb4ee6a4SAndroid Build Coastguard Worker impl VmMemoryMappingRequest {
123*bb4ee6a4SAndroid Build Coastguard Worker     /// Executes this request on the given Vm.
124*bb4ee6a4SAndroid Build Coastguard Worker     ///
125*bb4ee6a4SAndroid Build Coastguard Worker     /// # Arguments
126*bb4ee6a4SAndroid Build Coastguard Worker     /// * `vm` - The `Vm` to perform the request on.
127*bb4ee6a4SAndroid Build Coastguard Worker     ///
128*bb4ee6a4SAndroid Build Coastguard Worker     /// This does not return a result, instead encapsulating the success or failure in a
129*bb4ee6a4SAndroid Build Coastguard Worker     /// `VmMsyncResponse` with the intended purpose of sending the response back over the socket
130*bb4ee6a4SAndroid Build Coastguard Worker     /// that received this `VmMsyncResponse`.
execute(&self, vm: &mut impl Vm) -> VmMemoryMappingResponse131*bb4ee6a4SAndroid Build Coastguard Worker     pub fn execute(&self, vm: &mut impl Vm) -> VmMemoryMappingResponse {
132*bb4ee6a4SAndroid Build Coastguard Worker         use self::VmMemoryMappingRequest::*;
133*bb4ee6a4SAndroid Build Coastguard Worker         match *self {
134*bb4ee6a4SAndroid Build Coastguard Worker             MsyncArena { slot, offset, size } => match vm.msync_memory_region(slot, offset, size) {
135*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(()) => VmMemoryMappingResponse::Ok,
136*bb4ee6a4SAndroid Build Coastguard Worker                 Err(e) => VmMemoryMappingResponse::Err(e),
137*bb4ee6a4SAndroid Build Coastguard Worker             },
138*bb4ee6a4SAndroid Build Coastguard Worker             MadvisePageout { slot, offset, size } => {
139*bb4ee6a4SAndroid Build Coastguard Worker                 match vm.madvise_pageout_memory_region(slot, offset, size) {
140*bb4ee6a4SAndroid Build Coastguard Worker                     Ok(()) => VmMemoryMappingResponse::Ok,
141*bb4ee6a4SAndroid Build Coastguard Worker                     Err(e) => VmMemoryMappingResponse::Err(e),
142*bb4ee6a4SAndroid Build Coastguard Worker                 }
143*bb4ee6a4SAndroid Build Coastguard Worker             }
144*bb4ee6a4SAndroid Build Coastguard Worker             MadviseRemove { slot, offset, size } => {
145*bb4ee6a4SAndroid Build Coastguard Worker                 match vm.madvise_remove_memory_region(slot, offset, size) {
146*bb4ee6a4SAndroid Build Coastguard Worker                     Ok(()) => VmMemoryMappingResponse::Ok,
147*bb4ee6a4SAndroid Build Coastguard Worker                     Err(e) => VmMemoryMappingResponse::Err(e),
148*bb4ee6a4SAndroid Build Coastguard Worker                 }
149*bb4ee6a4SAndroid Build Coastguard Worker             }
150*bb4ee6a4SAndroid Build Coastguard Worker         }
151*bb4ee6a4SAndroid Build Coastguard Worker     }
152*bb4ee6a4SAndroid Build Coastguard Worker }
153*bb4ee6a4SAndroid Build Coastguard Worker 
154*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Serialize, Deserialize, Debug)]
155*bb4ee6a4SAndroid Build Coastguard Worker pub enum FsMappingRequest {
156*bb4ee6a4SAndroid Build Coastguard Worker     /// Create an anonymous memory mapping that spans the entire region described by `Alloc`.
157*bb4ee6a4SAndroid Build Coastguard Worker     AllocateSharedMemoryRegion(Alloc),
158*bb4ee6a4SAndroid Build Coastguard Worker     /// Create a memory mapping.
159*bb4ee6a4SAndroid Build Coastguard Worker     CreateMemoryMapping {
160*bb4ee6a4SAndroid Build Coastguard Worker         /// The slot for a MemoryMappingArena, previously returned by a response to an
161*bb4ee6a4SAndroid Build Coastguard Worker         /// `AllocateSharedMemoryRegion` request.
162*bb4ee6a4SAndroid Build Coastguard Worker         slot: u32,
163*bb4ee6a4SAndroid Build Coastguard Worker         /// The file descriptor that should be mapped.
164*bb4ee6a4SAndroid Build Coastguard Worker         fd: SafeDescriptor,
165*bb4ee6a4SAndroid Build Coastguard Worker         /// The size of the mapping.
166*bb4ee6a4SAndroid Build Coastguard Worker         size: usize,
167*bb4ee6a4SAndroid Build Coastguard Worker         /// The offset into the file from where the mapping should start.
168*bb4ee6a4SAndroid Build Coastguard Worker         file_offset: u64,
169*bb4ee6a4SAndroid Build Coastguard Worker         /// The memory protection to be used for the mapping.  Protections other than readable and
170*bb4ee6a4SAndroid Build Coastguard Worker         /// writable will be silently dropped.
171*bb4ee6a4SAndroid Build Coastguard Worker         prot: Protection,
172*bb4ee6a4SAndroid Build Coastguard Worker         /// The offset into the shared memory region where the mapping should be placed.
173*bb4ee6a4SAndroid Build Coastguard Worker         mem_offset: usize,
174*bb4ee6a4SAndroid Build Coastguard Worker     },
175*bb4ee6a4SAndroid Build Coastguard Worker     /// Remove a memory mapping.
176*bb4ee6a4SAndroid Build Coastguard Worker     RemoveMemoryMapping {
177*bb4ee6a4SAndroid Build Coastguard Worker         /// The slot for a MemoryMappingArena.
178*bb4ee6a4SAndroid Build Coastguard Worker         slot: u32,
179*bb4ee6a4SAndroid Build Coastguard Worker         /// The offset into the shared memory region.
180*bb4ee6a4SAndroid Build Coastguard Worker         offset: usize,
181*bb4ee6a4SAndroid Build Coastguard Worker         /// The size of the mapping.
182*bb4ee6a4SAndroid Build Coastguard Worker         size: usize,
183*bb4ee6a4SAndroid Build Coastguard Worker     },
184*bb4ee6a4SAndroid Build Coastguard Worker }
185*bb4ee6a4SAndroid Build Coastguard Worker 
prepare_shared_memory_region( vm: &mut dyn Vm, allocator: &mut SystemAllocator, alloc: Alloc, cache: MemCacheType, ) -> Result<VmMappedMemoryRegion, SysError>186*bb4ee6a4SAndroid Build Coastguard Worker pub fn prepare_shared_memory_region(
187*bb4ee6a4SAndroid Build Coastguard Worker     vm: &mut dyn Vm,
188*bb4ee6a4SAndroid Build Coastguard Worker     allocator: &mut SystemAllocator,
189*bb4ee6a4SAndroid Build Coastguard Worker     alloc: Alloc,
190*bb4ee6a4SAndroid Build Coastguard Worker     cache: MemCacheType,
191*bb4ee6a4SAndroid Build Coastguard Worker ) -> Result<VmMappedMemoryRegion, SysError> {
192*bb4ee6a4SAndroid Build Coastguard Worker     if !matches!(alloc, Alloc::PciBar { .. }) {
193*bb4ee6a4SAndroid Build Coastguard Worker         return Err(SysError::new(EINVAL));
194*bb4ee6a4SAndroid Build Coastguard Worker     }
195*bb4ee6a4SAndroid Build Coastguard Worker     match allocator.mmio_allocator_any().get(&alloc) {
196*bb4ee6a4SAndroid Build Coastguard Worker         Some((range, _)) => {
197*bb4ee6a4SAndroid Build Coastguard Worker             let size: usize = match range.len().and_then(|x| x.try_into().ok()) {
198*bb4ee6a4SAndroid Build Coastguard Worker                 Some(v) => v,
199*bb4ee6a4SAndroid Build Coastguard Worker                 None => return Err(SysError::new(ERANGE)),
200*bb4ee6a4SAndroid Build Coastguard Worker             };
201*bb4ee6a4SAndroid Build Coastguard Worker             let arena = match MemoryMappingArena::new(size) {
202*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(a) => a,
203*bb4ee6a4SAndroid Build Coastguard Worker                 Err(MmapError::SystemCallFailed(e)) => return Err(e),
204*bb4ee6a4SAndroid Build Coastguard Worker                 _ => return Err(SysError::new(EINVAL)),
205*bb4ee6a4SAndroid Build Coastguard Worker             };
206*bb4ee6a4SAndroid Build Coastguard Worker 
207*bb4ee6a4SAndroid Build Coastguard Worker             match vm.add_memory_region(
208*bb4ee6a4SAndroid Build Coastguard Worker                 GuestAddress(range.start),
209*bb4ee6a4SAndroid Build Coastguard Worker                 Box::new(arena),
210*bb4ee6a4SAndroid Build Coastguard Worker                 false,
211*bb4ee6a4SAndroid Build Coastguard Worker                 false,
212*bb4ee6a4SAndroid Build Coastguard Worker                 cache,
213*bb4ee6a4SAndroid Build Coastguard Worker             ) {
214*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(slot) => Ok(VmMappedMemoryRegion {
215*bb4ee6a4SAndroid Build Coastguard Worker                     guest_address: GuestAddress(range.start),
216*bb4ee6a4SAndroid Build Coastguard Worker                     slot,
217*bb4ee6a4SAndroid Build Coastguard Worker                 }),
218*bb4ee6a4SAndroid Build Coastguard Worker                 Err(e) => Err(e),
219*bb4ee6a4SAndroid Build Coastguard Worker             }
220*bb4ee6a4SAndroid Build Coastguard Worker         }
221*bb4ee6a4SAndroid Build Coastguard Worker         None => Err(SysError::new(EINVAL)),
222*bb4ee6a4SAndroid Build Coastguard Worker     }
223*bb4ee6a4SAndroid Build Coastguard Worker }
224*bb4ee6a4SAndroid Build Coastguard Worker 
225*bb4ee6a4SAndroid Build Coastguard Worker static SHOULD_PREPARE_MEMORY_REGION: Lazy<bool> = Lazy::new(|| {
226*bb4ee6a4SAndroid Build Coastguard Worker     if cfg!(target_arch = "x86_64") {
227*bb4ee6a4SAndroid Build Coastguard Worker         // The legacy x86 MMU allocates an rmap and a page tracking array
228*bb4ee6a4SAndroid Build Coastguard Worker         // that take 2.5MiB per 1GiB of user memory region address space,
229*bb4ee6a4SAndroid Build Coastguard Worker         // so avoid mapping the whole shared memory region if we're not
230*bb4ee6a4SAndroid Build Coastguard Worker         // using the tdp mmu.
231*bb4ee6a4SAndroid Build Coastguard Worker         match std::fs::read("/sys/module/kvm/parameters/tdp_mmu") {
232*bb4ee6a4SAndroid Build Coastguard Worker             Ok(bytes) if !bytes.is_empty() => bytes[0] == b'Y',
233*bb4ee6a4SAndroid Build Coastguard Worker             _ => false,
234*bb4ee6a4SAndroid Build Coastguard Worker         }
235*bb4ee6a4SAndroid Build Coastguard Worker     } else if cfg!(target_pointer_width = "64") {
236*bb4ee6a4SAndroid Build Coastguard Worker         true
237*bb4ee6a4SAndroid Build Coastguard Worker     } else {
238*bb4ee6a4SAndroid Build Coastguard Worker         // Not enough address space on 32-bit systems
239*bb4ee6a4SAndroid Build Coastguard Worker         false
240*bb4ee6a4SAndroid Build Coastguard Worker     }
241*bb4ee6a4SAndroid Build Coastguard Worker });
242*bb4ee6a4SAndroid Build Coastguard Worker 
should_prepare_memory_region() -> bool243*bb4ee6a4SAndroid Build Coastguard Worker pub fn should_prepare_memory_region() -> bool {
244*bb4ee6a4SAndroid Build Coastguard Worker     *SHOULD_PREPARE_MEMORY_REGION
245*bb4ee6a4SAndroid Build Coastguard Worker }
246*bb4ee6a4SAndroid Build Coastguard Worker 
247*bb4ee6a4SAndroid Build Coastguard Worker impl FsMappingRequest {
execute(&self, vm: &mut dyn Vm, allocator: &mut SystemAllocator) -> VmResponse248*bb4ee6a4SAndroid Build Coastguard Worker     pub fn execute(&self, vm: &mut dyn Vm, allocator: &mut SystemAllocator) -> VmResponse {
249*bb4ee6a4SAndroid Build Coastguard Worker         use self::FsMappingRequest::*;
250*bb4ee6a4SAndroid Build Coastguard Worker         match *self {
251*bb4ee6a4SAndroid Build Coastguard Worker             AllocateSharedMemoryRegion(alloc) => {
252*bb4ee6a4SAndroid Build Coastguard Worker                 match prepare_shared_memory_region(
253*bb4ee6a4SAndroid Build Coastguard Worker                     vm,
254*bb4ee6a4SAndroid Build Coastguard Worker                     allocator,
255*bb4ee6a4SAndroid Build Coastguard Worker                     alloc,
256*bb4ee6a4SAndroid Build Coastguard Worker                     MemCacheType::CacheCoherent,
257*bb4ee6a4SAndroid Build Coastguard Worker                 ) {
258*bb4ee6a4SAndroid Build Coastguard Worker                     Ok(VmMappedMemoryRegion { slot, .. }) => VmResponse::RegisterMemory { slot },
259*bb4ee6a4SAndroid Build Coastguard Worker                     Err(e) => VmResponse::Err(e),
260*bb4ee6a4SAndroid Build Coastguard Worker                 }
261*bb4ee6a4SAndroid Build Coastguard Worker             }
262*bb4ee6a4SAndroid Build Coastguard Worker             CreateMemoryMapping {
263*bb4ee6a4SAndroid Build Coastguard Worker                 slot,
264*bb4ee6a4SAndroid Build Coastguard Worker                 ref fd,
265*bb4ee6a4SAndroid Build Coastguard Worker                 size,
266*bb4ee6a4SAndroid Build Coastguard Worker                 file_offset,
267*bb4ee6a4SAndroid Build Coastguard Worker                 prot,
268*bb4ee6a4SAndroid Build Coastguard Worker                 mem_offset,
269*bb4ee6a4SAndroid Build Coastguard Worker             } => {
270*bb4ee6a4SAndroid Build Coastguard Worker                 let raw_fd: Descriptor = Descriptor(fd.as_raw_descriptor());
271*bb4ee6a4SAndroid Build Coastguard Worker 
272*bb4ee6a4SAndroid Build Coastguard Worker                 match vm.add_fd_mapping(slot, mem_offset, size, &raw_fd, file_offset, prot) {
273*bb4ee6a4SAndroid Build Coastguard Worker                     Ok(()) => VmResponse::Ok,
274*bb4ee6a4SAndroid Build Coastguard Worker                     Err(e) => VmResponse::Err(e),
275*bb4ee6a4SAndroid Build Coastguard Worker                 }
276*bb4ee6a4SAndroid Build Coastguard Worker             }
277*bb4ee6a4SAndroid Build Coastguard Worker             RemoveMemoryMapping { slot, offset, size } => {
278*bb4ee6a4SAndroid Build Coastguard Worker                 match vm.remove_mapping(slot, offset, size) {
279*bb4ee6a4SAndroid Build Coastguard Worker                     Ok(()) => VmResponse::Ok,
280*bb4ee6a4SAndroid Build Coastguard Worker                     Err(e) => VmResponse::Err(e),
281*bb4ee6a4SAndroid Build Coastguard Worker                 }
282*bb4ee6a4SAndroid Build Coastguard Worker             }
283*bb4ee6a4SAndroid Build Coastguard Worker         }
284*bb4ee6a4SAndroid Build Coastguard Worker     }
285*bb4ee6a4SAndroid Build Coastguard Worker }
286