Coverage Report

Created: 2026-02-14 07:02

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