Cross-Architecture Features

Relevant source files

Purpose and Scope

This document covers features and abstractions in the axcpu library that work uniformly across all supported architectures (x86_64, AArch64, RISC-V, and LoongArch64). These cross-architecture features provide unified interfaces and common functionality that abstract away architecture-specific implementation details.

For architecture-specific implementations, see the dedicated architecture pages: x86_64 Architecture, AArch64 Architecture, RISC-V Architecture, and LoongArch64 Architecture. For user space specific functionality, see User Space Support.

Unified Trap Handling Framework

The axcpu library provides a distributed trap handling system that allows external code to register handlers for various types of traps and exceptions. This system works consistently across all supported architectures through the linkme crate's distributed slice mechanism.

Trap Handler Registration

The core trap handling framework defines three types of distributed handler slices:

flowchart TD
subgraph subGraph2["Handler Invocation"]
    HANDLE_TRAP["handle_trap! macroDispatches to first handler"]
    HANDLE_SYSCALL["handle_syscall functionDirect syscall dispatch"]
end
subgraph subGraph1["Registration Mechanism"]
    LINKME["linkme::distributed_sliceCompile-time collection"]
    DEF_TRAP["def_trap_handler macroCreates handler slices"]
    REG_TRAP["register_trap_handler macroRegisters individual handlers"]
end
subgraph subGraph0["Trap Handler Types"]
    IRQ["IRQ[fn(usize) -> bool]Hardware interrupts"]
    PAGE_FAULT["PAGE_FAULT[fn(VirtAddr, PageFaultFlags, bool) -> bool]Memory access violations"]
    SYSCALL["SYSCALL[fn(&TrapFrame, usize) -> isize]System calls (uspace feature)"]
end

DEF_TRAP --> IRQ
DEF_TRAP --> PAGE_FAULT
DEF_TRAP --> SYSCALL
IRQ --> HANDLE_TRAP
LINKME --> DEF_TRAP
PAGE_FAULT --> HANDLE_TRAP
REG_TRAP --> IRQ
REG_TRAP --> PAGE_FAULT
REG_TRAP --> SYSCALL
SYSCALL --> HANDLE_SYSCALL

Sources: src/trap.rs(L10 - L22)  src/trap.rs(L6 - L7) 

Handler Dispatch Mechanism

The trap handling system uses a macro-based dispatch mechanism that supports single-handler registration. When multiple handlers are registered for the same trap type, the system issues a warning and uses only the first handler.

flowchart TD
subgraph subGraph1["Handler Selection Logic"]
    ITERATOR["Handler slice iterator"]
    FIRST["Take first handler"]
    WARN["Warn if multiple handlers"]
    DEFAULT["Default behavior if none"]
end
subgraph subGraph0["Dispatch Flow"]
    TRAP_EVENT["Trap EventHardware generated"]
    ARCH_HANDLER["Architecture HandlerCaptures context"]
    HANDLE_MACRO["handle_trap! macroFinds registered handler"]
    USER_HANDLER["User HandlerApplication logic"]
    RETURN["Return ControlResume or terminate"]
end

ARCH_HANDLER --> HANDLE_MACRO
HANDLE_MACRO --> ITERATOR
HANDLE_MACRO --> USER_HANDLER
ITERATOR --> DEFAULT
ITERATOR --> FIRST
ITERATOR --> WARN
TRAP_EVENT --> ARCH_HANDLER
USER_HANDLER --> RETURN

Sources: src/trap.rs(L25 - L38)  src/trap.rs(L42 - L44) 

Architecture-Agnostic Abstractions

The library provides common abstractions that are implemented differently by each architecture but present a unified interface to higher-level code.

Core Data Structure Patterns

Each architecture implements the same core abstractions with architecture-specific layouts:

flowchart TD
subgraph subGraph1["Architecture Implementations"]
    X86_IMPL["x86_64 ImplementationCallee-saved regs + stack + TLS"]
    ARM_IMPL["aarch64 ImplementationR19-R29 + SP + TPIDR + FpState"]
    RISC_IMPL["riscv Implementationra, sp, s0-s11, tp + SATP"]
    LOONG_IMPL["loongarch64 ImplementationCallee-saved + SP + TP + FPU"]
end
subgraph subGraph0["Common Abstractions"]
    TASK_CONTEXT["TaskContextMinimal context for task switching"]
    TRAP_FRAME["TrapFrameComplete CPU state for exceptions"]
    EXTENDED_STATE["Extended StateFPU, SIMD, special registers"]
end

EXTENDED_STATE --> ARM_IMPL
EXTENDED_STATE --> LOONG_IMPL
EXTENDED_STATE --> RISC_IMPL
EXTENDED_STATE --> X86_IMPL
TASK_CONTEXT --> ARM_IMPL
TASK_CONTEXT --> LOONG_IMPL
TASK_CONTEXT --> RISC_IMPL
TASK_CONTEXT --> X86_IMPL
TRAP_FRAME --> ARM_IMPL
TRAP_FRAME --> LOONG_IMPL
TRAP_FRAME --> RISC_IMPL
TRAP_FRAME --> X86_IMPL

Sources: src/lib.rs(L14 - L28)  src/trap.rs(L5) 

Common Interface Design

The library uses Rust's module system and conditional compilation to provide a unified interface while allowing architecture-specific implementations:

flowchart TD
subgraph subGraph2["Architecture Modules"]
    X86_MOD["x86_64 moduleIntel/AMD implementation"]
    ARM_MOD["aarch64 moduleARM implementation"]
    RISC_MOD["riscv moduleRISC-V implementation"]
    LOONG_MOD["loongarch64 moduleLoongArch implementation"]
end
subgraph subGraph1["Architecture Selection"]
    CFG_IF["cfg_if! macroCompile-time arch selection"]
    TARGET_ARCH["target_arch attributesRust compiler directives"]
end
subgraph subGraph0["Interface Layer"]
    LIB_RS["src/lib.rsMain entry point"]
    TRAP_RS["src/trap.rsCross-arch trap handling"]
    PUBLIC_API["Public APIRe-exported types and functions"]
end

ARM_MOD --> PUBLIC_API
CFG_IF --> TARGET_ARCH
LIB_RS --> CFG_IF
LOONG_MOD --> PUBLIC_API
RISC_MOD --> PUBLIC_API
TARGET_ARCH --> ARM_MOD
TARGET_ARCH --> LOONG_MOD
TARGET_ARCH --> RISC_MOD
TARGET_ARCH --> X86_MOD
TRAP_RS --> PUBLIC_API
X86_MOD --> PUBLIC_API

Sources: src/lib.rs(L14 - L28) 

Feature-Based Conditional Compilation

The axcpu library uses Cargo features to enable optional functionality across all architectures. These features control the compilation of additional capabilities that may not be needed in all use cases.

Feature Flag System

FeaturePurposeAvailability
uspaceUser space support including system callsAll architectures
fp-simdFloating point and SIMD register managementAll architectures
tlsThread-local storage supportAll architectures

User Space Feature Integration

The uspace feature enables system call handling across all architectures:

flowchart TD
subgraph subGraph1["Architecture Integration"]
    X86_SYSCALL["x86_64: SYSCALL instructionGS_BASE, CR3 management"]
    ARM_SYSCALL["aarch64: SVC instructionTTBR0 user page tables"]
    RISC_SYSCALL["riscv: ECALL instructionSATP register switching"]
    LOONG_SYSCALL["loongarch64: SYSCALLPGDL page directory"]
end
subgraph subGraph0["uspace Feature"]
    FEATURE_FLAG["#[cfg(feature = uspace)]Conditional compilation"]
    SYSCALL_SLICE["SYSCALL handler sliceSystem call dispatch"]
    HANDLE_SYSCALL_FN["handle_syscall functionDirect invocation"]
end

FEATURE_FLAG --> SYSCALL_SLICE
HANDLE_SYSCALL_FN --> ARM_SYSCALL
HANDLE_SYSCALL_FN --> LOONG_SYSCALL
HANDLE_SYSCALL_FN --> RISC_SYSCALL
HANDLE_SYSCALL_FN --> X86_SYSCALL
SYSCALL_SLICE --> HANDLE_SYSCALL_FN

Sources: src/trap.rs(L19 - L22)  src/trap.rs(L41 - L44) 

Common Memory Management Abstractions

The library integrates with external crates to provide consistent memory management abstractions across architectures.

External Dependencies Integration

flowchart TD
subgraph subGraph2["Architecture Implementation"]
    MMU_INIT["init_mmu functionsArchitecture-specific setup"]
    PAGE_TABLES["Page table managementArchitecture-specific formats"]
    TLB_MGMT["TLB managementTranslation cache control"]
end
subgraph subGraph1["Cross-Architecture Usage"]
    VIRT_ADDR["VirtAddrVirtual address type"]
    PAGE_FAULT_FLAGS["PageFaultFlagsAlias for MappingFlags"]
    TRAP_HANDLERS["Distributed trap handlersCompile-time registration"]
end
subgraph subGraph0["External Crate Integration"]
    MEMORY_ADDR["memory_addr crateVirtAddr, PhysAddr types"]
    PAGE_TABLE_ENTRY["page_table_entry crateMappingFlags abstraction"]
    LINKME["linkme crateDistributed slice collection"]
end

LINKME --> TRAP_HANDLERS
MEMORY_ADDR --> VIRT_ADDR
PAGE_FAULT_FLAGS --> PAGE_TABLES
PAGE_TABLE_ENTRY --> PAGE_FAULT_FLAGS
TRAP_HANDLERS --> TLB_MGMT
VIRT_ADDR --> MMU_INIT

Sources: src/lib.rs(L9)  src/trap.rs(L3)  src/trap.rs(L8)  src/trap.rs(L6) 

Error Handling and Warnings

The cross-architecture framework includes built-in error handling and diagnostic capabilities that work consistently across all supported architectures.

Handler Registration Validation

The trap handling system validates handler registration at runtime and provides warnings for common configuration issues:

flowchart TD
subgraph subGraph0["Handler Validation Flow"]
    CHECK_ITER["Check handler iterator"]
    FIRST_HANDLER["Get first handler"]
    CHECK_MORE["Check for additional handlers"]
    WARN_MULTIPLE["Warn about multiple handlers"]
    INVOKE["Invoke selected handler"]
    NO_HANDLER["Warn about missing handlers"]
end

CHECK_ITER --> FIRST_HANDLER
CHECK_ITER --> NO_HANDLER
CHECK_MORE --> INVOKE
CHECK_MORE --> WARN_MULTIPLE
FIRST_HANDLER --> CHECK_MORE
NO_HANDLER --> INVOKE

The system issues specific warning messages for:

  • Multiple handlers registered for the same trap type
  • No handlers registered for a trap that occurs
  • Feature mismatches between compile-time and runtime expectations

Sources: src/trap.rs(L25 - L38)