brintos

brintos / linux-shallow public Read only

0
0
Text · 16.3 KiB · bf463c5 Raw
354 lines · plain
1.. SPDX-License-Identifier: GPL-2.02 3.. include:: ../../disclaimer-zh_CN.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_CN>`: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_CN>` 中的文档。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_CN: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.10-CN.pdf (中文版)342 343  https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.10-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