1use guid::Guid;
7use input_core::InputData;
8use memory_range::MemoryRange;
9use mesh::MeshPayload;
10use mesh::payload::Protobuf;
11use net_backend_resources::mac_address::MacAddress;
12use openvmm_pcat_locator::RomFileLocation;
13use std::fs::File;
14use vm_resource::Resource;
15use vm_resource::kind::PciDeviceHandleKind;
16use vm_resource::kind::VirtioDeviceHandle;
17use vm_resource::kind::VmbusDeviceHandleKind;
18use vmgs_resources::VmgsResource;
19use vmotherboard::ChipsetDeviceHandle;
20use vmotherboard::LegacyPciChipsetDeviceHandle;
21use vmotherboard::options::BaseChipsetManifest;
22use vmotherboard::options::VmChipsetCapabilities;
23
24#[derive(MeshPayload, Debug)]
25pub struct Config {
26 pub load_mode: LoadMode,
27 pub floppy_disks: Vec<floppy_resources::FloppyDiskConfig>,
28 pub ide_disks: Vec<ide_resources::IdeDeviceConfig>,
29 pub pcie_root_complexes: Vec<PcieRootComplexConfig>,
30 pub pcie_devices: Vec<PcieDeviceConfig>,
31 pub pcie_switches: Vec<PcieSwitchConfig>,
32 pub pcie_generic_initiators: Vec<PcieGenericInitiatorConfig>,
33 pub vpci_devices: Vec<VpciDeviceConfig>,
34 pub numa: NumaTopology,
35 pub processor_topology: ProcessorTopologyConfig,
36 pub hypervisor: HypervisorConfig,
37 pub chipset: BaseChipsetManifest,
38 pub vmbus: Option<VmbusConfig>,
39 pub vtl2_vmbus: Option<VmbusConfig>,
40 #[cfg(windows)]
41 pub kernel_vmnics: Vec<KernelVmNicConfig>,
42 pub input: mesh::Receiver<InputData>,
43 pub framebuffer: Option<framebuffer::Framebuffer>,
44 pub vga_firmware: Option<RomFileLocation>,
45 pub vtl2_gfx: bool,
46 pub virtio_devices: Vec<(VirtioBus, Resource<VirtioDeviceHandle>)>,
47 #[cfg(windows)]
48 pub vpci_resources: Vec<virt_whp::device::DeviceHandle>,
49 pub vmgs: Option<VmgsResource>,
50 pub secure_boot_enabled: bool,
51 pub custom_uefi_vars: firmware_uefi_custom_vars::CustomVars,
52 pub firmware_event_send: Option<mesh::Sender<get_resources::ged::FirmwareEvent>>,
54 pub debugger_rpc: Option<mesh::Receiver<vmm_core_defs::debug_rpc::DebugRequest>>,
55 pub vmbus_devices: Vec<(DeviceVtl, Resource<VmbusDeviceHandleKind>)>,
56 pub chipset_devices: Vec<ChipsetDeviceHandle>,
57 pub pci_chipset_devices: Vec<LegacyPciChipsetDeviceHandle>,
58 pub isa_dma_controller: Option<Resource<vm_resource::kind::IsaDmaControllerHandleKind>>,
59 pub chipset_capabilities: VmChipsetCapabilities,
60 pub layout: vmm_core_defs::LayoutConfig,
63 pub rtc_delta_milliseconds: i64,
65 pub automatic_guest_reset: bool,
67 pub efi_diagnostics_log_level: EfiDiagnosticsLogLevelType,
68}
69
70pub const DEFAULT_GIC_DISTRIBUTOR_BASE: u64 = 0xFFFF_0000;
71pub const DEFAULT_GIC_REDISTRIBUTORS_BASE: u64 = if cfg!(target_os = "linux") {
73 0xEFFF_0000
74} else {
75 0xEFFE_E000
76};
77
78pub const DEFAULT_GIC_V2M_MSI_FRAME_BASE: u64 = 0xEFFE_8000;
81pub const GIC_V2M_MSI_FRAME_SIZE: u64 = 0x1000;
83
84pub const DEFAULT_GIC_ITS_BASE: u64 = 0xEFFC_0000;
88pub const GIC_ITS_SIZE: u64 = 0x2_0000;
90
91pub const DEFAULT_VIRT_TIMER_PPI: u32 = 20;
94
95pub const DEFAULT_GIC_NR_IRQS: u32 = 992;
99
100pub const DEFAULT_VMBUS_PPI: u32 = 18;
102
103#[derive(MeshPayload, Debug, Clone, Copy, PartialEq, Eq)]
108pub enum LinuxDirectBootMode {
109 DeviceTree,
111 Acpi,
115}
116
117#[derive(MeshPayload, Debug)]
118pub enum LoadMode {
119 Linux {
120 kernel: File,
121 initrd: Option<File>,
122 cmdline: String,
123 enable_serial: bool,
124 custom_dsdt: Option<Vec<u8>>,
125 boot_mode: LinuxDirectBootMode,
126 },
127 Uefi {
128 firmware: File,
129 enable_debugging: bool,
130 enable_memory_protections: bool,
131 disable_frontpage: bool,
132 enable_tpm: bool,
133 enable_battery: bool,
134 enable_serial: bool,
135 enable_vpci_boot: bool,
136 uefi_console_mode: Option<UefiConsoleMode>,
137 default_boot_always_attempt: bool,
138 bios_guid: Guid,
139 enable_vmbus: bool,
140 force_dma_bounce: bool,
141 },
142 Pcat {
143 firmware: RomFileLocation,
144 boot_order: [PcatBootDevice; 4],
145 },
146 Igvm {
147 file: File,
148 cmdline: String,
149 vtl2_base_address: Vtl2BaseAddressType,
150 com_serial: Option<SerialInformation>,
151 },
152 None,
153}
154
155#[derive(Debug, Clone, Copy, MeshPayload)]
156pub struct SerialInformation {
157 pub io_port: u16,
158 pub irq: u32,
159}
160
161#[derive(Debug, Clone, Copy, MeshPayload)]
164pub enum Vtl2BaseAddressType {
165 File,
168 Absolute(u64),
171 MemoryLayout { size: Option<u64> },
179 Vtl2Allocate { size: Option<u64> },
187}
188
189#[derive(Debug, MeshPayload)]
193pub enum PcieMmioRangeConfig {
194 Dynamic {
196 size: u64,
198 },
199 Fixed(MemoryRange),
201}
202
203#[derive(Debug, MeshPayload)]
204pub struct RootComplexCxlConfig {
205 pub hdm_size: u64,
207 pub hdm_window_restrictions: u16,
209}
210
211#[derive(Debug, MeshPayload)]
212pub struct PcieRootComplexConfig {
213 pub index: u32,
214 pub name: String,
215 pub segment: u16,
216 pub start_bus: u8,
217 pub end_bus: u8,
218 pub low_mmio: PcieMmioRangeConfig,
219 pub high_mmio: PcieMmioRangeConfig,
220 pub ports: Vec<PciePortConfig>,
221 pub cxl: Option<RootComplexCxlConfig>,
223 pub iommu: Option<PcieIommuConfig>,
225 pub vnode: Option<u32>,
229 pub preserve_bars: bool,
232}
233
234#[derive(Debug, MeshPayload)]
237pub struct PciePortConfig {
238 pub name: String,
240 pub devfn: Option<u8>,
249 pub hotplug: bool,
251 pub acs_capabilities_supported: Option<u16>,
253 pub cxl: bool,
258}
259
260#[derive(Debug, MeshPayload)]
261pub struct PcieSwitchConfig {
262 pub name: String,
263 pub parent_port: String,
264 pub ports: Vec<PciePortConfig>,
266}
267
268#[derive(Debug, MeshPayload)]
278pub struct PcieGenericInitiatorConfig {
279 pub port_name: String,
282 pub node: u32,
284}
285
286#[derive(Debug, MeshPayload)]
287pub struct PcieDeviceConfig {
288 pub port_name: String,
289 pub resource: Resource<PciDeviceHandleKind>,
290}
291
292#[derive(Debug, MeshPayload)]
293pub struct VpciDeviceConfig {
294 pub vtl: DeviceVtl,
295 pub instance_id: Guid,
298 pub resource: Resource<PciDeviceHandleKind>,
299 pub vnode: Option<u32>,
301}
302
303#[derive(Debug, Protobuf)]
304pub struct ProcessorTopologyConfig {
305 pub proc_count: u32,
306 pub vps_per_socket: Option<u32>,
307 pub enable_smt: Option<bool>,
308 pub arch: Option<ArchTopologyConfig>,
309}
310
311#[derive(Debug, Protobuf, Default, Clone)]
312pub struct X86TopologyConfig {
313 pub apic_id_offset: u32,
314 pub x2apic: X2ApicConfig,
315}
316
317#[derive(Debug, Default, Copy, Clone, Protobuf)]
318pub enum X2ApicConfig {
319 #[default]
320 Auto,
323 Supported,
326 Unsupported,
328 Enabled,
330}
331
332#[derive(Debug, Protobuf, Default, Clone)]
333pub enum PmuGsivConfig {
334 #[default]
335 Platform,
337 Gsiv(u32),
339 Disabled,
341}
342
343#[derive(Debug, Protobuf, Default, Clone)]
345pub enum GicMsiConfig {
346 #[default]
349 Auto,
350 Its,
352 V2m {
354 spi_count: Option<u32>,
357 },
358}
359
360#[derive(Debug, MeshPayload, Clone)]
362pub enum PcieIommuConfig {
363 AmdVi,
365 Smmu,
367 IntelVtd,
369}
370
371#[derive(Debug, Protobuf, Default, Clone)]
372pub struct Aarch64TopologyConfig {
373 pub gic_config: Option<GicConfig>,
374 pub pmu_gsiv: PmuGsivConfig,
375 pub gic_msi: GicMsiConfig,
376}
377
378#[derive(Debug, Protobuf, Clone)]
383pub enum GicConfig {
384 V2(Option<GicV2Config>),
386 V3(Option<GicV3Config>),
388}
389
390#[derive(Debug, Protobuf, Clone)]
392pub struct GicV2Config {
393 pub gic_distributor_base: u64,
394 pub cpu_interface_base: u64,
395}
396
397#[derive(Debug, Protobuf, Clone)]
399pub struct GicV3Config {
400 pub gic_distributor_base: u64,
401 pub gic_redistributors_base: u64,
402}
403
404#[derive(Debug, Protobuf, Clone)]
405pub enum ArchTopologyConfig {
406 X86(X86TopologyConfig),
407 Aarch64(Aarch64TopologyConfig),
408}
409
410#[derive(Debug, Clone, Copy, MeshPayload)]
412pub struct MemoryConfig {
413 pub mem_size: u64,
414 pub prefetch_memory: bool,
415 pub private_memory: bool,
416 pub transparent_hugepages: bool,
417 pub hugepages: bool,
418 pub hugepage_size: Option<u64>,
419 pub host_numa_node: Option<u32>,
422}
423
424#[derive(Debug, MeshPayload)]
426pub struct NumaTopology {
427 pub nodes: Vec<NumaNode>,
429 pub distances: Vec<NumaDistance>,
432}
433
434#[derive(Debug, MeshPayload)]
436pub struct NumaNode {
437 pub mem: Option<MemoryConfig>,
440 pub vps: VpAssignment,
442}
443
444#[derive(Debug, MeshPayload)]
446pub enum VpAssignment {
447 FromTopology,
454 Explicit(Vec<u32>),
456 Empty,
461}
462
463#[derive(Debug, MeshPayload)]
465pub struct NumaDistance {
466 pub src: u32,
468 pub dst: u32,
470 pub distance: u8,
472}
473
474#[derive(Debug, MeshPayload, Default)]
475pub struct VmbusConfig {
476 pub vsock_listener: Option<unix_socket::UnixListener>,
477 pub vsock_path: Option<String>,
478 pub vmbus_max_version: Option<u32>,
479 #[cfg(windows)]
480 pub vmbusproxy_handle: Option<vmbus_proxy::ProxyHandle>,
481 pub vtl2_redirect: bool,
482}
483
484#[derive(Debug, MeshPayload, Default)]
485pub struct HypervisorConfig {
486 pub with_hv: bool,
487 pub with_vtl2: Option<Vtl2Config>,
488 pub with_isolation: Option<IsolationType>,
489}
490
491#[derive(Debug, MeshPayload)]
492pub struct KernelVmNicConfig {
493 pub instance_id: Guid,
494 pub mac_address: MacAddress,
495 pub switch_port_id: SwitchPortId,
496}
497
498#[derive(Clone, Debug, MeshPayload)]
499pub struct SwitchPortId {
500 pub switch: Guid,
501 pub port: Guid,
502}
503
504pub const DEFAULT_PCAT_BOOT_ORDER: [PcatBootDevice; 4] = [
505 PcatBootDevice::Optical,
506 PcatBootDevice::HardDrive,
507 PcatBootDevice::Network,
508 PcatBootDevice::Floppy,
509];
510
511#[derive(MeshPayload, Debug, Clone, Copy, PartialEq)]
512pub enum PcatBootDevice {
513 Floppy,
514 HardDrive,
515 Optical,
516 Network,
517}
518
519#[derive(Eq, PartialEq, Debug, Copy, Clone, MeshPayload)]
520pub enum VirtioBus {
521 Mmio,
522 Pci,
523}
524
525#[derive(Eq, PartialEq, Debug, Copy, Clone, MeshPayload)]
527pub enum LateMapVtl0MemoryPolicy {
528 Halt,
530 Log,
532 InjectException,
534}
535
536impl From<LateMapVtl0MemoryPolicy> for virt::LateMapVtl0MemoryPolicy {
537 fn from(value: LateMapVtl0MemoryPolicy) -> Self {
538 match value {
539 LateMapVtl0MemoryPolicy::Halt => virt::LateMapVtl0MemoryPolicy::Halt,
540 LateMapVtl0MemoryPolicy::Log => virt::LateMapVtl0MemoryPolicy::Log,
541 LateMapVtl0MemoryPolicy::InjectException => {
542 virt::LateMapVtl0MemoryPolicy::InjectException
543 }
544 }
545 }
546}
547
548#[derive(Debug, Clone, MeshPayload)]
554pub struct Vtl2Config {
555 pub vtl0_alias_map: bool,
558 pub late_map_vtl0_memory: Option<LateMapVtl0MemoryPolicy>,
562}
563
564#[derive(Eq, PartialEq, Debug, Copy, Clone, MeshPayload)]
566pub enum IsolationType {
567 Vbs,
568}
569
570impl From<IsolationType> for virt::IsolationType {
571 fn from(value: IsolationType) -> Self {
572 match value {
573 IsolationType::Vbs => Self::Vbs,
574 }
575 }
576}
577
578#[derive(Copy, Clone, Debug, PartialEq, Eq, MeshPayload)]
580pub enum DeviceVtl {
581 Vtl0,
582 Vtl1,
583 Vtl2,
584}
585
586#[derive(Copy, Clone, Debug, MeshPayload)]
587pub enum UefiConsoleMode {
588 Default,
589 Com1,
590 Com2,
591 None,
592}
593
594#[derive(Copy, Clone, Debug, MeshPayload, Default)]
595pub enum EfiDiagnosticsLogLevelType {
596 #[default]
598 Default,
599 Info,
601 Full,
603}