1. LoongArch 簡介¶
LoongArch 是一種新的 RISC ISA,有點像 MIPS 或 RISC-V。 目前有 3 種變體:簡化的 32 位版本 (LA32R)、標準的 32 位版本 (LA32S) 和 64 位版本 (LA64)。 LoongArch 中定義了 4 個特權級別 (PLV):PLV0~PLV3,從高到低。 核心在 PLV0 執行,而應用程式在 PLV3 執行。 本文件介紹了 LoongArch 的暫存器、基本指令集、虛擬記憶體和一些其他主題。
1.1. 暫存器¶
LoongArch 暫存器包括通用暫存器 (GPR)、浮點暫存器 (FPR)、向量暫存器 (VR) 和在特權模式 (PLV0) 下使用的控制狀態暫存器 (CSR)。
1.1.1. GPR¶
LoongArch 有 32 個 GPR($r0 ~ $r31); 在 LA32 中,每個暫存器都是 32 位寬,而在 LA64 中是 64 位寬。 $r0 硬連線到零,而其他暫存器在架構上沒有特殊之處。(除了 $r1,它被硬連線為 BL 指令的連結暫存器。)
核心使用 LoongArch 暫存器約定的一個變體,如 LoongArch ELF psABI 規範中所述,請參見參考文獻
名稱 |
別名 |
用途 |
跨呼叫保留 |
|---|---|---|---|
|
|
常量零 |
未使用 |
|
|
返回地址 |
否 |
|
|
TLS/執行緒指標 |
未使用 |
|
|
堆疊指標 |
是 |
|
|
引數暫存器 |
否 |
|
|
返回值 |
否 |
|
|
臨時暫存器 |
否 |
|
|
Percpu 基地址 |
未使用 |
|
|
幀指標 |
是 |
|
|
靜態暫存器 |
是 |
注意
暫存器 $r21 在 ELF psABI 中保留,但 Linux 核心使用它來儲存 percpu 基地址。 它通常沒有 ABI 名稱,但在核心中被稱為 $u0。 您可能還在一些舊程式碼中看到 $v0 或 $v1,但它們分別是 $a0 和 $a1 的已棄用別名。
1.1.2. FPR¶
當存在 FPU 時,LoongArch 有 32 個 FPR($f0 ~ $f31)。 在 LA64 核心上,每個暫存器都是 64 位寬。
浮點暫存器約定與 LoongArch ELF psABI 規範中描述的相同
名稱 |
別名 |
用途 |
跨呼叫保留 |
|---|---|---|---|
|
|
引數暫存器 |
否 |
|
|
返回值 |
否 |
|
|
臨時暫存器 |
否 |
|
|
靜態暫存器 |
是 |
注意
您可能在一些舊程式碼中看到 $fv0 或 $fv1,但它們分別是 $fa0 和 $fa1 的已棄用別名。
1.1.3. VR¶
目前 LoongArch 有 2 個向量擴充套件
具有 128 位向量的 LSX(Loongson SIMD eXtension),
具有 256 位向量的 LASX(Loongson Advanced SIMD eXtension)。
LSX 引入了 $v0 ~ $v31,而 LASX 引入了 $x0 ~ $x31 作為向量暫存器。
VR 與 FPR 重疊:例如,在實現 LSX 和 LASX 的核心上,$x0 的低 128 位與 $v0 共享,而 $v0 的低 64 位與 $f0 共享;所有其他 VR 也是如此。
1.1.4. CSR¶
CSR 只能從特權模式 (PLV0) 訪問
地址 |
全名 |
縮寫名稱 |
|---|---|---|
0x0 |
當前模式資訊 |
CRMD |
0x1 |
異常前模式資訊 |
PRMD |
0x2 |
擴充套件單元使能 |
EUEN |
0x3 |
雜項控制 |
MISC |
0x4 |
異常配置 |
ECFG |
0x5 |
異常狀態 |
ESTAT |
0x6 |
異常返回地址 |
ERA |
0x7 |
錯誤(故障)虛擬地址 |
BADV |
0x8 |
錯誤(故障)指令字 |
BADI |
0xC |
異常入口點地址 |
EENTRY |
0x10 |
TLB 索引 |
TLBIDX |
0x11 |
TLB 條目高位 |
TLBEHI |
0x12 |
TLB 條目低位 0 |
TLBELO0 |
0x13 |
TLB 條目低位 1 |
TLBELO1 |
0x18 |
地址空間識別符號 |
ASID |
0x19 |
低半地址空間的頁面全域性目錄地址 |
PGDL |
0x1A |
高半地址空間的頁面全域性目錄地址 |
PGDH |
0x1B |
頁面全域性目錄地址 |
PGD |
0x1C |
低半地址空間的頁面遍歷控制 |
PWCL |
0x1D |
高半地址空間的頁面遍歷控制 |
PWCH |
0x1E |
STLB 頁面大小 |
STLBPS |
0x1F |
縮減的虛擬地址配置 |
RVACFG |
0x20 |
CPU 識別符號 |
CPUID |
0x21 |
特權資源配置 1 |
PRCFG1 |
0x22 |
特權資源配置 2 |
PRCFG2 |
0x23 |
特權資源配置 3 |
PRCFG3 |
0x30+n (0≤n≤15) |
儲存的資料暫存器 |
SAVEn |
0x40 |
計時器識別符號 |
TID |
0x41 |
計時器配置 |
TCFG |
0x42 |
計時器值 |
TVAL |
0x43 |
計時器計數的補償 |
CNTC |
0x44 |
計時器中斷清除 |
TICLR |
0x60 |
LLBit 控制 |
LLBCTL |
0x80 |
特定於實現的控制 1 |
IMPCTL1 |
0x81 |
特定於實現的控制 2 |
IMPCTL2 |
0x88 |
TLB 重新填充異常入口點地址 |
TLBRENTRY |
0x89 |
TLB 重新填充異常 BAD(故障)虛擬地址 |
TLBRBADV |
0x8A |
TLB 重新填充異常返回地址 |
TLBRERA |
0x8B |
TLB 重新填充異常儲存的資料暫存器 |
TLBRSAVE |
0x8C |
TLB 重新填充異常條目低位 0 |
TLBRELO0 |
0x8D |
TLB 重新填充異常條目低位 1 |
TLBRELO1 |
0x8E |
TLB 重新填充異常條目高位 |
TLBEHI |
0x8F |
TLB 重新填充異常異常前模式資訊 |
TLBRPRMD |
0x90 |
機器錯誤控制 |
MERRCTL |
0x91 |
機器錯誤資訊 1 |
MERRINFO1 |
0x92 |
機器錯誤資訊 2 |
MERRINFO2 |
0x93 |
機器錯誤異常入口點地址 |
MERRENTRY |
0x94 |
機器錯誤異常返回地址 |
MERRERA |
0x95 |
機器錯誤異常儲存的資料暫存器 |
MERRSAVE |
0x98 |
快取 TAG |
CTAG |
0x180+n (0≤n≤3) |
直接對映配置視窗 n |
DMWn |
0x200+2n (0≤n≤31) |
效能監視器配置 n |
PMCFGn |
0x201+2n (0≤n≤31) |
效能監視器總計數器 n |
PMCNTn |
0x300 |
記憶體載入/儲存觀察點總控制 |
MWPC |
0x301 |
記憶體載入/儲存觀察點總狀態 |
MWPS |
0x310+8n (0≤n≤7) |
記憶體載入/儲存觀察點 n 配置 1 |
MWPnCFG1 |
0x311+8n (0≤n≤7) |
記憶體載入/儲存觀察點 n 配置 2 |
MWPnCFG2 |
0x312+8n (0≤n≤7) |
記憶體載入/儲存觀察點 n 配置 3 |
MWPnCFG3 |
0x313+8n (0≤n≤7) |
記憶體載入/儲存觀察點 n 配置 4 |
MWPnCFG4 |
0x380 |
指令獲取觀察點總控制 |
FWPC |
0x381 |
指令獲取觀察點總狀態 |
FWPS |
0x390+8n (0≤n≤7) |
指令獲取觀察點 n 配置 1 |
FWPnCFG1 |
0x391+8n (0≤n≤7) |
指令獲取觀察點 n 配置 2 |
FWPnCFG2 |
0x392+8n (0≤n≤7) |
指令獲取觀察點 n 配置 3 |
FWPnCFG3 |
0x393+8n (0≤n≤7) |
指令獲取觀察點 n 配置 4 |
FWPnCFG4 |
0x500 |
除錯暫存器 |
DBG |
0x501 |
除錯異常返回地址 |
DERA |
0x502 |
除錯異常儲存的資料暫存器 |
DSAVE |
ERA、TLBRERA、MERRERA 和 DERA 有時也分別稱為 EPC、TLBREPC、MERREPC 和 DEPC。
1.2. 基本指令集¶
1.2.1. 指令格式¶
LoongArch 指令是 32 位寬,屬於 9 種基本指令格式(及其變體)
格式名稱 |
組成 |
|---|---|
2R |
操作碼 + Rj + Rd |
3R |
操作碼 + Rk + Rj + Rd |
4R |
操作碼 + Ra + Rk + Rj + Rd |
2RI8 |
操作碼 + I8 + Rj + Rd |
2RI12 |
操作碼 + I12 + Rj + Rd |
2RI14 |
操作碼 + I14 + Rj + Rd |
2RI16 |
操作碼 + I16 + Rj + Rd |
1RI21 |
操作碼 + I21L + Rj + I21H |
I26 |
操作碼 + I26L + I26H |
Rd 是目標暫存器運算元,而 Rj、Rk 和 Ra(“a” 代表 “additional”)是源暫存器運算元。 I8/I12/I14/I16/I21/I26 是各自寬度的立即數運算元。 較長的 I21 和 I26 儲存在指令字中的單獨的較高和較低部分中,用 “L” 和 “H” 字尾表示。
1.2.2. 指令列表¶
為簡潔起見,此處僅列出指令名稱(助記符); 請參閱參考文獻以瞭解詳細資訊。
算術指令
ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D SLT SLTU SLTI SLTUI AND OR NOR XOR ANDN ORN ANDI ORI XORI MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU PCADDI PCADDU12I PCADDU18I LU12I.W LU32I.D LU52I.D ADDU16I.D
位移指令
SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D
位操作指令
EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D MASKEQZ MASKNEZ
分支指令
BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
載入/儲存指令
LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D LDPTR.W LDPTR.D STPTR.W STPTR.D PRELD PRELDX
原子操作指令
LL.W SC.W LL.D SC.D AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D AMMAX.W AMMAX.D AMMIN.W AMMIN.D
屏障指令
IBAR DBAR
特殊指令
SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D ASRTLE.D ASRTGT.D
特權指令
CSRRD CSRWR CSRXCHG IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE
1.3. 虛擬記憶體¶
LoongArch 支援直接對映的虛擬記憶體和頁面對映的虛擬記憶體。
直接對映的虛擬記憶體由 CSR.DMWn (n=0~3) 配置,它在虛擬地址 (VA) 和物理地址 (PA) 之間具有簡單的關係
VA = PA + FixedOffset
頁面對映的虛擬記憶體在 VA 和 PA 之間具有任意關係,該關係記錄在 TLB 和頁表中。 LoongArch 的 TLB 包括一個全相聯 MTLB(多頁面大小 TLB)和一個組相聯 STLB(單頁面大小 TLB)。
預設情況下,LA32 的整個虛擬地址空間配置如下
名稱 |
地址範圍 |
屬性 |
|---|---|---|
|
|
頁對映,快取,PLV0~3 |
|
|
直接對映,非快取,PLV0 |
|
|
直接對映,快取,PLV0 |
|
|
頁對映,快取,PLV0 |
使用者模式 (PLV3) 只能訪問 UVRANGE。 對於直接對映的 KPRANGE0 和 KPRANGE1,物理地址 (PA) 等於虛擬地址 (VA) 清除 bit30~31 後的值。 例如,0x00001000 的非快取直接對映 VA 是 0x80001000,快取直接對映 VA 是 0xA0001000。
預設情況下,LA64 的整個虛擬地址空間配置如下
名稱 |
地址範圍 |
屬性 |
|---|---|---|
|
|
頁對映,快取,PLV0~3 |
|
|
直接對映,快取/非快取,PLV0 |
|
|
直接對映,快取/非快取,PLV0 |
|
|
頁對映,快取,PLV0 |
使用者模式 (PLV3) 只能訪問 XUVRANGE。 對於直接對映的 XSPRANGE 和 XKPRANGE,物理地址 (PA) 等於虛擬地址 (VA) 清除 bit60~63 後的值,快取屬性由 VA 中的 bit60~61 配置:0 代表強順序非快取,1 代表一致性快取,2 代表弱順序非快取。
目前我們只使用 XKPRANGE 進行直接對映,XSPRANGE 被保留。
舉例說明:0x00000000_00001000 的強順序非快取直接對映 VA(在 XKPRANGE 中)是 0x80000000_00001000,0x00000000_00001000 的一致性快取直接對映 VA(在 XKPRANGE 中)是 0x90000000_00001000,0x00000000 _00001000 的弱順序非快取直接對映 VA(在 XKPRANGE 中)是 0xA0000000_00001000。
1.4. 龍芯和LoongArch的關係¶
LoongArch 是一種 RISC ISA,與任何其他現有的 ISA 不同,而龍芯是一個處理器系列。 龍芯包括 3 個系列:龍芯-1 是 32 位處理器系列,龍芯-2 是低端 64 位處理器系列,龍芯-3 是高階 64 位處理器系列。 老的龍芯基於 MIPS,而新的龍芯基於 LoongArch。 以龍芯-3 為例:龍芯-3A1000/3B1500/3A2000/3A3000/3A4000 與 MIPS 相容,而龍芯-3A5000(以及未來的修訂版)都基於 LoongArch。
1.5. 參考文獻¶
龍芯中科技術股份有限公司官方網站
龍芯和LoongArch的開發者網站(軟體和文件)
LoongArch ISA 文件
LoongArch ELF psABI 文件
龍芯和LoongArch的Linux核心倉庫