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