LoongArch64 System Initialization
Relevant source files
This document covers the LoongArch64 system initialization routines in the axcpu library, focusing on the bootstrapping procedures for CPU state, memory management unit (MMU), and trap handling. The initialization process establishes the fundamental hardware configurations required for the CPU to operate in the kernel environment.
This page specifically covers system-level hardware initialization. For LoongArch64 CPU context management and task switching, see LoongArch64 Context Management. For low-level assembly operations and register manipulation, see LoongArch64 Assembly Operations.
Initialization Overview
The LoongArch64 system initialization process consists of two primary components: MMU/TLB configuration and trap handling setup. These initialization routines are implemented in the init_mmu
and init_trap
functions, which must be called during system bootstrap to establish a properly configured execution environment.
flowchart TD subgraph subGraph2["Trap Initialization"] EXCEPTION_VECTOR["Exception Vector Setup"] HANDLER_BASE["Handler Base Address"] end subgraph subGraph1["MMU Initialization"] TLB_CONFIG["TLB Configuration"] PAGE_TABLE["Page Table Setup"] TRANSLATION["Enable Translation"] end subgraph subGraph0["System Bootstrap Sequence"] START["System Boot"] INIT_MMU["init_mmu()"] INIT_TRAP["init_trap()"] READY["System Ready"] end INIT_MMU --> PAGE_TABLE INIT_MMU --> READY INIT_MMU --> TLB_CONFIG INIT_MMU --> TRANSLATION INIT_TRAP --> EXCEPTION_VECTOR INIT_TRAP --> HANDLER_BASE INIT_TRAP --> READY START --> INIT_MMU START --> INIT_TRAP
Sources: src/loongarch64/init.rs(L1 - L49)
MMU and TLB Initialization
The init_mmu
function performs comprehensive memory management unit initialization, configuring the Translation Lookaside Buffer (TLB), page table walking parameters, and enabling virtual memory translation.
TLB Configuration Process
The MMU initialization begins with TLB configuration, setting consistent 4KB page sizes across multiple TLB-related registers and establishing the TLB refill exception handler address.
flowchart TD subgraph subGraph1["Handler Setup"] HANDLE_TLB["handle_tlb_refill(extern assembly function)"] PHYS_ADDR["Convert to physical addressusing phys_virt_offset"] end subgraph subGraph0["TLB Register Configuration"] PS_4K["PS_4K = 0x0c(4KB Page Size)"] TLBIDX["tlbidx::set_ps()"] STLBPS["stlbps::set_ps()"] TLBREHI["tlbrehi::set_ps()"] TLBRENTRY["tlbrentry::set_tlbrentry()"] end HANDLE_TLB --> PHYS_ADDR PHYS_ADDR --> TLBRENTRY PS_4K --> STLBPS PS_4K --> TLBIDX PS_4K --> TLBREHI
Sources: src/loongarch64/init.rs(L19 - L25)
Page Table Walking Configuration
Following TLB setup, the function configures page table walking parameters and establishes both kernel and user page table root addresses.
Configuration Step | Function Call | Purpose |
---|---|---|
PWC Registers | write_pwc(PWCL_VALUE, PWCH_VALUE) | Set page walking control values |
Kernel Page Table | write_kernel_page_table(root_paddr) | Configure kernel space translation |
User Page Table | write_user_page_table(pa!(0)) | Initialize user space (initially zero) |
TLB Flush | flush_tlb(None) | Clear existing TLB entries |
Sources: src/loongarch64/init.rs(L28 - L33)
Translation Mode Activation
The final step enables mapped address translation mode through the Current Mode (CRMD
) register, activating virtual memory management.
flowchart TD subgraph subGraph0["Translation Activation"] CRMD_REG["CRMD Register"] PG_BIT["PG Bit = true"] TRANSLATION_ON["Virtual Memory Active"] end CRMD_REG --> PG_BIT PG_BIT --> TRANSLATION_ON
Sources: src/loongarch64/init.rs(L35 - L36)
Trap and Exception Initialization
The init_trap
function establishes the exception handling infrastructure by configuring the exception vector base address, which serves as the entry point for all hardware exceptions and interrupts.
Exception Vector Configuration
The trap initialization process involves setting up the base address for exception handling routines, linking the hardware exception mechanism to the software handlers.
flowchart TD subgraph subGraph0["Exception Vector Setup"] EXCEPTION_ENTRY["exception_entry_base(extern assembly function)"] ADDR_CALC["Get function address(exception_entry_base as usize)"] WRITE_BASE["write_exception_entry_base()(assembly call)"] VECTOR_SET["Exception Vector Configured"] end ADDR_CALC --> WRITE_BASE EXCEPTION_ENTRY --> ADDR_CALC WRITE_BASE --> VECTOR_SET
Sources: src/loongarch64/init.rs(L42 - L48)
Assembly Integration Points
Both initialization functions rely heavily on external assembly routines and low-level register operations that interface directly with LoongArch64 hardware.
External Assembly Functions
Function | Purpose | Used By |
---|---|---|
handle_tlb_refill | TLB refill exception handler | init_mmu |
exception_entry_base | Exception vector entry point | init_trap |
Assembly Module Integration
The initialization routines call several functions from the crate::asm
module:
write_pwc()
- Configure page walking control registerswrite_kernel_page_table()
- Set kernel page table rootwrite_user_page_table()
- Set user page table rootflush_tlb()
- Invalidate TLB entrieswrite_exception_entry_base()
- Set exception vector base
Sources: src/loongarch64/init.rs(L29 - L47)
Register and Hardware References
The initialization code directly manipulates several LoongArch64-specific control registers through the loongArch64::register
module:
- CRMD - Current Mode register for translation control
- STLBPS - Shared TLB Page Size register
- TLBIDX - TLB Index register
- TLBREHI - TLB Refill Entry High register
- TLBRENTRY - TLB Refill Exception Entry Base Address register
These registers are documented in the LoongArch Architecture Reference Manual, with specific links provided in the source code comments.
Sources: src/loongarch64/init.rs(L3 - L13)