Overview

Relevant source files

Purpose and Scope

The x86_vlapic crate provides a software implementation of a virtual Local Advanced Programmable Interrupt Controller (LAPIC) for x86 hypervisor systems. This crate enables hypervisors to emulate LAPIC functionality for guest virtual machines without requiring direct hardware access to the physical LAPIC.

The crate implements both legacy xAPIC (MMIO-based) and modern x2APIC (MSR-based) access methods, allowing guest VMs to interact with a fully functional virtual interrupt controller. For detailed information about the architectural design and component interactions, see Core Architecture. For comprehensive register documentation and functionality, see Register System.

Virtual LAPIC Fundamentals

A Local APIC is a critical component in x86 multiprocessor systems that handles interrupt delivery, inter-processor communication, and timer functionality for each CPU core. In virtualized environments, guest operating systems expect to interact with LAPIC hardware, but direct hardware access would compromise isolation between virtual machines.

The x86_vlapic crate solves this by providing a software-based LAPIC implementation that:

  • Virtualizes all standard LAPIC registers and functionality
  • Supports both xAPIC MMIO accesses (address range 0xFEE00000-0xFEE00FFF) and x2APIC MSR accesses (MSR range 0x800-0x8FF)
  • Manages interrupt state through virtualized register arrays (ISR, TMR, IRR)
  • Implements Local Vector Table (LVT) registers for various interrupt sources
  • Provides timer functionality with support for one-shot, periodic, and TSC-deadline modes

High-Level System Architecture

flowchart TD
subgraph subGraph4["ArceOS Infrastructure"]
    AddrSpace["axaddrspaceMemory Management"]
    DeviceBase["axdevice_baseDevice Framework"]
    ErrNo["axerrnoError Handling"]
end
subgraph subGraph3["Physical Memory"]
    PhysPage["4KB PhysFrameAllocated via axaddrspace"]
end
subgraph subGraph2["Virtual Register Layer"]
    VirtRegs["VirtualApicRegs<H: AxMmHal>4KB Memory Page Management"]
    RegStructure["LocalAPICRegstock-registers Structure"]
end
subgraph subGraph1["EmulatedLocalApic Device"]
    EmuDev["EmulatedLocalApic<H: AxMmHal>BaseDeviceOps Implementation"]
    AddrXlate["Address Translation Layerxapic_mmio_access_reg_offset()x2apic_msr_access_reg()"]
end
subgraph subGraph0["Guest VM Access Layer"]
    GuestMMIO["Guest xAPIC MMIO Access0xFEE00000-0xFEE00FFF"]
    GuestMSR["Guest x2APIC MSR Access0x800-0x8FF"]
end

AddrXlate --> VirtRegs
EmuDev --> AddrXlate
EmuDev --> DeviceBase
EmuDev --> ErrNo
GuestMMIO --> EmuDev
GuestMSR --> EmuDev
RegStructure --> PhysPage
VirtRegs --> AddrSpace
VirtRegs --> RegStructure

Sources: src/lib.rs(L32 - L44)  Cargo.toml(L14 - L16) 

Dual Access Method Support

The virtual LAPIC supports both traditional and modern CPU access methods through a unified interface:

xAPIC Mode (MMIO-Based)

  • Address Range: 0xFEE00000 to 0xFEE00FFF (4KB)
  • Access Method: Memory-mapped I/O through guest physical addresses
  • Implementation: BaseDeviceOps<AddrRange<GuestPhysAddr>> trait
  • Translation Function: xapic_mmio_access_reg_offset()

x2APIC Mode (MSR-Based)

  • Address Range: MSR 0x800 to 0x8FF
  • Access Method: Model-Specific Register instructions (RDMSR/WRMSR)
  • Implementation: BaseDeviceOps<SysRegAddrRange> trait
  • Translation Function: x2apic_msr_access_reg()
flowchart TD
subgraph subGraph2["Unified Register Interface"]
    RegOffset["ApicRegOffset enumCommon register addressing"]
    VirtRegsRead["VirtualApicRegs.handle_read()"]
    VirtRegsWrite["VirtualApicRegs.handle_write()"]
end
subgraph subGraph1["Address Translation"]
    XAPICXlate["xapic_mmio_access_reg_offsetGuestPhysAddr → ApicRegOffset"]
    X2APICXlate["x2apic_msr_access_regSysRegAddr → ApicRegOffset"]
end
subgraph subGraph0["Access Method Implementations"]
    XAPICImpl["BaseDeviceOps<AddrRange<GuestPhysAddr>>handle_read/handle_write"]
    X2APICImpl["BaseDeviceOps<SysRegAddrRange>handle_read/handle_write"]
end

RegOffset --> VirtRegsRead
RegOffset --> VirtRegsWrite
X2APICImpl --> X2APICXlate
X2APICXlate --> RegOffset
XAPICImpl --> XAPICXlate
XAPICXlate --> RegOffset

Sources: src/lib.rs(L67 - L112)  src/lib.rs(L114 - L159)  src/lib.rs(L23 - L24) 

Core Components

EmulatedLocalApic Device

The EmulatedLocalApic<H: AxMmHal> struct serves as the primary device interface, implementing the ArceOS device framework through BaseDeviceOps. It coordinates between guest access requests and the underlying virtual register management system.

VirtualApicRegs Management

The VirtualApicRegs<H: AxMmHal> component manages a 4KB memory page that contains all virtualized LAPIC registers. This page is structured according to the standard LAPIC register layout and uses the tock-registers crate for type-safe register access.

Static APIC Access Page

A statically allocated 4KB page (VIRTUAL_APIC_ACCESS_PAGE) provides the foundation for hardware virtualization features. The address of this page can be configured in hardware virtualization controls to enable optimized guest access handling.

Register System

The crate implements a comprehensive register system including:

  • Control Registers: ID, Version, Task Priority Register (TPR), Spurious Interrupt Vector Register (SVR)
  • Interrupt State Arrays: In-Service Register (ISR), Trigger Mode Register (TMR), Interrupt Request Register (IRR)
  • Local Vector Table: Timer, Thermal, Performance Counter, LINT0/1, Error, CMCI registers
  • Timer Subsystem: Initial Count, Current Count, Divide Configuration registers

Sources: src/lib.rs(L27 - L30)  src/lib.rs(L33 - L43)  src/lib.rs(L47 - L64)  Cargo.toml(L7 - L16) 

Dependencies and Integration

The crate integrates with the ArceOS hypervisor ecosystem through several key dependencies:

ComponentPurposeUsage
axaddrspaceMemory management and address space operationsPhysical frame allocation, address translation
axdevice_baseDevice emulation frameworkBaseDeviceOpstrait implementation, interrupt injection
axerrnoError handlingStandardized error types (AxResult)
tock-registersType-safe register accessRegister field definitions and access patterns
memory_addrAddress abstractionsGuestPhysAddr,HostPhysAddr,HostVirtAddrtypes

The crate is designed to work within hypervisor systems that provide hardware-assisted virtualization features, supporting both Intel VT-x and AMD-V virtualization extensions through the abstracted AxMmHal trait.

Sources: Cargo.toml(L7 - L16)  src/lib.rs(L16 - L21)