Back to home page

OSCL-LXR

 
 

    


0001 .. SPDX-License-Identifier: GPL-2.0
0002 
0003 .. include:: ../disclaimer-zh_CN.rst
0004 
0005 :Original: Documentation/loongarch/introduction.rst
0006 :Translator: Huacai Chen <chenhuacai@loongson.cn>
0007 
0008 =============
0009 LoongArch介绍
0010 =============
0011 
0012 LoongArch是一种新的RISC ISA,在一定程度上类似于MIPS和RISC-V。LoongArch指令集
0013 包括一个精简32位版(LA32R)、一个标准32位版(LA32S)、一个64位版(LA64)。
0014 LoongArch定义了四个特权级(PLV0~PLV3),其中PLV0是最高特权级,用于内核;而PLV3
0015 是最低特权级,用于应用程序。本文档介绍了LoongArch的寄存器、基础指令集、虚拟内
0016 存以及其他一些主题。
0017 
0018 寄存器
0019 ======
0020 
0021 LoongArch的寄存器包括通用寄存器(GPRs)、浮点寄存器(FPRs)、向量寄存器(VRs)
0022 和用于特权模式(PLV0)的控制状态寄存器(CSRs)。
0023 
0024 通用寄存器
0025 ----------
0026 
0027 LoongArch包括32个通用寄存器( ``$r0`` ~ ``$r31`` ),LA32中每个寄存器为32位宽,
0028 LA64中每个寄存器为64位宽。 ``$r0`` 的内容总是固定为0,而其他寄存器在体系结构层面
0029 没有特殊功能。( ``$r1`` 算是一个例外,在BL指令中固定用作链接返回寄存器。)
0030 
0031 内核使用了一套LoongArch寄存器约定,定义在LoongArch ELF psABI规范中,详细描述参见
0032 :ref:`参考文献 <loongarch-references-zh_CN>`:
0033 
0034 ================= =============== =================== ==========
0035 寄存器名          别名            用途                跨调用保持
0036 ================= =============== =================== ==========
0037 ``$r0``           ``$zero``       常量0               不使用
0038 ``$r1``           ``$ra``         返回地址            否
0039 ``$r2``           ``$tp``         TLS/线程信息指针    不使用
0040 ``$r3``           ``$sp``         栈指针              是
0041 ``$r4``-``$r11``  ``$a0``-``$a7`` 参数寄存器          否
0042 ``$r4``-``$r5``   ``$v0``-``$v1`` 返回值              否
0043 ``$r12``-``$r20`` ``$t0``-``$t8`` 临时寄存器          否
0044 ``$r21``          ``$u0``         每CPU变量基地址     不使用
0045 ``$r22``          ``$fp``         帧指针              是
0046 ``$r23``-``$r31`` ``$s0``-``$s8`` 静态寄存器          是
0047 ================= =============== =================== ==========
0048 
0049 .. note::
0050     注意: ``$r21`` 寄存器在ELF psABI中保留未使用,但是在Linux内核用于保
0051     存每CPU变量基地址。该寄存器没有ABI命名,不过在内核中称为 ``$u0`` 。在
0052     一些遗留代码中有时可能见到 ``$v0`` 和 ``$v1`` ,它们是 ``$a0`` 和
0053     ``$a1`` 的别名,属于已经废弃的用法。
0054 
0055 浮点寄存器
0056 ----------
0057 
0058 当系统中存在FPU时,LoongArch有32个浮点寄存器( ``$f0`` ~ ``$f31`` )。在LA64
0059 的CPU核上,每个寄存器均为64位宽。
0060 
0061 浮点寄存器的使用约定与LoongArch ELF psABI规范的描述相同:
0062 
0063 ================= ================== =================== ==========
0064 寄存器名          别名               用途                跨调用保持
0065 ================= ================== =================== ==========
0066 ``$f0``-``$f7``   ``$fa0``-``$fa7``  参数寄存器          否
0067 ``$f0``-``$f1``   ``$fv0``-``$fv1``  返回值              否
0068 ``$f8``-``$f23``  ``$ft0``-``$ft15`` 临时寄存器          否
0069 ``$f24``-``$f31`` ``$fs0``-``$fs7``  静态寄存器          是
0070 ================= ================== =================== ==========
0071 
0072 .. note::
0073     注意:在一些遗留代码中有时可能见到 ``$v0`` 和 ``$v1`` ,它们是
0074     ``$a0`` 和 ``$a1`` 的别名,属于已经废弃的用法。
0075 
0076 
0077 向量寄存器
0078 ----------
0079 
0080 LoongArch现有两种向量扩展:
0081 
0082 - 128位向量扩展LSX(全称Loongson SIMD eXtention),
0083 - 256位向量扩展LASX(全称Loongson Advanced SIMD eXtention)。
0084 
0085 LSX使用 ``$v0`` ~ ``$v31`` 向量寄存器,而LASX则使用 ``$x0`` ~ ``$x31`` 。
0086 
0087 浮点寄存器和向量寄存器是复用的,比如:在一个实现了LSX和LASX的核上, ``$x0`` 的
0088 低128位与 ``$v0`` 共用, ``$v0`` 的低64位与 ``$f0`` 共用,其他寄存器依此类推。
0089 
0090 控制状态寄存器
0091 --------------
0092 
0093 控制状态寄存器只能在特权模式(PLV0)下访问:
0094 
0095 ================= ==================================== ==========
0096 地址              全称描述                             简称
0097 ================= ==================================== ==========
0098 0x0               当前模式信息                         CRMD
0099 0x1               异常前模式信息                       PRMD
0100 0x2               扩展部件使能                         EUEN
0101 0x3               杂项控制                             MISC
0102 0x4               异常配置                             ECFG
0103 0x5               异常状态                             ESTAT
0104 0x6               异常返回地址                         ERA
0105 0x7               出错(Faulting)虚拟地址               BADV
0106 0x8               出错(Faulting)指令字                 BADI
0107 0xC               异常入口地址                         EENTRY
0108 0x10              TLB索引                              TLBIDX
0109 0x11              TLB表项高位                          TLBEHI
0110 0x12              TLB表项低位0                         TLBELO0
0111 0x13              TLB表项低位1                         TLBELO1
0112 0x18              地址空间标识符                       ASID
0113 0x19              低半地址空间页全局目录基址           PGDL
0114 0x1A              高半地址空间页全局目录基址           PGDH
0115 0x1B              页全局目录基址                       PGD
0116 0x1C              页表遍历控制低半部分                 PWCL
0117 0x1D              页表遍历控制高半部分                 PWCH
0118 0x1E              STLB页大小                           STLBPS
0119 0x1F              缩减虚地址配置                       RVACFG
0120 0x20              CPU编号                              CPUID
0121 0x21              特权资源配置信息1                    PRCFG1
0122 0x22              特权资源配置信息2                    PRCFG2
0123 0x23              特权资源配置信息3                    PRCFG3
0124 0x30+n (0≤n≤15)   数据保存寄存器                       SAVEn
0125 0x40              定时器编号                           TID
0126 0x41              定时器配置                           TCFG
0127 0x42              定时器值                             TVAL
0128 0x43              计时器补偿                           CNTC
0129 0x44              定时器中断清除                       TICLR
0130 0x60              LLBit相关控制                        LLBCTL
0131 0x80              实现相关控制1                        IMPCTL1
0132 0x81              实现相关控制2                        IMPCTL2
0133 0x88              TLB重填异常入口地址                  TLBRENTRY
0134 0x89              TLB重填异常出错(Faulting)虚地址      TLBRBADV
0135 0x8A              TLB重填异常返回地址                  TLBRERA
0136 0x8B              TLB重填异常数据保存                  TLBRSAVE
0137 0x8C              TLB重填异常表项低位0                 TLBRELO0
0138 0x8D              TLB重填异常表项低位1                 TLBRELO1
0139 0x8E              TLB重填异常表项高位                  TLBEHI
0140 0x8F              TLB重填异常前模式信息                TLBRPRMD
0141 0x90              机器错误控制                         MERRCTL
0142 0x91              机器错误信息1                        MERRINFO1
0143 0x92              机器错误信息2                        MERRINFO2
0144 0x93              机器错误异常入口地址                 MERRENTRY
0145 0x94              机器错误异常返回地址                 MERRERA
0146 0x95              机器错误异常数据保存                 MERRSAVE
0147 0x98              高速缓存标签                         CTAG
0148 0x180+n (0≤n≤3)   直接映射配置窗口n                    DMWn
0149 0x200+2n (0≤n≤31) 性能监测配置n                        PMCFGn
0150 0x201+2n (0≤n≤31) 性能监测计数器n                      PMCNTn
0151 0x300             内存读写监视点整体控制               MWPC
0152 0x301             内存读写监视点整体状态               MWPS
0153 0x310+8n (0≤n≤7)  内存读写监视点n配置1                 MWPnCFG1
0154 0x311+8n (0≤n≤7)  内存读写监视点n配置2                 MWPnCFG2
0155 0x312+8n (0≤n≤7)  内存读写监视点n配置3                 MWPnCFG3
0156 0x313+8n (0≤n≤7)  内存读写监视点n配置4                 MWPnCFG4
0157 0x380             取指监视点整体控制                   FWPC
0158 0x381             取指监视点整体状态                   FWPS
0159 0x390+8n (0≤n≤7)  取指监视点n配置1                     FWPnCFG1
0160 0x391+8n (0≤n≤7)  取指监视点n配置2                     FWPnCFG2
0161 0x392+8n (0≤n≤7)  取指监视点n配置3                     FWPnCFG3
0162 0x393+8n (0≤n≤7)  取指监视点n配置4                     FWPnCFG4
0163 0x500             调试寄存器                           DBG
0164 0x501             调试异常返回地址                     DERA
0165 0x502             调试数据保存                         DSAVE
0166 ================= ==================================== ==========
0167 
0168 ERA,TLBRERA,MERRERA和DERA有时也分别称为EPC,TLBREPC,MERREPC和DEPC。
0169 
0170 基础指令集
0171 ==========
0172 
0173 指令格式
0174 --------
0175 
0176 LoongArch的指令字长为32位,一共有9种基本指令格式(以及一些变体):
0177 
0178 =========== ==========================
0179 格式名称    指令构成
0180 =========== ==========================
0181 2R          Opcode + Rj + Rd
0182 3R          Opcode + Rk + Rj + Rd
0183 4R          Opcode + Ra + Rk + Rj + Rd
0184 2RI8        Opcode + I8 + Rj + Rd
0185 2RI12       Opcode + I12 + Rj + Rd
0186 2RI14       Opcode + I14 + Rj + Rd
0187 2RI16       Opcode + I16 + Rj + Rd
0188 1RI21       Opcode + I21L + Rj + I21H
0189 I26         Opcode + I26L + I26H
0190 =========== ==========================
0191 
0192 Opcode是指令操作码,Rj和Rk是源操作数(寄存器),Rd是目标操作数(寄存器),Ra是
0193 4R-type格式特有的附加操作数(寄存器)。I8/I12/I14/I16/I21/I26分别是8位/12位/14位/
0194 16位/21位/26位的立即数。其中较长的21位和26位立即数在指令字中被分割为高位部分与低位
0195 部分,所以你们在这里的格式描述中能够看到I21L/I21H和I26L/I26H这样带后缀的表述。
0196 
0197 指令列表
0198 --------
0199 
0200 为了简便起见,我们在此只罗列一下指令名称(助记符),需要详细信息请阅读
0201 :ref:`参考文献 <loongarch-references-zh_CN>` 中的文档。
0202 
0203 1. 算术运算指令::
0204 
0205     ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D
0206     SLT SLTU SLTI SLTUI
0207     AND OR NOR XOR ANDN ORN ANDI ORI XORI
0208     MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU
0209     MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU
0210     PCADDI PCADDU12I PCADDU18I
0211     LU12I.W LU32I.D LU52I.D ADDU16I.D
0212 
0213 2. 移位运算指令::
0214 
0215     SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W
0216     SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D
0217 
0218 3. 位域操作指令::
0219 
0220     EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D
0221     BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D
0222     REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D
0223     MASKEQZ MASKNEZ
0224 
0225 4. 分支转移指令::
0226 
0227     BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
0228 
0229 5. 访存读写指令::
0230 
0231     LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D
0232     LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D
0233     LDPTR.W LDPTR.D STPTR.W STPTR.D
0234     PRELD PRELDX
0235 
0236 6. 原子操作指令::
0237 
0238     LL.W SC.W LL.D SC.D
0239     AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D
0240     AMMAX.W AMMAX.D AMMIN.W AMMIN.D
0241 
0242 7. 栅障指令::
0243 
0244     IBAR DBAR
0245 
0246 8. 特殊指令::
0247 
0248     SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D
0249     ASRTLE.D ASRTGT.D
0250 
0251 9. 特权指令::
0252 
0253     CSRRD CSRWR CSRXCHG
0254     IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D
0255     CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE
0256 
0257 虚拟内存
0258 ========
0259 
0260 LoongArch可以使用直接映射虚拟内存和分页映射虚拟内存。
0261 
0262 直接映射虚拟内存通过CSR.DMWn(n=0~3)来进行配置,虚拟地址(VA)和物理地址(PA)
0263 之间有简单的映射关系::
0264 
0265  VA = PA + 固定偏移
0266 
0267 分页映射的虚拟地址(VA)和物理地址(PA)有任意的映射关系,这种关系记录在TLB和页
0268 表中。LoongArch的TLB包括一个全相联的MTLB(Multiple Page Size TLB,多样页大小TLB)
0269 和一个组相联的STLB(Single Page Size TLB,单一页大小TLB)。
0270 
0271 缺省状态下,LA32的整个虚拟地址空间配置如下:
0272 
0273 ============ =========================== ===========================
0274 区段名       地址范围                    属性
0275 ============ =========================== ===========================
0276 ``UVRANGE``  ``0x00000000 - 0x7FFFFFFF`` 分页映射, 可缓存, PLV0~3
0277 ``KPRANGE0`` ``0x80000000 - 0x9FFFFFFF`` 直接映射, 非缓存, PLV0
0278 ``KPRANGE1`` ``0xA0000000 - 0xBFFFFFFF`` 直接映射, 可缓存, PLV0
0279 ``KVRANGE``  ``0xC0000000 - 0xFFFFFFFF`` 分页映射, 可缓存, PLV0
0280 ============ =========================== ===========================
0281 
0282 用户态(PLV3)只能访问UVRANGE,对于直接映射的KPRANGE0和KPRANGE1,将虚拟地址的第
0283 30~31位清零就等于物理地址。例如:物理地址0x00001000对应的非缓存直接映射虚拟地址
0284 是0x80001000,而其可缓存直接映射虚拟地址是0xA0001000。
0285 
0286 缺省状态下,LA64的整个虚拟地址空间配置如下:
0287 
0288 ============ ====================== ==================================
0289 区段名       地址范围               属性
0290 ============ ====================== ==================================
0291 ``XUVRANGE`` ``0x0000000000000000 - 分页映射, 可缓存, PLV0~3
0292              0x3FFFFFFFFFFFFFFF``
0293 ``XSPRANGE`` ``0x4000000000000000 - 直接映射, 可缓存 / 非缓存, PLV0
0294              0x7FFFFFFFFFFFFFFF``
0295 ``XKPRANGE`` ``0x8000000000000000 - 直接映射, 可缓存 / 非缓存, PLV0
0296              0xBFFFFFFFFFFFFFFF``
0297 ``XKVRANGE`` ``0xC000000000000000 - 分页映射, 可缓存, PLV0
0298              0xFFFFFFFFFFFFFFFF``
0299 ============ ====================== ==================================
0300 
0301 用户态(PLV3)只能访问XUVRANGE,对于直接映射的XSPRANGE和XKPRANGE,将虚拟地址的第
0302 60~63位清零就等于物理地址,而其缓存属性是通过虚拟地址的第60~61位配置的(0表示强序
0303 非缓存,1表示一致可缓存,2表示弱序非缓存)。
0304 
0305 目前,我们仅用XKPRANGE来进行直接映射,XSPRANGE保留给以后用。
0306 
0307 此处给出一个直接映射的例子:物理地址0x00000000_00001000的强序非缓存直接映射虚拟地址
0308 (在XKPRANGE中)是0x80000000_00001000,其一致可缓存直接映射虚拟地址(在XKPRANGE中)
0309 是0x90000000_00001000,而其弱序非缓存直接映射虚拟地址(在XKPRANGE中)是0xA0000000_
0310 00001000。
0311 
0312 Loongson与LoongArch的关系
0313 =========================
0314 
0315 LoongArch是一种RISC指令集架构(ISA),不同于现存的任何一种ISA,而Loongson(即龙
0316 芯)是一个处理器家族。龙芯包括三个系列:Loongson-1(龙芯1号)是32位处理器系列,
0317 Loongson-2(龙芯2号)是低端64位处理器系列,而Loongson-3(龙芯3号)是高端64位处理
0318 器系列。旧的龙芯处理器基于MIPS架构,而新的龙芯处理器基于LoongArch架构。以龙芯3号
0319 为例:龙芯3A1000/3B1500/3A2000/3A3000/3A4000都是兼容MIPS的,而龙芯3A5000(以及将
0320 来的型号)都是基于LoongArch的。
0321 
0322 .. _loongarch-references-zh_CN:
0323 
0324 参考文献
0325 ========
0326 
0327 Loongson官方网站(龙芯中科技术股份有限公司):
0328 
0329   http://www.loongson.cn/
0330 
0331 Loongson与LoongArch的开发者网站(软件与文档资源):
0332 
0333   http://www.loongnix.cn/
0334 
0335   https://github.com/loongson/
0336 
0337   https://loongson.github.io/LoongArch-Documentation/
0338 
0339 LoongArch指令集架构的文档:
0340 
0341   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.00-CN.pdf (中文版)
0342 
0343   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.00-EN.pdf (英文版)
0344 
0345 LoongArch的ELF psABI文档:
0346 
0347   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v1.00-CN.pdf (中文版)
0348 
0349   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v1.00-EN.pdf (英文版)
0350 
0351 Loongson与LoongArch的Linux内核源码仓库:
0352 
0353   https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git