(config: &VmLaunchConfig)
| 75 | } |
| 76 | |
| 77 | fn run_qemu_vm(config: &VmLaunchConfig) -> Result<(), String> { |
| 78 | let gpu_bdf = config |
| 79 | .gpu_bdf |
| 80 | .as_deref() |
| 81 | .ok_or("gpu_bdf is required for QEMU backend")?; |
| 82 | let tap_device = config |
| 83 | .tap_device |
| 84 | .as_deref() |
| 85 | .ok_or("tap_device is required for QEMU backend")?; |
| 86 | let guest_mac = config |
| 87 | .guest_mac |
| 88 | .as_deref() |
| 89 | .ok_or("guest_mac is required for QEMU backend")?; |
| 90 | let vsock_cid = config |
| 91 | .vsock_cid |
| 92 | .ok_or("vsock_cid is required for QEMU backend")?; |
| 93 | let _guest_ip = config |
| 94 | .guest_ip |
| 95 | .as_deref() |
| 96 | .ok_or("guest_ip is required for QEMU backend")?; |
| 97 | let host_ip = config |
| 98 | .host_ip |
| 99 | .as_deref() |
| 100 | .ok_or("host_ip is required for QEMU backend")?; |
| 101 | |
| 102 | if !config.root_disk.is_file() { |
| 103 | return Err(format!( |
| 104 | "root disk image not found: {}", |
| 105 | config.root_disk.display() |
| 106 | )); |
| 107 | } |
| 108 | if !config.overlay_disk.is_file() { |
| 109 | return Err(format!( |
| 110 | "overlay disk image not found: {}", |
| 111 | config.overlay_disk.display() |
| 112 | )); |
| 113 | } |
| 114 | if let Some(image_disk) = &config.image_disk |
| 115 | && !image_disk.is_file() |
| 116 | { |
| 117 | return Err(format!("image disk not found: {}", image_disk.display())); |
| 118 | } |
| 119 | |
| 120 | if let Err(err) = procguard::die_with_parent_cleanup(procguard_kill_children) { |
| 121 | return Err(format!("procguard arm failed: {err}")); |
| 122 | } |
| 123 | |
| 124 | #[cfg(target_os = "linux")] |
| 125 | check_kvm_access()?; |
| 126 | |
| 127 | let guest_env = qemu_guest_env_vars(config, host_dns_server()); |
| 128 | write_guest_env_file(&config.overlay_disk, &guest_env)?; |
| 129 | |
| 130 | let gw_port = config.gateway_port.unwrap_or(0); |
| 131 | setup_tap_networking(tap_device, host_ip, gw_port)?; |
| 132 | let mut tap_guard = TapGuard::new(tap_device.to_string(), host_ip.to_string(), gw_port); |
| 133 | |
| 134 | let vmlinux = if let Some(kernel_image) = &config.kernel_image { |
no test coverage detected