Platform-Specific Configuration
Relevant source files
This document describes the architecture-specific configuration options in AxVisor. It covers the configuration files and settings required for each supported hardware platform (x86_64, ARM/aarch64, and RISC-V). For information about virtual machine configuration, see VM Configuration.
Configuration System Overview
AxVisor uses TOML configuration files to define platform-specific settings, which are located in the configs/platforms/
directory. These files contain architecture-dependent parameters such as memory layout, device specifications, and timer frequencies.
flowchart TD subgraph subGraph2["Runtime System"] vm_manager["VM Manager"] hal["Hardware Abstraction Layer"] end subgraph subGraph1["Build System"] axconfig["axconfigBuild-Time Config"] build_process["Build Process"] end subgraph subGraph0["Configuration Files"] platform_configs["Platform Configsconfigs/platforms/*.toml"] vm_configs["VM Configsconfigs/vms/*.toml"] end axconfig --> build_process platform_configs --> axconfig platform_configs --> hal platform_configs --> vm_configs vm_configs --> vm_manager
Sources: configs/platforms/x86_64-qemu-q35.toml(L1 - L58) Cargo.toml(L47 - L52)
Platform Configuration File Structure
Each platform configuration file follows a standardized format, with sections for platform identification, memory layout, and device specifications.
Example Configuration (x86_64-qemu-q35)
classDiagram class PlatformConfig { arch: string platform: string plat: PlatformSettings devices: DeviceSettings } class PlatformSettings { family: string phys-memory-base: usize phys-memory-size: usize kernel-base-paddr: usize kernel-base-vaddr: usize phys-virt-offset: usize phys-bus-offset: usize kernel-aspace-base: usize kernel-aspace-size: usize } class DeviceSettings { pci-ecam-base: usize pci-bus-end: usize timer-frequency: usize mmio-regions: [(usize, usize) ] virtio-mmio-regions: [(usize, usize) ] pci-ranges: [(usize, usize) ] } PlatformConfig --> PlatformSettings PlatformConfig --> DeviceSettings
Sources: configs/platforms/x86_64-qemu-q35.toml(L1 - L58)
Memory Layout Configuration
The memory layout configuration is one of the most critical aspects of platform-specific settings. It defines the physical and virtual memory address spaces, kernel loading addresses, and memory mapping offsets.
Memory Layout Parameters
Parameter | Description | Example (x86_64) |
---|---|---|
phys-memory-base | Base address of physical memory | 0x0 |
phys-memory-size | Size of physical memory | 0x8000000 (128MB) |
kernel-base-paddr | Physical address where kernel is loaded | 0x200000 |
kernel-base-vaddr | Virtual address of the kernel image | 0xffff800000200000 |
phys-virt-offset | Offset for physical-to-virtual address translation | 0xffff800000000000 |
kernel-aspace-base | Base of kernel address space | 0xffff800000000000 |
kernel-aspace-size | Size of kernel address space | 0x7fffffffff000 |
Sources: configs/platforms/x86_64-qemu-q35.toml(L13 - L30) scripts/lds/linker.lds.S(L1 - L94)
Device Configuration
Device configuration defines the memory-mapped I/O (MMIO) regions, PCI configuration, and other hardware-specific settings for each platform.
flowchart TD subgraph subGraph1["Platform-Specific Implementations"] x86_impl["x86_64 ImplementationIO APIC, Local APIC, HPET"] arm_impl["ARM ImplementationGICv2, ARM-specific timers"] riscv_impl["RISC-V ImplementationSBI runtime, PLIC"] end subgraph subGraph0["Device Configuration Components"] mmio["MMIO RegionsPhysical address regionsfor memory-mapped devices"] virtio["VirtIO MMIO RegionsRegions for virtualized I/O devices"] pci["PCI ConfigurationECAM base, bus numbers,memory ranges"] timer["Timer SettingsFrequency and configuration"] end mmio --> arm_impl mmio --> riscv_impl mmio --> x86_impl pci --> x86_impl timer --> arm_impl timer --> riscv_impl timer --> x86_impl virtio --> arm_impl virtio --> riscv_impl virtio --> x86_impl
Sources: configs/platforms/x86_64-qemu-q35.toml(L34 - L58) configs/vms/arceos-x86_64.toml(L40 - L77) configs/vms/nimbos-x86_64.toml(L40 - L77)
MMIO Regions
The mmio-regions
parameter defines the memory ranges reserved for memory-mapped devices. For x86_64-qemu-q35, these include:
- PCI config space: 0xb0000000 - 0xc0000000
- PCI devices: 0xfe000000 - 0xfec00000
- IO APIC: 0xfec00000 - 0xfec01000
- HPET: 0xfed00000 - 0xfed01000
- Local APIC: 0xfee00000 - 0xfee01000
Sources: configs/platforms/x86_64-qemu-q35.toml(L36 - L45)
PCI Configuration
PCI configuration varies by platform. For x86_64-qemu-q35, it includes:
- PCI ECAM base: 0xb0000000
- PCI bus end: 0xff
Sources: configs/platforms/x86_64-qemu-q35.toml(L49 - L54)
Timer Configuration
Platform-specific timer configuration is essential for proper scheduling and timing in the hypervisor. The configuration specifies the timer frequency and related parameters.
flowchart TD subgraph subGraph0["Timer Configuration"] timer_config["Platform Timer Configtimer-frequency"] periodic_interval["Periodic IntervalPERIODIC_INTERVAL_NANOS"] scheduler_next["scheduler_next_event()"] register_timer["register_timer()"] check_events["check_events()"] end periodic_interval --> scheduler_next register_timer --> check_events scheduler_next --> check_events timer_config --> periodic_interval
Sources: configs/platforms/x86_64-qemu-q35.toml(L57) src/vmm/timer.rs(L1 - L105)
Timer Implementation
The timer subsystem is implemented in src/vmm/timer.rs and uses platform-specific timers through the Hardware Abstraction Layer (HAL). For x86_64-qemu-q35, the timer frequency is set at 4 GHz.
The timer system uses the following key parameters:
timer-frequency
: Base frequency of the platform timer (e.g., 4 GHz for x86_64-qemu-q35)PERIODIC_INTERVAL_NANOS
: Derived fromaxconfig::TICKS_PER_SEC
andaxhal::time::NANOS_PER_SEC
Sources: src/vmm/timer.rs(L12) configs/platforms/x86_64-qemu-q35.toml(L57)
Relationship with VM Configuration
Platform-specific configurations form the foundation for VM configurations. VM configurations reference platform settings and may override or extend them for specific virtual machines.
flowchart TD subgraph subGraph1["VM Config"] vm_base["VM Base Infoid, name, cpu_num"] vm_kernel["Kernel Configentry_point, image_location,kernel_path, kernel_load_addr"] vm_memory["Memory Regionsbase_paddr, size, flags, map_type"] vm_devices["Device Specsemu_devices, passthrough_devices"] end subgraph subGraph0["Platform Config"] plat_arch["arch: x86_64"] plat_platform["platform: x86_64-qemu-q35"] plat_memory["Memory LayoutPhysical and virtualaddress spaces"] plat_devices["Device ConfigurationMMIO regions, PCI, timers"] end plat_arch --> vm_base plat_devices --> vm_devices plat_memory --> vm_memory plat_platform --> vm_base
Sources: configs/vms/arceos-x86_64.toml(L1 - L78) configs/vms/nimbos-x86_64.toml(L1 - L78) configs/platforms/x86_64-qemu-q35.toml(L1 - L58)
Memory Region Configuration in VMs
VM configurations specify memory regions that must be compatible with the platform's memory layout. For example, a VM configuration might include:
memory_regions = [
[0x0000_0000, 0x100_0000, 0x7, 0], # Low RAM 16M 0b111 R|W|EXECUTE
]
This defines a 16MB region starting at physical address 0, with read, write, and execute permissions (flags 0x7), using allocation mapping (map_type 0).
Sources: configs/vms/arceos-x86_64.toml(L42 - L44) configs/vms/nimbos-x86_64.toml(L42 - L44)
Device Passthrough in VMs
Platform-specific device configurations determine which devices can be passed through to VMs. The VM configuration specifies which devices to pass through and how to map them:
passthrough_devices = [
["IO APIC", 0xfec0_0000, 0xfec0_0000, 0x1000, 0x1],
["Local APIC", 0xfee0_0000, 0xfee0_0000, 0x1000, 0x1],
["HPET", 0xfed0_0000, 0xfed0_0000, 0x1000, 0x1],
]
Each entry specifies:
- Device name
- Base IPA (Intermediate Physical Address) in guest
- Base physical address in host
- Length of memory region
- Interrupt allocation flag
Sources: configs/vms/arceos-x86_64.toml(L55 - L77) configs/vms/nimbos-x86_64.toml(L55 - L77)
Architecture-Specific Considerations
Each supported architecture has specific configuration requirements and capabilities.
x86_64 Architecture
For x86_64 platforms, important considerations include:
- APIC configuration (IO APIC and Local APIC)
- HPET timer configuration
- PCI configuration space mapping
- Boot page table setup
Sources: configs/platforms/x86_64-qemu-q35.toml(L1 - L58) configs/vms/arceos-x86_64.toml(L55 - L77) configs/vms/nimbos-x86_64.toml(L55 - L77)
ARM/aarch64 Architecture
While not explicitly shown in the provided files, support for ARM architecture is indicated in the Cargo.toml file with features like "arm-el2". ARM platforms would have specific considerations for:
- GIC (Generic Interrupt Controller) configuration
- ARM-specific timer devices
- EL2 (Hypervisor) mode configuration
Sources: Cargo.toml(L43 - L45)
RISC-V Architecture
RISC-V support is mentioned in the system overview diagrams. RISC-V platforms would have specific considerations for:
- SBI (Supervisor Binary Interface) runtime configuration
- PLIC (Platform-Level Interrupt Controller) setup
- RISC-V privilege modes
Build Integration
The platform-specific configuration is integrated into the build process through the axconfig
build dependency, which processes the configuration files at build time.
flowchart TD subgraph subGraph1["Configuration Sources"] platform_config["Platform Config Filesconfigs/platforms/*.toml"] linker_script["Linker Scriptscripts/lds/linker.lds.S"] end subgraph subGraph0["Build Process"] toml_parser["TOML Parser"] axconfig["axconfig Tool"] build_system["Build System"] final_binary["Final Binary"] end axconfig --> build_system axconfig --> linker_script build_system --> final_binary linker_script --> build_system platform_config --> toml_parser toml_parser --> axconfig
Sources: Cargo.toml(L47 - L52) scripts/lds/linker.lds.S(L1 - L94)