• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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