Configuration System
Relevant source files
This document covers the AxVM hypervisor's configuration system, which manages VM setup parameters including CPU allocation, memory regions, device configurations, and image load addresses. The configuration system transforms TOML configuration files into structured data that drives VM creation and initialization.
For information about the VM creation process that uses these configurations, see Virtual Machine Implementation. For details about hardware abstraction interfaces, see Hardware Abstraction Layer.
Configuration Flow Overview
The configuration system follows a two-stage transformation process: external TOML configuration files are first parsed into raw configuration structures, then converted to internal VM configuration objects used during VM creation.
flowchart TD subgraph subGraph1["Processed Configuration (axvm)"] VMConfig["AxVMConfig"] CPUConfig["cpu_config: AxVCpuConfig"] ImageConfig["image_config: VMImageConfig"] MemConfig["memory_regions: Vec"] EmuDevices["emu_devices: Vec"] PassDevices["pass_through_devices: Vec"] end subgraph subGraph0["Raw Configuration (axvmconfig crate)"] CrateConfig["AxVMCrateConfig"] BaseConfig["base: VM metadata"] KernelConfig["kernel: Image addresses"] DeviceConfig["devices: Device setup"] end TOML["TOML Configuration File"] VMCreation["AxVM::new(config)"] AddressSpace["Address Space Setup"] VCPUSetup["vCPU Creation"] DeviceSetup["Device Initialization"] CrateConfig --> BaseConfig CrateConfig --> DeviceConfig CrateConfig --> KernelConfig CrateConfig --> VMConfig TOML --> CrateConfig VMConfig --> CPUConfig VMConfig --> EmuDevices VMConfig --> ImageConfig VMConfig --> MemConfig VMConfig --> PassDevices VMConfig --> VMCreation VMCreation --> AddressSpace VMCreation --> DeviceSetup VMCreation --> VCPUSetup
Sources: src/config.rs(L1 - L12) src/config.rs(L63 - L87)
Configuration Structure Hierarchy
The configuration system defines several interconnected structures that represent different aspects of VM setup. The main configuration object AxVMConfig
aggregates specialized configuration components.
classDiagram class AxVMConfig { -id: usize -name: String -vm_type: VMType -cpu_num: usize -phys_cpu_ids: Option~Vec~usize~~ -phys_cpu_sets: Option~Vec~usize~~ -cpu_config: AxVCpuConfig -image_config: VMImageConfig -memory_regions: Vec~VmMemConfig~ -emu_devices: Vec~EmulatedDeviceConfig~ -pass_through_devices: Vec~PassThroughDeviceConfig~ +id() usize +name() String +get_vcpu_affinities_pcpu_ids() Vec~(usize, Option~usize~, usize) ~ +bsp_entry() GuestPhysAddr +ap_entry() GuestPhysAddr +memory_regions() Vec~VmMemConfig~ +emu_devices() Vec~EmulatedDeviceConfig~ +pass_through_devices() Vec~PassThroughDeviceConfig~ } class AxVCpuConfig { +bsp_entry: GuestPhysAddr +ap_entry: GuestPhysAddr } class VMImageConfig { +kernel_load_gpa: GuestPhysAddr +bios_load_gpa: Option~GuestPhysAddr~ +dtb_load_gpa: Option~GuestPhysAddr~ +ramdisk_load_gpa: Option~GuestPhysAddr~ } class AxVMCrateConfig { +base: BaseConfig +kernel: KernelConfig +devices: DeviceConfig } AxVMConfig *-- AxVCpuConfig AxVMConfig *-- VMImageConfig AxVMConfig ..> AxVMCrateConfig : "From trait"
Sources: src/config.rs(L24 - L31) src/config.rs(L34 - L44) src/config.rs(L47 - L61)
Configuration Transformation Process
The From<AxVMCrateConfig>
trait implementation handles the conversion from raw TOML-derived configuration to the internal VM configuration format. This transformation maps external configuration fields to internal structures and converts address types to GuestPhysAddr
.
Key Transformation Steps
Source Field | Target Field | Transformation |
---|---|---|
cfg.base.id | id | Direct assignment |
cfg.base.name | name | Direct assignment |
cfg.base.cpu_num | cpu_num | Direct assignment |
cfg.kernel.entry_point | cpu_config.bsp_entry | GuestPhysAddr::from() |
cfg.kernel.kernel_load_addr | image_config.kernel_load_gpa | GuestPhysAddr::from() |
cfg.kernel.bios_load_addr | image_config.bios_load_gpa | Option::map(GuestPhysAddr::from) |
cfg.devices.emu_devices | emu_devices | Direct assignment |
Sources: src/config.rs(L63 - L87)
CPU Configuration
The CPU configuration system manages virtual CPU allocation, entry points, and physical CPU affinity mapping. The AxVCpuConfig
structure defines entry addresses for both Bootstrap Processor (BSP) and Application Processor (AP) initialization.
vCPU Affinity Management
The get_vcpu_affinities_pcpu_ids
method returns CPU mapping information as tuples containing:
- vCPU ID (0 to cpu_num-1)
- Physical CPU affinity mask (optional bitmap)
- Physical CPU ID (defaults to vCPU ID if not specified)
flowchart TD subgraph subGraph0["CPU Configuration"] CPUNum["cpu_num: usize"] VCPUIDs["vCPU IDs: 0..cpu_num"] PhysCPUIDs["phys_cpu_ids: Option>"] PhysIDs["Physical IDs mapping"] PhysCPUSets["phys_cpu_sets: Option>"] AffinityMask["Affinity bitmasks"] TupleGen["get_vcpu_affinities_pcpu_ids()"] Result["Vec<(vcpu_id, affinity_mask, phys_id)>"] end AffinityMask --> TupleGen CPUNum --> VCPUIDs PhysCPUIDs --> PhysIDs PhysCPUSets --> AffinityMask PhysIDs --> TupleGen TupleGen --> Result VCPUIDs --> TupleGen
Sources: src/config.rs(L24 - L31) src/config.rs(L108 - L124)
Memory Configuration
Memory configuration defines the guest physical memory layout through a vector of VmMemConfig
structures. Each memory region specifies mapping type, guest physical address ranges, and access permissions.
The VMImageConfig
structure manages load addresses for different VM image components:
Image Component | Configuration Field | Purpose |
---|---|---|
Kernel | kernel_load_gpa | Main kernel image load address |
BIOS | bios_load_gpa | Optional BIOS/firmware load address |
Device Tree | dtb_load_gpa | Optional device tree blob address |
Ramdisk | ramdisk_load_gpa | Optional initial ramdisk address |
Sources: src/config.rs(L34 - L44) src/config.rs(L144 - L146)
Device Configuration
The device configuration system supports two types of devices: emulated devices and passthrough devices. Device configurations are stored in separate vectors and accessed through dedicated getter methods.
flowchart TD subgraph subGraph1["External Types (axvmconfig)"] EmulatedDeviceConfig["EmulatedDeviceConfig"] PassThroughDeviceConfig["PassThroughDeviceConfig"] end subgraph subGraph0["Device Configuration"] DeviceConfig["devices section (TOML)"] EmuDevices["emu_devices: Vec"] PassDevices["passthrough_devices: Vec"] EmuGetter["emu_devices() getter"] PassGetter["pass_through_devices() getter"] VMSetup["VM Device Setup"] end DeviceConfig --> EmuDevices DeviceConfig --> PassDevices EmuDevices --> EmuGetter EmuDevices --> EmulatedDeviceConfig EmuGetter --> VMSetup PassDevices --> PassGetter PassDevices --> PassThroughDeviceConfig PassGetter --> VMSetup
Sources: src/config.rs(L9 - L12) src/config.rs(L149 - L156)
Configuration Usage in VM Creation
The AxVMConfig
object serves as the primary input to VM creation, providing all necessary parameters for initializing VM components. The configuration system exposes specific getter methods that VM creation logic uses to access different configuration aspects.
Configuration Access Methods
The configuration provides specialized accessor methods for different VM subsystems:
bsp_entry()
/ap_entry()
: CPU entry points for processor initializationimage_config()
: Image load addresses for kernel and auxiliary componentsmemory_regions()
: Memory layout and mapping configurationemu_devices()
/pass_through_devices()
: Device configuration for emulation and passthroughget_vcpu_affinities_pcpu_ids()
: CPU affinity and physical mapping information
Sources: src/config.rs(L126 - L156)