1.. SPDX-License-Identifier: GPL-2.0 2 3.. include:: ../../disclaimer-zh_TW.rst 4 5:Original: Documentation/arch/loongarch/introduction.rst 6:Translator: Huacai Chen <chenhuacai@loongson.cn> 7 8============= 9LoongArch介紹 10============= 11 12LoongArch是一種新的RISC ISA,在一定程度上類似於MIPS和RISC-V。LoongArch指令集 13包括一個精簡32位版(LA32R)、一個標準32位版(LA32S)、一個64位版(LA64)。 14LoongArch定義了四個特權級(PLV0~PLV3),其中PLV0是最高特權級,用於內核;而PLV3 15是最低特權級,用於應用程序。本文檔介紹了LoongArch的寄存器、基礎指令集、虛擬內 16存以及其他一些主題。 17 18寄存器 19====== 20 21LoongArch的寄存器包括通用寄存器(GPRs)、浮點寄存器(FPRs)、向量寄存器(VRs) 22和用於特權模式(PLV0)的控制狀態寄存器(CSRs)。 23 24通用寄存器 25---------- 26 27LoongArch包括32個通用寄存器( ``$r0`` ~ ``$r31`` ),LA32中每個寄存器爲32位寬, 28LA64中每個寄存器爲64位寬。 ``$r0`` 的內容總是固定爲0,而其他寄存器在體系結構層面 29沒有特殊功能。( ``$r1`` 算是一個例外,在BL指令中固定用作鏈接返回寄存器。) 30 31內核使用了一套LoongArch寄存器約定,定義在LoongArch ELF psABI規範中,詳細描述參見 32:ref:`參考文獻 <loongarch-references-zh_TW>`: 33 34================= =============== =================== ========== 35寄存器名 別名 用途 跨調用保持 36================= =============== =================== ========== 37``$r0`` ``$zero`` 常量0 不使用 38``$r1`` ``$ra`` 返回地址 否 39``$r2`` ``$tp`` TLS/線程信息指針 不使用 40``$r3`` ``$sp`` 棧指針 是 41``$r4``-``$r11`` ``$a0``-``$a7`` 參數寄存器 否 42``$r4``-``$r5`` ``$v0``-``$v1`` 返回值 否 43``$r12``-``$r20`` ``$t0``-``$t8`` 臨時寄存器 否 44``$r21`` ``$u0`` 每CPU變量基地址 不使用 45``$r22`` ``$fp`` 幀指針 是 46``$r23``-``$r31`` ``$s0``-``$s8`` 靜態寄存器 是 47================= =============== =================== ========== 48 49.. note:: 50 注意: ``$r21`` 寄存器在ELF psABI中保留未使用,但是在Linux內核用於保 51 存每CPU變量基地址。該寄存器沒有ABI命名,不過在內核中稱爲 ``$u0`` 。在 52 一些遺留代碼中有時可能見到 ``$v0`` 和 ``$v1`` ,它們是 ``$a0`` 和 53 ``$a1`` 的別名,屬於已經廢棄的用法。 54 55浮點寄存器 56---------- 57 58當系統中存在FPU時,LoongArch有32個浮點寄存器( ``$f0`` ~ ``$f31`` )。在LA64 59的CPU核上,每個寄存器均爲64位寬。 60 61浮點寄存器的使用約定與LoongArch ELF psABI規範的描述相同: 62 63================= ================== =================== ========== 64寄存器名 別名 用途 跨調用保持 65================= ================== =================== ========== 66``$f0``-``$f7`` ``$fa0``-``$fa7`` 參數寄存器 否 67``$f0``-``$f1`` ``$fv0``-``$fv1`` 返回值 否 68``$f8``-``$f23`` ``$ft0``-``$ft15`` 臨時寄存器 否 69``$f24``-``$f31`` ``$fs0``-``$fs7`` 靜態寄存器 是 70================= ================== =================== ========== 71 72.. note:: 73 注意:在一些遺留代碼中有時可能見到 ``$fv0`` 和 ``$fv1`` ,它們是 74 ``$fa0`` 和 ``$fa1`` 的別名,屬於已經廢棄的用法。 75 76 77向量寄存器 78---------- 79 80LoongArch現有兩種向量擴展: 81 82- 128位向量擴展LSX(全稱Loongson SIMD eXtention), 83- 256位向量擴展LASX(全稱Loongson Advanced SIMD eXtention)。 84 85LSX使用 ``$v0`` ~ ``$v31`` 向量寄存器,而LASX則使用 ``$x0`` ~ ``$x31`` 。 86 87浮點寄存器和向量寄存器是複用的,比如:在一個實現了LSX和LASX的核上, ``$x0`` 的 88低128位與 ``$v0`` 共用, ``$v0`` 的低64位與 ``$f0`` 共用,其他寄存器依此類推。 89 90控制狀態寄存器 91-------------- 92 93控制狀態寄存器只能在特權模式(PLV0)下訪問: 94 95================= ==================================== ========== 96地址 全稱描述 簡稱 97================= ==================================== ========== 980x0 當前模式信息 CRMD 990x1 異常前模式信息 PRMD 1000x2 擴展部件使能 EUEN 1010x3 雜項控制 MISC 1020x4 異常配置 ECFG 1030x5 異常狀態 ESTAT 1040x6 異常返回地址 ERA 1050x7 出錯(Faulting)虛擬地址 BADV 1060x8 出錯(Faulting)指令字 BADI 1070xC 異常入口地址 EENTRY 1080x10 TLB索引 TLBIDX 1090x11 TLB表項高位 TLBEHI 1100x12 TLB表項低位0 TLBELO0 1110x13 TLB表項低位1 TLBELO1 1120x18 地址空間標識符 ASID 1130x19 低半地址空間頁全局目錄基址 PGDL 1140x1A 高半地址空間頁全局目錄基址 PGDH 1150x1B 頁全局目錄基址 PGD 1160x1C 頁表遍歷控制低半部分 PWCL 1170x1D 頁表遍歷控制高半部分 PWCH 1180x1E STLB頁大小 STLBPS 1190x1F 縮減虛地址配置 RVACFG 1200x20 CPU編號 CPUID 1210x21 特權資源配置信息1 PRCFG1 1220x22 特權資源配置信息2 PRCFG2 1230x23 特權資源配置信息3 PRCFG3 1240x30+n (0≤n≤15) 數據保存寄存器 SAVEn 1250x40 定時器編號 TID 1260x41 定時器配置 TCFG 1270x42 定時器值 TVAL 1280x43 計時器補償 CNTC 1290x44 定時器中斷清除 TICLR 1300x60 LLBit相關控制 LLBCTL 1310x80 實現相關控制1 IMPCTL1 1320x81 實現相關控制2 IMPCTL2 1330x88 TLB重填異常入口地址 TLBRENTRY 1340x89 TLB重填異常出錯(Faulting)虛地址 TLBRBADV 1350x8A TLB重填異常返回地址 TLBRERA 1360x8B TLB重填異常數據保存 TLBRSAVE 1370x8C TLB重填異常表項低位0 TLBRELO0 1380x8D TLB重填異常表項低位1 TLBRELO1 1390x8E TLB重填異常表項高位 TLBEHI 1400x8F TLB重填異常前模式信息 TLBRPRMD 1410x90 機器錯誤控制 MERRCTL 1420x91 機器錯誤信息1 MERRINFO1 1430x92 機器錯誤信息2 MERRINFO2 1440x93 機器錯誤異常入口地址 MERRENTRY 1450x94 機器錯誤異常返回地址 MERRERA 1460x95 機器錯誤異常數據保存 MERRSAVE 1470x98 高速緩存標籤 CTAG 1480x180+n (0≤n≤3) 直接映射配置窗口n DMWn 1490x200+2n (0≤n≤31) 性能監測配置n PMCFGn 1500x201+2n (0≤n≤31) 性能監測計數器n PMCNTn 1510x300 內存讀寫監視點整體控制 MWPC 1520x301 內存讀寫監視點整體狀態 MWPS 1530x310+8n (0≤n≤7) 內存讀寫監視點n配置1 MWPnCFG1 1540x311+8n (0≤n≤7) 內存讀寫監視點n配置2 MWPnCFG2 1550x312+8n (0≤n≤7) 內存讀寫監視點n配置3 MWPnCFG3 1560x313+8n (0≤n≤7) 內存讀寫監視點n配置4 MWPnCFG4 1570x380 取指監視點整體控制 FWPC 1580x381 取指監視點整體狀態 FWPS 1590x390+8n (0≤n≤7) 取指監視點n配置1 FWPnCFG1 1600x391+8n (0≤n≤7) 取指監視點n配置2 FWPnCFG2 1610x392+8n (0≤n≤7) 取指監視點n配置3 FWPnCFG3 1620x393+8n (0≤n≤7) 取指監視點n配置4 FWPnCFG4 1630x500 調試寄存器 DBG 1640x501 調試異常返回地址 DERA 1650x502 調試數據保存 DSAVE 166================= ==================================== ========== 167 168ERA,TLBRERA,MERRERA和DERA有時也分別稱爲EPC,TLBREPC,MERREPC和DEPC。 169 170基礎指令集 171========== 172 173指令格式 174-------- 175 176LoongArch的指令字長爲32位,一共有9種基本指令格式(以及一些變體): 177 178=========== ========================== 179格式名稱 指令構成 180=========== ========================== 1812R Opcode + Rj + Rd 1823R Opcode + Rk + Rj + Rd 1834R Opcode + Ra + Rk + Rj + Rd 1842RI8 Opcode + I8 + Rj + Rd 1852RI12 Opcode + I12 + Rj + Rd 1862RI14 Opcode + I14 + Rj + Rd 1872RI16 Opcode + I16 + Rj + Rd 1881RI21 Opcode + I21L + Rj + I21H 189I26 Opcode + I26L + I26H 190=========== ========================== 191 192Opcode是指令操作碼,Rj和Rk是源操作數(寄存器),Rd是目標操作數(寄存器),Ra是 1934R-type格式特有的附加操作數(寄存器)。I8/I12/I14/I16/I21/I26分別是8位/12位/14位/ 19416位/21位/26位的立即數。其中較長的21位和26位立即數在指令字中被分割爲高位部分與低位 195部分,所以你們在這裏的格式描述中能夠看到I21L/I21H和I26L/I26H這樣帶後綴的表述。 196 197指令列表 198-------- 199 200爲了簡便起見,我們在此只羅列一下指令名稱(助記符),需要詳細信息請閱讀 201:ref:`參考文獻 <loongarch-references-zh_TW>` 中的文檔。 202 2031. 算術運算指令:: 204 205 ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D 206 SLT SLTU SLTI SLTUI 207 AND OR NOR XOR ANDN ORN ANDI ORI XORI 208 MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU 209 MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU 210 PCADDI PCADDU12I PCADDU18I 211 LU12I.W LU32I.D LU52I.D ADDU16I.D 212 2132. 移位運算指令:: 214 215 SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W 216 SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D 217 2183. 位域操作指令:: 219 220 EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D 221 BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D 222 REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D 223 MASKEQZ MASKNEZ 224 2254. 分支轉移指令:: 226 227 BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL 228 2295. 訪存讀寫指令:: 230 231 LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D 232 LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D 233 LDPTR.W LDPTR.D STPTR.W STPTR.D 234 PRELD PRELDX 235 2366. 原子操作指令:: 237 238 LL.W SC.W LL.D SC.D 239 AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D 240 AMMAX.W AMMAX.D AMMIN.W AMMIN.D 241 2427. 柵障指令:: 243 244 IBAR DBAR 245 2468. 特殊指令:: 247 248 SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D 249 ASRTLE.D ASRTGT.D 250 2519. 特權指令:: 252 253 CSRRD CSRWR CSRXCHG 254 IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D 255 CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE 256 257虛擬內存 258======== 259 260LoongArch可以使用直接映射虛擬內存和分頁映射虛擬內存。 261 262直接映射虛擬內存通過CSR.DMWn(n=0~3)來進行配置,虛擬地址(VA)和物理地址(PA) 263之間有簡單的映射關係:: 264 265 VA = PA + 固定偏移 266 267分頁映射的虛擬地址(VA)和物理地址(PA)有任意的映射關係,這種關係記錄在TLB和頁 268表中。LoongArch的TLB包括一個全相聯的MTLB(Multiple Page Size TLB,多樣頁大小TLB) 269和一個組相聯的STLB(Single Page Size TLB,單一頁大小TLB)。 270 271缺省狀態下,LA32的整個虛擬地址空間配置如下: 272 273============ =========================== =========================== 274區段名 地址範圍 屬性 275============ =========================== =========================== 276``UVRANGE`` ``0x00000000 - 0x7FFFFFFF`` 分頁映射, 可緩存, PLV0~3 277``KPRANGE0`` ``0x80000000 - 0x9FFFFFFF`` 直接映射, 非緩存, PLV0 278``KPRANGE1`` ``0xA0000000 - 0xBFFFFFFF`` 直接映射, 可緩存, PLV0 279``KVRANGE`` ``0xC0000000 - 0xFFFFFFFF`` 分頁映射, 可緩存, PLV0 280============ =========================== =========================== 281 282用戶態(PLV3)只能訪問UVRANGE,對於直接映射的KPRANGE0和KPRANGE1,將虛擬地址的第 28330~31位清零就等於物理地址。例如:物理地址0x00001000對應的非緩存直接映射虛擬地址 284是0x80001000,而其可緩存直接映射虛擬地址是0xA0001000。 285 286缺省狀態下,LA64的整個虛擬地址空間配置如下: 287 288============ ====================== ================================== 289區段名 地址範圍 屬性 290============ ====================== ================================== 291``XUVRANGE`` ``0x0000000000000000 - 分頁映射, 可緩存, PLV0~3 292 0x3FFFFFFFFFFFFFFF`` 293``XSPRANGE`` ``0x4000000000000000 - 直接映射, 可緩存 / 非緩存, PLV0 294 0x7FFFFFFFFFFFFFFF`` 295``XKPRANGE`` ``0x8000000000000000 - 直接映射, 可緩存 / 非緩存, PLV0 296 0xBFFFFFFFFFFFFFFF`` 297``XKVRANGE`` ``0xC000000000000000 - 分頁映射, 可緩存, PLV0 298 0xFFFFFFFFFFFFFFFF`` 299============ ====================== ================================== 300 301用戶態(PLV3)只能訪問XUVRANGE,對於直接映射的XSPRANGE和XKPRANGE,將虛擬地址的第 30260~63位清零就等於物理地址,而其緩存屬性是通過虛擬地址的第60~61位配置的(0表示強序 303非緩存,1表示一致可緩存,2表示弱序非緩存)。 304 305目前,我們僅用XKPRANGE來進行直接映射,XSPRANGE保留給以後用。 306 307此處給出一個直接映射的例子:物理地址0x00000000_00001000的強序非緩存直接映射虛擬地址 308(在XKPRANGE中)是0x80000000_00001000,其一致可緩存直接映射虛擬地址(在XKPRANGE中) 309是0x90000000_00001000,而其弱序非緩存直接映射虛擬地址(在XKPRANGE中)是0xA0000000_ 31000001000。 311 312Loongson與LoongArch的關係 313========================= 314 315LoongArch是一種RISC指令集架構(ISA),不同於現存的任何一種ISA,而Loongson(即龍 316芯)是一個處理器家族。龍芯包括三個系列:Loongson-1(龍芯1號)是32位處理器系列, 317Loongson-2(龍芯2號)是低端64位處理器系列,而Loongson-3(龍芯3號)是高端64位處理 318器系列。舊的龍芯處理器基於MIPS架構,而新的龍芯處理器基於LoongArch架構。以龍芯3號 319爲例:龍芯3A1000/3B1500/3A2000/3A3000/3A4000都是兼容MIPS的,而龍芯3A5000(以及將 320來的型號)都是基於LoongArch的。 321 322.. _loongarch-references-zh_TW: 323 324參考文獻 325======== 326 327Loongson官方網站(龍芯中科技術股份有限公司): 328 329 http://www.loongson.cn/ 330 331Loongson與LoongArch的開發者網站(軟件與文檔資源): 332 333 http://www.loongnix.cn/ 334 335 https://github.com/loongson/ 336 337 https://loongson.github.io/LoongArch-Documentation/ 338 339LoongArch指令集架構的文檔: 340 341 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-CN.pdf (中文版) 342 343 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-EN.pdf (英文版) 344 345LoongArch的ELF psABI文檔: 346 347 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.01-CN.pdf (中文版) 348 349 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.01-EN.pdf (英文版) 350 351Loongson與LoongArch的Linux內核源碼倉庫: 352 353 https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git 354 355