System Architecture
Relevant source files
This document provides a detailed explanation of the overall system architecture for the arm_vcpu hypervisor implementation. It covers the core components, their relationships, and the data flow patterns that enable AArch64 virtualization. For specific implementation details of individual components, see Virtual CPU Management, Exception Handling System, and Context Switching and State Management.
Architecture Overview
The arm_vcpu system implements a Type-1 hypervisor architecture for AArch64 platforms, providing virtualization capabilities through the AArch64 virtualization extensions. The system operates at Exception Level 2 (EL2) and manages guest virtual machines running at EL1/EL0.
Core Component Relationships
Sources: src/vcpu.rs(L39 - L51) src/pcpu.rs(L10 - L16) src/lib.rs(L17 - L21)
System Initialization and Lifecycle
sequenceDiagram participant HostSystem as "Host System" participant Aarch64PerCpu as "Aarch64PerCpu" participant Aarch64VCpu as "Aarch64VCpu" participant GuestVM as "Guest VM" HostSystem ->> Aarch64PerCpu: new(cpu_id) Aarch64PerCpu ->> Aarch64PerCpu: Register IRQ_HANDLER HostSystem ->> Aarch64PerCpu: hardware_enable() Aarch64PerCpu ->> Aarch64PerCpu: Set VBAR_EL2 to exception_vector_base_vcpu Aarch64PerCpu ->> Aarch64PerCpu: Configure HCR_EL2 for virtualization HostSystem ->> Aarch64VCpu: new(Aarch64VCpuCreateConfig) Aarch64VCpu ->> Aarch64VCpu: Initialize TrapFrame and GuestSystemRegisters HostSystem ->> Aarch64VCpu: setup() Aarch64VCpu ->> Aarch64VCpu: init_hv() - Configure initial state HostSystem ->> Aarch64VCpu: set_entry(guest_entry_point) HostSystem ->> Aarch64VCpu: set_ept_root(page_table_root) loop VM Execution Cycle HostSystem ->> Aarch64VCpu: run() Aarch64VCpu ->> Aarch64VCpu: save_host_sp_el0() Aarch64VCpu ->> Aarch64VCpu: restore_vm_system_regs() Aarch64VCpu ->> GuestVM: Context switch to guest GuestVM -->> Aarch64VCpu: VM-Exit (trap/exception) Aarch64VCpu ->> Aarch64VCpu: vmexit_handler() Aarch64VCpu -->> HostSystem: Return AxVCpuExitReason end
Sources: src/vcpu.rs(L69 - L85) src/vcpu.rs(L99 - L111) src/pcpu.rs(L49 - L67)
Core Components
Virtual CPU (Aarch64VCpu)
The Aarch64VCpu<H: AxVCpuHal>
structure serves as the primary abstraction for a virtual CPU. It maintains both guest context and runtime state required for virtualization.
Field | Type | Purpose |
---|---|---|
ctx | TrapFrame | Guest general-purpose registers and execution state |
host_stack_top | u64 | Host stack pointer for context switching |
guest_system_regs | GuestSystemRegisters | Guest system control and configuration registers |
mpidr | u64 | Multiprocessor Affinity Register value for guest |
The VCPU implements the AxArchVCpu
trait, providing standardized interfaces for:
- Creation and configuration via
Aarch64VCpuCreateConfig
- Guest execution through the
run()
method - Entry point and page table configuration
- Register manipulation interfaces
Sources: src/vcpu.rs(L39 - L51) src/vcpu.rs(L64 - L124)
Per-CPU Management (Aarch64PerCpu)
The Aarch64PerCpu<H: AxVCpuHal>
structure manages hardware virtualization features on a per-CPU basis:
flowchart TD PCPU["Aarch64PerCpu"] HCR["HCR_EL2 RegisterHypervisor Configuration"] VBAR["VBAR_EL2 RegisterException Vector Base"] IRQ["IRQ_HANDLERPer-CPU IRQ Dispatch"] ORIG["ORI_EXCEPTION_VECTOR_BASEOriginal Vector Base"] VM["VM Bit - Virtualization"] RW["RW Bit - 64-bit Guest"] IMO["IMO/FMO - Virtual Interrupts"] TSC["TSC - SMC Instructions"] HCR --> IMO HCR --> RW HCR --> TSC HCR --> VM PCPU --> HCR PCPU --> IRQ PCPU --> ORIG PCPU --> VBAR
Sources: src/pcpu.rs(L10 - L16) src/pcpu.rs(L49 - L67) src/pcpu.rs(L18 - L26)
Hardware Abstraction Layer
The system uses the AxVCpuHal
trait to abstract platform-specific functionality:
Sources: src/vcpu.rs(L278) src/pcpu.rs(L35 - L37)
Context Switching Architecture
The system implements a sophisticated context switching mechanism that preserves both general-purpose and system registers across VM entries and exits:
flowchart TD subgraph subGraph2["Guest Context"] TRAP["TrapFrame(GPRs, SP_EL0, ELR, SPSR)"] GSYS["GuestSystemRegisters(System Control Registers)"] end subgraph subGraph1["Context Switch Operations"] SAVE_HOST["save_host_sp_el0()"] RESTORE_VM["restore_vm_system_regs()"] RUN_GUEST["run_guest()(Naked Function)"] VMEXIT["vmexit_handler()"] end subgraph subGraph0["Host Context"] HSP["Host SP_EL0(HOST_SP_EL0 per-CPU)"] HSTACK["Host Stack(save_regs_to_stack!)"] HSYS["Host System Registers(Original Hardware State)"] end GSYS --> VMEXIT HSP --> SAVE_HOST RESTORE_VM --> GSYS RESTORE_VM --> RUN_GUEST RUN_GUEST --> TRAP SAVE_HOST --> RESTORE_VM TRAP --> VMEXIT VMEXIT --> HSP VMEXIT --> HSTACK
Sources: src/vcpu.rs(L182 - L214) src/vcpu.rs(L226 - L244) src/vcpu.rs(L255 - L282)
Exception and Interrupt Handling
The system provides a multi-layered exception handling architecture that processes VM-exits and routes them appropriately:
flowchart TD subgraph subGraph3["Exit Reasons"] MMIO["AxVCpuExitReason::MmioRead/Write"] EXT_IRQ["AxVCpuExitReason::ExternalInterrupt"] SYSREG["AxVCpuExitReason::SystemRegister*"] PSCI["AxVCpuExitReason::CpuUp/Down"] end subgraph subGraph2["High-Level Dispatch"] SYNC_HANDLER["handle_exception_sync()"] IRQ_DISPATCH["IRQ_HANDLER per-CPU"] PANIC["invalid_exception_el2"] end subgraph subGraph1["Low-Level Processing"] VECTORS["exception_vector_base_vcpu(Assembly Vector Table)"] TRAMPOLINE["vmexit_trampoline(Context Save)"] end subgraph subGraph0["Exception Sources"] SYNC["Synchronous Exceptions(Data Aborts, HVC, SMC)"] IRQ["IRQ Interrupts"] INVALID["Invalid Exceptions"] end INVALID --> VECTORS IRQ --> VECTORS IRQ_DISPATCH --> EXT_IRQ SYNC --> VECTORS SYNC_HANDLER --> MMIO SYNC_HANDLER --> PSCI SYNC_HANDLER --> SYSREG TRAMPOLINE --> IRQ_DISPATCH TRAMPOLINE --> PANIC TRAMPOLINE --> SYNC_HANDLER VECTORS --> TRAMPOLINE
Sources: src/vcpu.rs(L275 - L281) src/pcpu.rs(L18 - L26) src/pcpu.rs(L55 - L57)
This architecture enables efficient virtualization by maintaining clear separation between host and guest contexts while providing comprehensive exception handling capabilities for all VM-exit scenarios.