#[macro_use]
extern crate log;
#[macro_use]
extern crate alloc;
use ax_std as _;
mod banner;
mod config;
#[cfg(any(
feature = "test-console-atomic-output",
feature = "test-console-interleave"
))]
mod console_regression;
mod guest_console;
#[cfg(any(feature = "browser-console", feature = "http-axum"))]
mod http;
mod manager;
#[cfg(feature = "browser-console")]
mod network_console;
#[cfg(feature = "browser-console")]
mod network_status;
mod shell;
fn main() {
#[cfg(feature = "test-backtrace-panic")]
panic!("axvisor backtrace smoke test: deliberate panic to verify backtrace output");
#[cfg(feature = "test-panic-no-backtrace")]
panic!("axvisor no-backtrace smoke test: panic without backtrace");
guest_console::configure_host_console()
.unwrap_or_else(|error| panic!("failed to configure host console: {error:#}"));
guest_console::submit_host_bytes(banner::STARTUP);
info!("Starting virtualization...");
let manager = manager::AxvmManager::new()
.unwrap_or_else(|error| panic!("failed to initialize AxVM manager: {error:#}"));
manager.init_default_vms();
#[cfg(feature = "browser-console")]
network_console::start()
.unwrap_or_else(|error| panic!("failed to initialize browser consoles: {error:#}"));
#[cfg(feature = "browser-console")]
std::thread::Builder::new()
.name("axvisor-http".into())
.spawn(|| {
if let Err(error) = http::serve() {
let message = format!(
"\r\nAxvisor web console unavailable:\r\n bind = {}\r\n error = {error:#}\r\n",
http::bind_addr()
);
guest_console::submit_host_bytes(message.as_bytes());
}
})
.unwrap_or_else(|error| panic!("failed to start Axvisor HTTP server: {error}"));
#[cfg(all(feature = "http-axum", not(feature = "browser-console")))]
std::thread::Builder::new()
.name("axvisor-http".into())
.spawn(|| {
http::serve().unwrap_or_else(|error| panic!("Axvisor HTTP server failed: {error:#}"));
})
.unwrap_or_else(|error| panic!("failed to start Axvisor HTTP server: {error}"));
#[cfg(feature = "browser-console")]
network_status::start();
#[cfg(feature = "test-console-atomic-output")]
console_regression::emit_atomic_output();
#[cfg(feature = "test-console-interleave")]
console_regression::emit_interleave();
#[cfg(not(feature = "no-auto-start"))]
let started_vms = manager.launch_default_vms();
#[cfg(not(feature = "no-auto-start"))]
guest_console::attach_default(started_vms);
#[cfg(not(feature = "no-auto-start"))]
std::thread::Builder::new()
.name("axvisor-vm-wait".into())
.spawn(manager::AxvmManager::wait_for_default_vms)
.unwrap_or_else(|error| panic!("failed to start VM completion waiter: {error}"));
#[cfg(not(feature = "no-auto-start"))]
info!("[OK] Default guest initialized");
info!("shell task on CPU{}", axvm::host::cpu::current_id());
shell::console_init();
}