brintos

brintos / linux-shallow public Read only

0
0
Text · 16.3 KiB · a5603f9 Raw
355 lines · plain
1.. SPDX-License-Identifier: GPL-2.02 3.. include:: ../../disclaimer-zh_TW.rst4 5:Original: Documentation/arch/loongarch/introduction.rst6: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是最高特權級,用於內核;而PLV315是最低特權級,用於應用程序。本文檔介紹了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`` )。在LA6459的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               當前模式信息                         CRMD990x1               異常前模式信息                       PRMD1000x2               擴展部件使能                         EUEN1010x3               雜項控制                             MISC1020x4               異常配置                             ECFG1030x5               異常狀態                             ESTAT1040x6               異常返回地址                         ERA1050x7               出錯(Faulting)虛擬地址               BADV1060x8               出錯(Faulting)指令字                 BADI1070xC               異常入口地址                         EENTRY1080x10              TLB索引                              TLBIDX1090x11              TLB表項高位                          TLBEHI1100x12              TLB表項低位0                         TLBELO01110x13              TLB表項低位1                         TLBELO11120x18              地址空間標識符                       ASID1130x19              低半地址空間頁全局目錄基址           PGDL1140x1A              高半地址空間頁全局目錄基址           PGDH1150x1B              頁全局目錄基址                       PGD1160x1C              頁表遍歷控制低半部分                 PWCL1170x1D              頁表遍歷控制高半部分                 PWCH1180x1E              STLB頁大小                           STLBPS1190x1F              縮減虛地址配置                       RVACFG1200x20              CPU編號                              CPUID1210x21              特權資源配置信息1                    PRCFG11220x22              特權資源配置信息2                    PRCFG21230x23              特權資源配置信息3                    PRCFG31240x30+n (0≤n≤15)   數據保存寄存器                       SAVEn1250x40              定時器編號                           TID1260x41              定時器配置                           TCFG1270x42              定時器值                             TVAL1280x43              計時器補償                           CNTC1290x44              定時器中斷清除                       TICLR1300x60              LLBit相關控制                        LLBCTL1310x80              實現相關控制1                        IMPCTL11320x81              實現相關控制2                        IMPCTL21330x88              TLB重填異常入口地址                  TLBRENTRY1340x89              TLB重填異常出錯(Faulting)虛地址      TLBRBADV1350x8A              TLB重填異常返回地址                  TLBRERA1360x8B              TLB重填異常數據保存                  TLBRSAVE1370x8C              TLB重填異常表項低位0                 TLBRELO01380x8D              TLB重填異常表項低位1                 TLBRELO11390x8E              TLB重填異常表項高位                  TLBEHI1400x8F              TLB重填異常前模式信息                TLBRPRMD1410x90              機器錯誤控制                         MERRCTL1420x91              機器錯誤信息1                        MERRINFO11430x92              機器錯誤信息2                        MERRINFO21440x93              機器錯誤異常入口地址                 MERRENTRY1450x94              機器錯誤異常返回地址                 MERRERA1460x95              機器錯誤異常數據保存                 MERRSAVE1470x98              高速緩存標籤                         CTAG1480x180+n (0≤n≤3)   直接映射配置窗口n                    DMWn1490x200+2n (0≤n≤31) 性能監測配置n                        PMCFGn1500x201+2n (0≤n≤31) 性能監測計數器n                      PMCNTn1510x300             內存讀寫監視點整體控制               MWPC1520x301             內存讀寫監視點整體狀態               MWPS1530x310+8n (0≤n≤7)  內存讀寫監視點n配置1                 MWPnCFG11540x311+8n (0≤n≤7)  內存讀寫監視點n配置2                 MWPnCFG21550x312+8n (0≤n≤7)  內存讀寫監視點n配置3                 MWPnCFG31560x313+8n (0≤n≤7)  內存讀寫監視點n配置4                 MWPnCFG41570x380             取指監視點整體控制                   FWPC1580x381             取指監視點整體狀態                   FWPS1590x390+8n (0≤n≤7)  取指監視點n配置1                     FWPnCFG11600x391+8n (0≤n≤7)  取指監視點n配置2                     FWPnCFG21610x392+8n (0≤n≤7)  取指監視點n配置3                     FWPnCFG31620x393+8n (0≤n≤7)  取指監視點n配置4                     FWPnCFG41630x500             調試寄存器                           DBG1640x501             調試異常返回地址                     DERA1650x502             調試數據保存                         DSAVE166================= ==================================== ==========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 + Rd1823R          Opcode + Rk + Rj + Rd1834R          Opcode + Ra + Rk + Rj + Rd1842RI8        Opcode + I8 + Rj + Rd1852RI12       Opcode + I12 + Rj + Rd1862RI14       Opcode + I14 + Rj + Rd1872RI16       Opcode + I16 + Rj + Rd1881RI21       Opcode + I21L + Rj + I21H189I26         Opcode + I26L + I26H190=========== ==========================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.D206    SLT SLTU SLTI SLTUI207    AND OR NOR XOR ANDN ORN ANDI ORI XORI208    MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU209    MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU210    PCADDI PCADDU12I PCADDU18I211    LU12I.W LU32I.D LU52I.D ADDU16I.D212 2132. 移位運算指令::214 215    SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W216    SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D217 2183. 位域操作指令::219 220    EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D221    BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D222    REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D223    MASKEQZ MASKNEZ224 2254. 分支轉移指令::226 227    BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL228 2295. 訪存讀寫指令::230 231    LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D232    LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D233    LDPTR.W LDPTR.D STPTR.W STPTR.D234    PRELD PRELDX235 2366. 原子操作指令::237 238    LL.W SC.W LL.D SC.D239    AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D240    AMMAX.W AMMAX.D AMMIN.W AMMIN.D241 2427. 柵障指令::243 244    IBAR DBAR245 2468. 特殊指令::247 248    SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D249    ASRTLE.D ASRTGT.D250 2519. 特權指令::252 253    CSRRD CSRWR CSRXCHG254    IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D255    CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE256 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~3277``KPRANGE0`` ``0x80000000 - 0x9FFFFFFF`` 直接映射, 非緩存, PLV0278``KPRANGE1`` ``0xA0000000 - 0xBFFFFFFF`` 直接映射, 可緩存, PLV0279``KVRANGE``  ``0xC0000000 - 0xFFFFFFFF`` 分頁映射, 可緩存, PLV0280============ =========================== ===========================281 282用戶態(PLV3)只能訪問UVRANGE,對於直接映射的KPRANGE0和KPRANGE1,將虛擬地址的第28330~31位清零就等於物理地址。例如:物理地址0x00001000對應的非緩存直接映射虛擬地址284是0x80001000,而其可緩存直接映射虛擬地址是0xA0001000。285 286缺省狀態下,LA64的整個虛擬地址空間配置如下:287 288============ ====================== ==================================289區段名       地址範圍               屬性290============ ====================== ==================================291``XUVRANGE`` ``0x0000000000000000 - 分頁映射, 可緩存, PLV0~3292             0x3FFFFFFFFFFFFFFF``293``XSPRANGE`` ``0x4000000000000000 - 直接映射, 可緩存 / 非緩存, PLV0294             0x7FFFFFFFFFFFFFFF``295``XKPRANGE`` ``0x8000000000000000 - 直接映射, 可緩存 / 非緩存, PLV0296             0xBFFFFFFFFFFFFFFF``297``XKVRANGE`` ``0xC000000000000000 - 分頁映射, 可緩存, PLV0298             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.git354 355