diff --git a/Cargo.lock b/Cargo.lock index 405ba47257..11b5ffceab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -449,6 +449,7 @@ dependencies = [ "crash_report", "cros_async", "cros_tracing", + "crosvm_cli", "crosvm_plugin", "ctrlc", "data_model", @@ -518,6 +519,16 @@ dependencies = [ "vm_memory", ] +[[package]] +name = "crosvm_cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "cfg-if", + "win_util", + "winapi", +] + [[package]] name = "crosvm_control" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 7b9ed8789b..054019324a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ members = [ "cros_async", "cros_fdt", "crosvm-fuzz", + "crosvm_cli", "crosvm_control", "crosvm_plugin", "devices", @@ -335,6 +336,7 @@ broker_ipc = { path = "broker_ipc" } cfg-if = "1.0.0" crash_report = { path = "crash_report", optional = true } cros_async = { path = "cros_async" } +crosvm_cli = { path = "crosvm_cli" } crosvm_plugin = { path = "crosvm_plugin", optional = true } data_model = "*" devices = { path = "devices" } diff --git a/crosvm_cli/Cargo.toml b/crosvm_cli/Cargo.toml new file mode 100644 index 0000000000..5c0bdcf9a2 --- /dev/null +++ b/crosvm_cli/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "crosvm_cli" +authors = ["The Chromium OS Authors"] +version = "0.1.0" +edition = "2021" + +[features] + +[dependencies] +anyhow = "1.0.32" +cfg-if = "1.0.0" + +[target.'cfg(windows)'.dependencies] +win_util = { path = "../win_util" } +winapi = "*" diff --git a/crosvm_cli/src/lib.rs b/crosvm_cli/src/lib.rs new file mode 100644 index 0000000000..28074b7e82 --- /dev/null +++ b/crosvm_cli/src/lib.rs @@ -0,0 +1,7 @@ +// Copyright 2022 The ChromiumOS Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +//! Contains common CLI code (e.g. exit code handling). + +pub mod sys; diff --git a/crosvm_cli/src/sys.rs b/crosvm_cli/src/sys.rs new file mode 100644 index 0000000000..b8f32670ae --- /dev/null +++ b/crosvm_cli/src/sys.rs @@ -0,0 +1,9 @@ +// Copyright 2022 The ChromiumOS Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +cfg_if::cfg_if! { + if #[cfg(windows)] { + pub mod windows; + } +} diff --git a/crosvm_cli/src/sys/windows.rs b/crosvm_cli/src/sys/windows.rs new file mode 100644 index 0000000000..74210093a5 --- /dev/null +++ b/crosvm_cli/src/sys/windows.rs @@ -0,0 +1,5 @@ +// Copyright 2022 The ChromiumOS Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +pub mod exit; diff --git a/src/crosvm/sys/windows/exit.rs b/crosvm_cli/src/sys/windows/exit.rs similarity index 100% rename from src/crosvm/sys/windows/exit.rs rename to crosvm_cli/src/sys/windows/exit.rs diff --git a/src/crosvm/sys/windows.rs b/src/crosvm/sys/windows.rs index 3256ab9fd8..79fcf85f1f 100644 --- a/src/crosvm/sys/windows.rs +++ b/src/crosvm/sys/windows.rs @@ -6,7 +6,6 @@ pub mod cmdline; pub mod config; pub(crate) mod broker; -pub(crate) mod exit; #[cfg(feature = "stats")] pub(crate) mod stats; diff --git a/src/crosvm/sys/windows/broker.rs b/src/crosvm/sys/windows/broker.rs index 6f2ea2e349..e5676c0cd5 100644 --- a/src/crosvm/sys/windows/broker.rs +++ b/src/crosvm/sys/windows/broker.rs @@ -56,6 +56,14 @@ use broker_ipc::EmulatorProcessInvariants; use crash_report::product_type; #[cfg(feature = "crash-report")] use crash_report::CrashReportAttributes; +use crosvm_cli::bail_exit_code; +use crosvm_cli::ensure_exit_code; +use crosvm_cli::sys::windows::exit::to_process_type_error; +use crosvm_cli::sys::windows::exit::Exit; +use crosvm_cli::sys::windows::exit::ExitCode; +use crosvm_cli::sys::windows::exit::ExitCodeWrapper; +use crosvm_cli::sys::windows::exit::ExitContext; +use crosvm_cli::sys::windows::exit::ExitContextAnyhow; #[cfg(feature = "slirp")] use devices::virtio::vhost::user::device::NetBackendConfig; #[cfg(feature = "gpu")] @@ -75,14 +83,6 @@ use win_util::ProcessType; use winapi::shared::winerror::ERROR_ACCESS_DENIED; use winapi::um::processthreadsapi::TerminateProcess; -use crate::bail_exit_code; -use crate::crosvm::sys::windows::exit::to_process_type_error; -use crate::crosvm::sys::windows::exit::Exit; -use crate::crosvm::sys::windows::exit::ExitCode; -use crate::crosvm::sys::windows::exit::ExitCodeWrapper; -use crate::crosvm::sys::windows::exit::ExitContext; -use crate::crosvm::sys::windows::exit::ExitContextAnyhow; -use crate::ensure_exit_code; use crate::Config; const KILL_CHILD_EXIT_CODE: u32 = 1; diff --git a/src/sys/windows.rs b/src/sys/windows.rs index 5588825ed6..bc15d62055 100644 --- a/src/sys/windows.rs +++ b/src/sys/windows.rs @@ -72,6 +72,9 @@ use base::VmEventType; use base::WaitContext; use broker_ipc::common_child_setup; use broker_ipc::CommonChildStartupArgs; +use crosvm_cli::sys::windows::exit::Exit; +use crosvm_cli::sys::windows::exit::ExitContext; +use crosvm_cli::sys::windows::exit::ExitContextAnyhow; use devices::serial_device::SerialHardware; use devices::serial_device::SerialParameters; use devices::tsc::get_tsc_sync_mitigations; @@ -206,9 +209,6 @@ use crate::crosvm::config::TouchDeviceOption; use crate::crosvm::sys::config::HypervisorKind; #[cfg(any(feature = "gvm", feature = "whpx"))] use crate::crosvm::sys::config::IrqChipKind; -use crate::crosvm::sys::windows::exit::Exit; -use crate::crosvm::sys::windows::exit::ExitContext; -use crate::crosvm::sys::windows::exit::ExitContextAnyhow; #[cfg(feature = "stats")] use crate::crosvm::sys::windows::stats::StatisticsCollector; use crate::sys::windows::metrics::log_descriptor; diff --git a/src/sys/windows/main.rs b/src/sys/windows/main.rs index e35e306feb..7fcfa7ff4d 100644 --- a/src/sys/windows/main.rs +++ b/src/sys/windows/main.rs @@ -18,6 +18,9 @@ use base::FromRawDescriptor; use base::RawDescriptor; use broker_ipc::common_child_setup; use broker_ipc::CommonChildStartupArgs; +use crosvm_cli::sys::windows::exit::Exit; +use crosvm_cli::sys::windows::exit::ExitContext; +use crosvm_cli::sys::windows::exit::ExitContextAnyhow; use metrics::event_details_proto::EmulatorDllDetails; use metrics::event_details_proto::RecordDetails; use metrics::MetricEventType; @@ -36,9 +39,6 @@ use crate::crosvm::sys::cmdline::DeviceSubcommand; use crate::crosvm::sys::cmdline::RunMainCommand; #[cfg(all(feature = "slirp"))] use crate::crosvm::sys::cmdline::RunSlirpCommand; -use crate::crosvm::sys::windows::exit::Exit; -use crate::crosvm::sys::windows::exit::ExitContext; -use crate::crosvm::sys::windows::exit::ExitContextAnyhow; use crate::metrics::run_metrics; use crate::CommandStatus; use crate::Config; diff --git a/src/sys/windows/metrics.rs b/src/sys/windows/metrics.rs index 44906a1fd9..f69499cc3b 100644 --- a/src/sys/windows/metrics.rs +++ b/src/sys/windows/metrics.rs @@ -10,7 +10,7 @@ cfg_if::cfg_if! { use base::Tube; use std::thread; use metrics_crate::MetricsController; - use crate::crosvm::sys::windows::exit::{Exit, ExitContext, ExitContextAnyhow}; + use crosvm_cli::sys::windows::exit::{Exit, ExitContext, ExitContextAnyhow}; use crate::sys::windows::main::set_bootstrap_arguments; use tube_transporter::{TubeToken, TubeTransporterReader}; use base::FromRawDescriptor; diff --git a/src/sys/windows/run_vcpu.rs b/src/sys/windows/run_vcpu.rs index cb79247051..cf5295a8c1 100644 --- a/src/sys/windows/run_vcpu.rs +++ b/src/sys/windows/run_vcpu.rs @@ -41,6 +41,10 @@ use cros_async::Executor; use cros_async::SelectResult; use cros_async::TimerAsync; use cros_tracing::trace_event; +use crosvm_cli::bail_exit_code; +use crosvm_cli::sys::windows::exit::Exit; +use crosvm_cli::sys::windows::exit::ExitContext; +use crosvm_cli::sys::windows::exit::ExitContextAnyhow; use devices::tsc::TscSyncMitigations; use devices::Bus; #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] @@ -81,10 +85,6 @@ use x86_64::cpuid::CpuIdContext; #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] use x86_64::X8664arch as Arch; -use crate::bail_exit_code; -use crate::crosvm::sys::windows::exit::Exit; -use crate::crosvm::sys::windows::exit::ExitContext; -use crate::crosvm::sys::windows::exit::ExitContextAnyhow; #[cfg(feature = "stats")] use crate::crosvm::sys::windows::stats::StatisticsCollector; #[cfg(feature = "stats")]