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 規範中所述,請參見參考文獻

名稱

別名

用途

跨呼叫保留

$r0

$zero

常量零

未使用

$r1

$ra

返回地址

$r2

$tp

TLS/執行緒指標

未使用

$r3

$sp

堆疊指標

$r4-$r11

$a0-$a7

引數暫存器

$r4-$r5

$v0-$v1

返回值

$r12-$r20

$t0-$t8

臨時暫存器

$r21

$u0

Percpu 基地址

未使用

$r22

$fp

幀指標

$r23-$r31

$s0-$s8

靜態暫存器

注意

暫存器 $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 規範中描述的相同

名稱

別名

用途

跨呼叫保留

$f0-$f7

$fa0-$fa7

引數暫存器

$f0-$f1

$fv0-$fv1

返回值

$f8-$f23

$ft0-$ft15

臨時暫存器

$f24-$f31

$fs0-$fs7

靜態暫存器

注意

您可能在一些舊程式碼中看到 $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. 指令列表

為簡潔起見,此處僅列出指令名稱(助記符); 請參閱參考文獻以瞭解詳細資訊。

  1. 算術指令

    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
    
  2. 位移指令

    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
    
  3. 位操作指令

    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
    
  4. 分支指令

    BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
    
  5. 載入/儲存指令

    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
    
  6. 原子操作指令

    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
    
  7. 屏障指令

    IBAR DBAR
    
  8. 特殊指令

    SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D
    ASRTLE.D ASRTGT.D
    
  9. 特權指令

    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 的整個虛擬地址空間配置如下

名稱

地址範圍

屬性

UVRANGE

0x00000000 - 0x7FFFFFFF

頁對映,快取,PLV0~3

KPRANGE0

0x80000000 - 0x9FFFFFFF

直接對映,非快取,PLV0

KPRANGE1

0xA0000000 - 0xBFFFFFFF

直接對映,快取,PLV0

KVRANGE

0xC0000000 - 0xFFFFFFFF

頁對映,快取,PLV0

使用者模式 (PLV3) 只能訪問 UVRANGE。 對於直接對映的 KPRANGE0 和 KPRANGE1,物理地址 (PA) 等於虛擬地址 (VA) 清除 bit30~31 後的值。 例如,0x00001000 的非快取直接對映 VA 是 0x80001000,快取直接對映 VA 是 0xA0001000。

預設情況下,LA64 的整個虛擬地址空間配置如下

名稱

地址範圍

屬性

XUVRANGE

0x0000000000000000 - 0x3FFFFFFFFFFFFFFF

頁對映,快取,PLV0~3

XSPRANGE

0x4000000000000000 - 0x7FFFFFFFFFFFFFFF

直接對映,快取/非快取,PLV0

XKPRANGE

0x8000000000000000 - 0xBFFFFFFFFFFFFFFF

直接對映,快取/非快取,PLV0

XKVRANGE

0xC000000000000000 - 0xFFFFFFFFFFFFFFFF

頁對映,快取,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核心倉庫