xref: /aosp_15_r20/external/crosvm/base/src/lib.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 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 //! Safe, cross-platform-compatible wrappers for system interfaces.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker mod alloc;
8*bb4ee6a4SAndroid Build Coastguard Worker mod clock;
9*bb4ee6a4SAndroid Build Coastguard Worker pub mod custom_serde;
10*bb4ee6a4SAndroid Build Coastguard Worker pub mod descriptor;
11*bb4ee6a4SAndroid Build Coastguard Worker pub mod descriptor_reflection;
12*bb4ee6a4SAndroid Build Coastguard Worker mod errno;
13*bb4ee6a4SAndroid Build Coastguard Worker mod event;
14*bb4ee6a4SAndroid Build Coastguard Worker mod file_traits;
15*bb4ee6a4SAndroid Build Coastguard Worker mod iobuf;
16*bb4ee6a4SAndroid Build Coastguard Worker mod mmap;
17*bb4ee6a4SAndroid Build Coastguard Worker mod notifiers;
18*bb4ee6a4SAndroid Build Coastguard Worker mod periodic_logger;
19*bb4ee6a4SAndroid Build Coastguard Worker mod shm;
20*bb4ee6a4SAndroid Build Coastguard Worker pub mod syslog;
21*bb4ee6a4SAndroid Build Coastguard Worker pub mod test_utils;
22*bb4ee6a4SAndroid Build Coastguard Worker mod timer;
23*bb4ee6a4SAndroid Build Coastguard Worker mod tube;
24*bb4ee6a4SAndroid Build Coastguard Worker mod volatile_memory;
25*bb4ee6a4SAndroid Build Coastguard Worker mod wait_context;
26*bb4ee6a4SAndroid Build Coastguard Worker mod worker_thread;
27*bb4ee6a4SAndroid Build Coastguard Worker mod write_zeroes;
28*bb4ee6a4SAndroid Build Coastguard Worker 
29*bb4ee6a4SAndroid Build Coastguard Worker pub mod sys;
30*bb4ee6a4SAndroid Build Coastguard Worker pub use alloc::LayoutAllocation;
31*bb4ee6a4SAndroid Build Coastguard Worker 
32*bb4ee6a4SAndroid Build Coastguard Worker pub use clock::Clock;
33*bb4ee6a4SAndroid Build Coastguard Worker pub use clock::FakeClock;
34*bb4ee6a4SAndroid Build Coastguard Worker pub use errno::errno_result;
35*bb4ee6a4SAndroid Build Coastguard Worker pub use errno::Error;
36*bb4ee6a4SAndroid Build Coastguard Worker pub use errno::Result;
37*bb4ee6a4SAndroid Build Coastguard Worker pub use event::Event;
38*bb4ee6a4SAndroid Build Coastguard Worker pub use event::EventWaitResult;
39*bb4ee6a4SAndroid Build Coastguard Worker pub use file_traits::FileAllocate;
40*bb4ee6a4SAndroid Build Coastguard Worker pub use file_traits::FileGetLen;
41*bb4ee6a4SAndroid Build Coastguard Worker pub use file_traits::FileReadWriteAtVolatile;
42*bb4ee6a4SAndroid Build Coastguard Worker pub use file_traits::FileReadWriteVolatile;
43*bb4ee6a4SAndroid Build Coastguard Worker pub use file_traits::FileSetLen;
44*bb4ee6a4SAndroid Build Coastguard Worker pub use file_traits::FileSync;
45*bb4ee6a4SAndroid Build Coastguard Worker pub use iobuf::IoBufMut;
46*bb4ee6a4SAndroid Build Coastguard Worker pub use mmap::Error as MmapError;
47*bb4ee6a4SAndroid Build Coastguard Worker pub use mmap::ExternalMapping;
48*bb4ee6a4SAndroid Build Coastguard Worker pub use mmap::MappedRegion;
49*bb4ee6a4SAndroid Build Coastguard Worker pub use mmap::MemoryMapping;
50*bb4ee6a4SAndroid Build Coastguard Worker pub use mmap::MemoryMappingBuilder;
51*bb4ee6a4SAndroid Build Coastguard Worker pub use mmap::Result as MmapResult;
52*bb4ee6a4SAndroid Build Coastguard Worker pub use notifiers::CloseNotifier;
53*bb4ee6a4SAndroid Build Coastguard Worker pub use notifiers::ReadNotifier;
54*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::ioctl::ioctl;
55*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::ioctl::ioctl_with_mut_ptr;
56*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::ioctl::ioctl_with_mut_ref;
57*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::ioctl::ioctl_with_ptr;
58*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::ioctl::ioctl_with_ref;
59*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::ioctl::ioctl_with_val;
60*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::ioctl::IoctlNr;
61*bb4ee6a4SAndroid Build Coastguard Worker pub use shm::SharedMemory;
62*bb4ee6a4SAndroid Build Coastguard Worker use sys::platform;
63*bb4ee6a4SAndroid Build Coastguard Worker pub use timer::FakeTimer;
64*bb4ee6a4SAndroid Build Coastguard Worker pub use timer::Timer;
65*bb4ee6a4SAndroid Build Coastguard Worker pub use timer::TimerTrait;
66*bb4ee6a4SAndroid Build Coastguard Worker pub use tube::Error as TubeError;
67*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(windows, feature = "proto_tube"))]
68*bb4ee6a4SAndroid Build Coastguard Worker pub use tube::ProtoTube;
69*bb4ee6a4SAndroid Build Coastguard Worker pub use tube::RecvTube;
70*bb4ee6a4SAndroid Build Coastguard Worker pub use tube::Result as TubeResult;
71*bb4ee6a4SAndroid Build Coastguard Worker pub use tube::SendTube;
72*bb4ee6a4SAndroid Build Coastguard Worker pub use tube::Tube;
73*bb4ee6a4SAndroid Build Coastguard Worker pub use volatile_memory::VolatileMemory;
74*bb4ee6a4SAndroid Build Coastguard Worker pub use volatile_memory::VolatileMemoryError;
75*bb4ee6a4SAndroid Build Coastguard Worker pub use volatile_memory::VolatileMemoryResult;
76*bb4ee6a4SAndroid Build Coastguard Worker pub use volatile_memory::VolatileSlice;
77*bb4ee6a4SAndroid Build Coastguard Worker pub use wait_context::EventToken;
78*bb4ee6a4SAndroid Build Coastguard Worker pub use wait_context::EventType;
79*bb4ee6a4SAndroid Build Coastguard Worker pub use wait_context::TriggeredEvent;
80*bb4ee6a4SAndroid Build Coastguard Worker pub use wait_context::WaitContext;
81*bb4ee6a4SAndroid Build Coastguard Worker pub use worker_thread::WorkerThread;
82*bb4ee6a4SAndroid Build Coastguard Worker pub use write_zeroes::PunchHole;
83*bb4ee6a4SAndroid Build Coastguard Worker pub use write_zeroes::WriteZeroesAt;
84*bb4ee6a4SAndroid Build Coastguard Worker 
85*bb4ee6a4SAndroid Build Coastguard Worker // TODO(b/233233301): reorganize platform specific exports under platform
86*bb4ee6a4SAndroid Build Coastguard Worker // namespaces instead of exposing them directly in base::.
87*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! {
88*bb4ee6a4SAndroid Build Coastguard Worker     if #[cfg(any(target_os = "android", target_os = "linux"))] {
89*bb4ee6a4SAndroid Build Coastguard Worker         pub use sys::linux;
90*bb4ee6a4SAndroid Build Coastguard Worker 
91*bb4ee6a4SAndroid Build Coastguard Worker         // descriptor/fd related exports.
92*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::{
93*bb4ee6a4SAndroid Build Coastguard Worker             clone_descriptor, safe_descriptor_from_path,
94*bb4ee6a4SAndroid Build Coastguard Worker             validate_raw_descriptor, clear_descriptor_cloexec,
95*bb4ee6a4SAndroid Build Coastguard Worker             safe_descriptor_from_cmdline_fd,
96*bb4ee6a4SAndroid Build Coastguard Worker         };
97*bb4ee6a4SAndroid Build Coastguard Worker 
98*bb4ee6a4SAndroid Build Coastguard Worker         // Event/signal related exports.
99*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::{
100*bb4ee6a4SAndroid Build Coastguard Worker             block_signal, clear_signal, get_blocked_signals, new_pipe_full,
101*bb4ee6a4SAndroid Build Coastguard Worker             register_rt_signal_handler, signal, unblock_signal, Killable, SIGRTMIN,
102*bb4ee6a4SAndroid Build Coastguard Worker             AcpiNotifyEvent, NetlinkGenericSocket, SignalFd, Terminal,
103*bb4ee6a4SAndroid Build Coastguard Worker         };
104*bb4ee6a4SAndroid Build Coastguard Worker 
105*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::{
106*bb4ee6a4SAndroid Build Coastguard Worker             drop_capabilities, pipe, read_raw_stdin
107*bb4ee6a4SAndroid Build Coastguard Worker         };
108*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::{enable_core_scheduling, set_rt_prio_limit, set_rt_round_robin};
109*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::{flock, FlockOperation};
110*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::{getegid, geteuid};
111*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::{gettid, kill_process_group, reap_child};
112*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::logical_core_capacity;
113*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::logical_core_cluster_id;
114*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::logical_core_frequencies_khz;
115*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::logical_core_max_freq_khz;
116*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::sched_attr;
117*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::sched_setattr;
118*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::UnlinkUnixListener;
119*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::EventExt;
120*bb4ee6a4SAndroid Build Coastguard Worker         pub use linux::Gid;
121*bb4ee6a4SAndroid Build Coastguard Worker     }
122*bb4ee6a4SAndroid Build Coastguard Worker }
123*bb4ee6a4SAndroid Build Coastguard Worker 
124*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! {
125*bb4ee6a4SAndroid Build Coastguard Worker      if #[cfg(windows)] {
126*bb4ee6a4SAndroid Build Coastguard Worker         pub use sys::windows;
127*bb4ee6a4SAndroid Build Coastguard Worker 
128*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::{EventTrigger, EventExt, WaitContextExt};
129*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::IoBuf;
130*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::MemoryMappingBuilderWindows;
131*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::set_thread_priority;
132*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::{give_foregrounding_permission, Console};
133*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::{named_pipes, named_pipes::PipeConnection};
134*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::{SafeMultimediaHandle, MAXIMUM_WAIT_OBJECTS};
135*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::set_sparse_file;
136*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::ioctl::ioctl_with_ptr_sized;
137*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::create_overlapped;
138*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::device_io_control;
139*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::number_of_logical_cores;
140*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::pagesize;
141*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::read_overlapped_blocking;
142*bb4ee6a4SAndroid Build Coastguard Worker 
143*bb4ee6a4SAndroid Build Coastguard Worker         pub use tube::{
144*bb4ee6a4SAndroid Build Coastguard Worker             deserialize_and_recv, serialize_and_send, set_alias_pid, set_duplicate_handle_tube,
145*bb4ee6a4SAndroid Build Coastguard Worker             DuplicateHandleRequest, DuplicateHandleResponse, DuplicateHandleTube
146*bb4ee6a4SAndroid Build Coastguard Worker         };
147*bb4ee6a4SAndroid Build Coastguard Worker         pub use tube::PipeTube;
148*bb4ee6a4SAndroid Build Coastguard Worker         pub use tube::FlushOnDropTube;
149*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::{set_audio_thread_priority, thread};
150*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::Pid;
151*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows::Terminal;
152*bb4ee6a4SAndroid Build Coastguard Worker     }
153*bb4ee6a4SAndroid Build Coastguard Worker }
154*bb4ee6a4SAndroid Build Coastguard Worker 
155*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! {
156*bb4ee6a4SAndroid Build Coastguard Worker     if #[cfg(unix)] {
157*bb4ee6a4SAndroid Build Coastguard Worker         pub use sys::unix;
158*bb4ee6a4SAndroid Build Coastguard Worker 
159*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::IoBuf;
160*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::net::UnixSeqpacket;
161*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::net::UnixSeqpacketListener;
162*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::net::UnlinkUnixSeqpacketListener;
163*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::ScmSocket;
164*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::SCM_SOCKET_MAX_FD_COUNT;
165*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::add_fd_flags;
166*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::clear_fd_flags;
167*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::number_of_logical_cores;
168*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::pagesize;
169*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix::Pid;
170*bb4ee6a4SAndroid Build Coastguard Worker     }
171*bb4ee6a4SAndroid Build Coastguard Worker }
172*bb4ee6a4SAndroid Build Coastguard Worker 
173*bb4ee6a4SAndroid Build Coastguard Worker pub use descriptor_reflection::deserialize_with_descriptors;
174*bb4ee6a4SAndroid Build Coastguard Worker pub use descriptor_reflection::with_as_descriptor;
175*bb4ee6a4SAndroid Build Coastguard Worker pub use descriptor_reflection::with_raw_descriptor;
176*bb4ee6a4SAndroid Build Coastguard Worker pub use descriptor_reflection::FileSerdeWrapper;
177*bb4ee6a4SAndroid Build Coastguard Worker pub use descriptor_reflection::SerializeDescriptors;
178*bb4ee6a4SAndroid Build Coastguard Worker pub use log::debug;
179*bb4ee6a4SAndroid Build Coastguard Worker pub use log::error;
180*bb4ee6a4SAndroid Build Coastguard Worker pub use log::info;
181*bb4ee6a4SAndroid Build Coastguard Worker pub use log::trace;
182*bb4ee6a4SAndroid Build Coastguard Worker pub use log::warn;
183*bb4ee6a4SAndroid Build Coastguard Worker pub use mmap::Protection;
184*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::get_cpu_affinity;
185*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::getpid;
186*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::open_file_or_duplicate;
187*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::platform_timer_resolution::enable_high_res_timers;
188*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::set_cpu_affinity;
189*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::set_thread_name;
190*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::BlockingMode;
191*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::EventContext;
192*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::FramingMode;
193*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::MemoryMappingArena;
194*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::RawDescriptor;
195*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::StreamChannel;
196*bb4ee6a4SAndroid Build Coastguard Worker pub use platform::INVALID_DESCRIPTOR;
197*bb4ee6a4SAndroid Build Coastguard Worker use uuid::Uuid;
198*bb4ee6a4SAndroid Build Coastguard Worker 
199*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::descriptor::AsRawDescriptor;
200*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::descriptor::AsRawDescriptors;
201*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::descriptor::Descriptor;
202*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::descriptor::FromRawDescriptor;
203*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::descriptor::IntoRawDescriptor;
204*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::descriptor::SafeDescriptor;
205*bb4ee6a4SAndroid Build Coastguard Worker 
206*bb4ee6a4SAndroid Build Coastguard Worker /// An empty trait that helps reset timer resolution to its previous state.
207*bb4ee6a4SAndroid Build Coastguard Worker // TODO(b:232103460): Maybe this needs to be thought through.
208*bb4ee6a4SAndroid Build Coastguard Worker pub trait EnabledHighResTimer {}
209*bb4ee6a4SAndroid Build Coastguard Worker 
210*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a UUID.
generate_uuid() -> String211*bb4ee6a4SAndroid Build Coastguard Worker pub fn generate_uuid() -> String {
212*bb4ee6a4SAndroid Build Coastguard Worker     let mut buf = Uuid::encode_buffer();
213*bb4ee6a4SAndroid Build Coastguard Worker     Uuid::new_v4()
214*bb4ee6a4SAndroid Build Coastguard Worker         .as_hyphenated()
215*bb4ee6a4SAndroid Build Coastguard Worker         .encode_lower(&mut buf)
216*bb4ee6a4SAndroid Build Coastguard Worker         .to_owned()
217*bb4ee6a4SAndroid Build Coastguard Worker }
218*bb4ee6a4SAndroid Build Coastguard Worker 
219*bb4ee6a4SAndroid Build Coastguard Worker use serde::Deserialize;
220*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize;
221*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq, Eq)]
222*bb4ee6a4SAndroid Build Coastguard Worker pub enum VmEventType {
223*bb4ee6a4SAndroid Build Coastguard Worker     Exit,
224*bb4ee6a4SAndroid Build Coastguard Worker     Reset,
225*bb4ee6a4SAndroid Build Coastguard Worker     Crash,
226*bb4ee6a4SAndroid Build Coastguard Worker     Panic(u8),
227*bb4ee6a4SAndroid Build Coastguard Worker     WatchdogReset,
228*bb4ee6a4SAndroid Build Coastguard Worker }
229*bb4ee6a4SAndroid Build Coastguard Worker 
230*bb4ee6a4SAndroid Build Coastguard Worker /// Uses the system's page size in bytes to round the given value up to the nearest page boundary.
231*bb4ee6a4SAndroid Build Coastguard Worker #[inline(always)]
round_up_to_page_size(v: usize) -> usize232*bb4ee6a4SAndroid Build Coastguard Worker pub fn round_up_to_page_size(v: usize) -> usize {
233*bb4ee6a4SAndroid Build Coastguard Worker     let page_mask = pagesize() - 1;
234*bb4ee6a4SAndroid Build Coastguard Worker     (v + page_mask) & !page_mask
235*bb4ee6a4SAndroid Build Coastguard Worker }
236