1 // Copyright 2022 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 use std::collections::BTreeMap;
6 use std::thread::JoinHandle;
7
8 use anyhow::Result;
9 use arch::RunnableLinuxVm;
10 use arch::VirtioDeviceStub;
11 use base::AsRawDescriptor;
12 use base::Event;
13 use base::EventToken;
14 use base::ProtoTube;
15 use base::SendTube;
16 use base::Tube;
17 use base::WaitContext;
18 use crosvm_cli::sys::windows::exit::Exit;
19 use crosvm_cli::sys::windows::exit::ExitContext;
20 use devices::virtio;
21 #[cfg(feature = "gpu")]
22 use devices::virtio::vhost::user::gpu::sys::windows::product::GpuBackendConfig as GpuBackendConfigProduct;
23 #[cfg(feature = "gpu")]
24 use devices::virtio::vhost::user::gpu::sys::windows::product::GpuVmmConfig as GpuVmmConfigProduct;
25 #[cfg(feature = "gpu")]
26 use devices::virtio::vhost::user::gpu::sys::windows::GpuVmmConfig;
27 #[cfg(feature = "audio")]
28 use devices::virtio::vhost::user::snd::sys::windows::product::SndBackendConfig as SndBackendConfigProduct;
29 #[cfg(feature = "audio")]
30 use devices::virtio::vhost::user::snd::sys::windows::product::SndVmmConfig as SndVmmConfigProduct;
31 #[cfg(feature = "audio")]
32 use devices::virtio::vhost::user::snd::sys::windows::SndVmmConfig;
33 use devices::virtio::DisplayBackend;
34 use devices::virtio::EventDevice;
35 use devices::virtio::Gpu;
36 use devices::virtio::GpuParameters;
37 use hypervisor::VcpuX86_64 as VcpuArch;
38 use hypervisor::VmX86_64 as VmArch;
39 pub(crate) use metrics::log_descriptor;
40 pub(crate) use metrics::MetricEventType;
41 use sync::Mutex;
42 use vm_control::PvClockCommand;
43
44 use super::run_vcpu::VcpuRunMode;
45 use crate::crosvm::config::Config;
46 use crate::crosvm::sys::cmdline::RunMetricsCommand;
47 use crate::sys::platform::TaggedControlTube as SharedTaggedControlTube;
48
49 pub struct MessageFromService {}
50
51 pub struct ServiceVmState {}
52
53 impl ServiceVmState {
set_memory_size(&mut self, _size: u64)54 pub fn set_memory_size(&mut self, _size: u64) {}
generate_send_state_message(&self)55 pub fn generate_send_state_message(&self) {}
56 }
57
58 pub(super) struct RunControlArgs {}
59
60 #[derive(Debug)]
61 pub(super) enum TaggedControlTube {
62 Unused,
63 }
64
65 impl TaggedControlTube {
get_read_notifier(&self) -> &dyn AsRawDescriptor66 pub fn get_read_notifier(&self) -> &dyn AsRawDescriptor {
67 panic!(
68 "get_read_notifier called on generic tagged control: {:?}",
69 self
70 )
71 }
72 }
73
74 #[derive(EventToken, Debug)]
75 pub(super) enum Token {
76 VmEvent,
77 BrokerShutdown,
78 VmControl { index: usize },
79 }
80
handle_hungup_event(token: &Token)81 pub(super) fn handle_hungup_event(token: &Token) {
82 panic!(
83 "Unable to handle hungup on a shared token in product specific handler: {:?}",
84 token
85 )
86 }
87
setup_common_metric_invariants(cfg: &Config)88 pub(super) fn setup_common_metric_invariants(cfg: &Config) {}
89
90 // Sets package name to the name contained in `msg`.
set_package_name(msg: &MessageFromService)91 pub(super) fn set_package_name(msg: &MessageFromService) {}
92
get_run_control_args(cfg: &mut Config) -> RunControlArgs93 pub(super) fn get_run_control_args(cfg: &mut Config) -> RunControlArgs {
94 RunControlArgs {}
95 }
96 // Merges session invariants.
merge_session_invariants(serialized_session_invariants: &[u8])97 pub(super) fn merge_session_invariants(serialized_session_invariants: &[u8]) {}
98
99 // Handles sending command to pvclock device.
handle_pvclock_request(tube: &Option<Tube>, command: PvClockCommand) -> Result<()>100 pub(super) fn handle_pvclock_request(tube: &Option<Tube>, command: PvClockCommand) -> Result<()> {
101 Ok(())
102 }
103
104 // Run ime thread.
run_ime_thread( product_args: RunControlArgs, exit_evt: &Event, ) -> Result<Option<JoinHandle<Result<()>>>>105 pub(super) fn run_ime_thread(
106 product_args: RunControlArgs,
107 exit_evt: &Event,
108 ) -> Result<Option<JoinHandle<Result<()>>>> {
109 Ok(None)
110 }
111
create_snd_state_tube( control_tubes: &mut [SharedTaggedControlTube], ) -> Result<Option<Tube>>112 pub(super) fn create_snd_state_tube(
113 control_tubes: &mut [SharedTaggedControlTube],
114 ) -> Result<Option<Tube>> {
115 Ok(None)
116 }
117
create_snd_mute_tube_pair() -> Result<(Option<Tube>, Option<Tube>)>118 pub(super) fn create_snd_mute_tube_pair() -> Result<(Option<Tube>, Option<Tube>)> {
119 Ok((None, None))
120 }
121
122 // Returns two tubes and a handle to service_ipc. One for ipc_main_loop and another
123 // for proto_main_loop.
start_service_ipc_listener( service_pipe_name: Option<String>, ) -> Result<(Option<Tube>, Option<ProtoTube>, Option<()>)>124 pub(super) fn start_service_ipc_listener(
125 service_pipe_name: Option<String>,
126 ) -> Result<(Option<Tube>, Option<ProtoTube>, Option<()>)> {
127 Ok((None, None, None))
128 }
129
handle_tagged_control_tube_event( product_tube: &TaggedControlTube, virtio_snd_host_mute_tube: &mut Option<Tube>, service_vm_state: &mut ServiceVmState, ipc_main_loop_tube: Option<&Tube>, ac97_host_tubes: &[Tube], )130 pub(super) fn handle_tagged_control_tube_event(
131 product_tube: &TaggedControlTube,
132 virtio_snd_host_mute_tube: &mut Option<Tube>,
133 service_vm_state: &mut ServiceVmState,
134 ipc_main_loop_tube: Option<&Tube>,
135 ac97_host_tubes: &[Tube],
136 ) {
137 }
138
push_triggers<'a>( _triggers: &mut [(&'a dyn AsRawDescriptor, Token)], ipc_tube: &'a Option<Tube>, proto_tube: &'a Option<ProtoTube>, )139 pub(super) fn push_triggers<'a>(
140 _triggers: &mut [(&'a dyn AsRawDescriptor, Token)],
141 ipc_tube: &'a Option<Tube>,
142 proto_tube: &'a Option<ProtoTube>,
143 ) {
144 if ipc_tube.is_some() {
145 panic!("trying to push non-none ipc tube in generic product");
146 }
147 if proto_tube.is_some() {
148 panic!("trying to push non-none proto tube in generic product");
149 }
150 }
151
handle_received_token<V: VmArch + 'static, Vcpu: VcpuArch + 'static>( token: &Token, _ac97_host_tubes: &[Tube], _anti_tamper_main_thread_tube: &Option<ProtoTube>, _balloon_host_tube: &Option<Tube>, _control_tubes: &[SharedTaggedControlTube], _guest_os: &mut RunnableLinuxVm<V, Vcpu>, _ipc_main_loop_tube: Option<&Tube>, _memory_size_mb: u64, _proto_main_loop_tube: Option<&ProtoTube>, _pvclock_host_tube: &Option<Tube>, _run_mode_arc: &VcpuRunMode, _service_vm_state: &mut ServiceVmState, _vcpu_boxes: &Mutex<Vec<Box<dyn VcpuArch>>>, _virtio_snd_host_mute_tube: &mut Option<Tube>, )152 pub(super) fn handle_received_token<V: VmArch + 'static, Vcpu: VcpuArch + 'static>(
153 token: &Token,
154 _ac97_host_tubes: &[Tube],
155 _anti_tamper_main_thread_tube: &Option<ProtoTube>,
156 _balloon_host_tube: &Option<Tube>,
157 _control_tubes: &[SharedTaggedControlTube],
158 _guest_os: &mut RunnableLinuxVm<V, Vcpu>,
159 _ipc_main_loop_tube: Option<&Tube>,
160 _memory_size_mb: u64,
161 _proto_main_loop_tube: Option<&ProtoTube>,
162 _pvclock_host_tube: &Option<Tube>,
163 _run_mode_arc: &VcpuRunMode,
164 _service_vm_state: &mut ServiceVmState,
165 _vcpu_boxes: &Mutex<Vec<Box<dyn VcpuArch>>>,
166 _virtio_snd_host_mute_tube: &mut Option<Tube>,
167 ) {
168 panic!(
169 "Received an unrecognized shared token to product specific handler: {:?}",
170 token
171 )
172 }
173
spawn_anti_tamper_thread(wait_ctx: &WaitContext<Token>) -> Option<ProtoTube>174 pub(super) fn spawn_anti_tamper_thread(wait_ctx: &WaitContext<Token>) -> Option<ProtoTube> {
175 None
176 }
177
create_service_vm_state(_memory_size_mb: u64) -> ServiceVmState178 pub(super) fn create_service_vm_state(_memory_size_mb: u64) -> ServiceVmState {
179 ServiceVmState {}
180 }
181
create_gpu( vm_evt_wrtube: &SendTube, resource_bridges: Vec<Tube>, display_backends: Vec<DisplayBackend>, gpu_parameters: &GpuParameters, event_devices: Vec<EventDevice>, features: u64, _product_args: GpuBackendConfigProduct, ) -> Result<Gpu>182 pub(super) fn create_gpu(
183 vm_evt_wrtube: &SendTube,
184 resource_bridges: Vec<Tube>,
185 display_backends: Vec<DisplayBackend>,
186 gpu_parameters: &GpuParameters,
187 event_devices: Vec<EventDevice>,
188 features: u64,
189 _product_args: GpuBackendConfigProduct,
190 ) -> Result<Gpu> {
191 let wndproc_thread =
192 virtio::gpu::start_wndproc_thread(None).expect("Failed to start wndproc_thread!");
193
194 Ok(Gpu::new(
195 vm_evt_wrtube
196 .try_clone()
197 .exit_context(Exit::CloneTube, "failed to clone tube")?,
198 resource_bridges,
199 display_backends,
200 gpu_parameters,
201 None,
202 event_devices,
203 /* external_blob= */ false,
204 /* system_blob= */ false,
205 features,
206 BTreeMap::new(),
207 wndproc_thread,
208 ))
209 }
210
211 #[cfg(feature = "gpu")]
push_gpu_control_tubes( _control_tubes: &mut [SharedTaggedControlTube], _gpu_vmm_config: &mut GpuVmmConfig, )212 pub(super) fn push_gpu_control_tubes(
213 _control_tubes: &mut [SharedTaggedControlTube],
214 _gpu_vmm_config: &mut GpuVmmConfig,
215 ) {
216 }
217
218 #[cfg(feature = "audio")]
push_snd_control_tubes( _control_tubes: &mut [SharedTaggedControlTube], _snd_vmm_config: &mut SndVmmConfig, )219 pub(super) fn push_snd_control_tubes(
220 _control_tubes: &mut [SharedTaggedControlTube],
221 _snd_vmm_config: &mut SndVmmConfig,
222 ) {
223 }
224
225 #[cfg(feature = "audio")]
num_input_sound_devices(_cfg: &Config) -> u32226 pub(crate) fn num_input_sound_devices(_cfg: &Config) -> u32 {
227 0
228 }
229
230 #[cfg(feature = "audio")]
num_input_sound_streams(_cfg: &Config) -> u32231 pub(crate) fn num_input_sound_streams(_cfg: &Config) -> u32 {
232 0
233 }
234
235 #[cfg(feature = "gpu")]
get_gpu_product_configs( cfg: &Config, alias_pid: u32, ) -> Result<(GpuBackendConfigProduct, GpuVmmConfigProduct)>236 pub(crate) fn get_gpu_product_configs(
237 cfg: &Config,
238 alias_pid: u32,
239 ) -> Result<(GpuBackendConfigProduct, GpuVmmConfigProduct)> {
240 Ok((GpuBackendConfigProduct {}, GpuVmmConfigProduct {}))
241 }
242
243 #[cfg(feature = "audio")]
get_snd_product_configs( _cfg: &Config, _alias_pid: u32, ) -> Result<(SndBackendConfigProduct, SndVmmConfigProduct)>244 pub(crate) fn get_snd_product_configs(
245 _cfg: &Config,
246 _alias_pid: u32,
247 ) -> Result<(SndBackendConfigProduct, SndVmmConfigProduct)> {
248 Ok((SndBackendConfigProduct {}, SndVmmConfigProduct {}))
249 }
250
251 #[cfg(feature = "audio")]
virtio_sound_enabled() -> bool252 pub(super) fn virtio_sound_enabled() -> bool {
253 false
254 }
255
run_metrics(_args: RunMetricsCommand) -> Result<()>256 pub(crate) fn run_metrics(_args: RunMetricsCommand) -> Result<()> {
257 Ok(())
258 }
259
setup_metrics_reporting() -> Result<()>260 pub(crate) fn setup_metrics_reporting() -> Result<()> {
261 Ok(())
262 }
263
push_mouse_device( cfg: &Config, _gpu_vmm_config: &mut GpuVmmConfig, _devs: &mut [VirtioDeviceStub], ) -> Result<()>264 pub(super) fn push_mouse_device(
265 cfg: &Config,
266 _gpu_vmm_config: &mut GpuVmmConfig,
267 _devs: &mut [VirtioDeviceStub],
268 ) -> Result<()> {
269 Ok(())
270 }
271
push_pvclock_device( cfg: &Config, devs: &mut [VirtioDeviceStub], tsc_frequency: u64, tube: Tube, )272 pub(super) fn push_pvclock_device(
273 cfg: &Config,
274 devs: &mut [VirtioDeviceStub],
275 tsc_frequency: u64,
276 tube: Tube,
277 ) {
278 }
279