#[macro_use]
extern crate log;
#[macro_use]
extern crate alloc;
use ax_std as _;
mod banner;
mod config;
mod guest_console;
mod manager;
mod shell;
#[cfg(any(feature = "backtrace", feature = "test-panic-no-backtrace"))]
fn init_panic_hook() {
std::panic::set_hook(Box::new(|info| {
eprintln!("{info}");
eprintln!("{}", axbacktrace::Backtrace::capture().kind("panic"));
}));
}
fn main() {
#[cfg(any(feature = "backtrace", feature = "test-panic-no-backtrace"))]
init_panic_hook();
#[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");
banner::print_logo();
info!("Starting virtualization...");
let manager = manager::AxvmManager::new()
.unwrap_or_else(|error| panic!("failed to initialize AxVM manager: {error:#}"));
manager.init_default_vms();
let default_vms = manager::AxvmManager::vm_list();
guest_console::configure_host_console_reader(&default_vms)
.unwrap_or_else(|error| panic!("failed to configure host console input: {error:#}"));
let started_vms = manager.launch_default_vms();
guest_console::attach_default(started_vms);
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}"));
info!("[OK] Default guest initialized");
shell::console_init();
}