1 .. SPDX-License-Identifier: GPL-2.0
3 .. include:: ../disclaimer-zh_CN.rst
5 :Original: Documentation/loongarch/introduction.rst
6 :Translator: Huacai Chen <chenhuacai@loongson.cn>
12 LoongArch是一种新的RISC ISA,在一定程度上类似于MIPS和RISC-V。LoongArch指令集
13 包括一个精简32位版(LA32R)、一个标准32位版(LA32S)、一个64位版(LA64)。
14 LoongArch定义了四个特权级(PLV0~PLV3),其中PLV0是最高特权级,用于内核;而PLV3
15 是最低特权级,用于应用程序。本文档介绍了LoongArch的寄存器、基础指令集、虚拟内
21 LoongArch的寄存器包括通用寄存器(GPRs)、浮点寄存器(FPRs)、向量寄存器(VRs)
22 和用于特权模式(PLV0)的控制状态寄存器(CSRs)。
27 LoongArch包括32个通用寄存器( ``$r0`` ~ ``$r31`` ),LA32中每个寄存器为32位宽,
28 LA64中每个寄存器为64位宽。 ``$r0`` 的内容总是固定为0,而其他寄存器在体系结构层面
29 没有特殊功能。( ``$r1`` 算是一个例外,在BL指令中固定用作链接返回寄存器。)
31 内核使用了一套LoongArch寄存器约定,定义在LoongArch ELF psABI规范中,详细描述参见
32 :ref:`参考文献 <loongarch-references-zh_CN>`:
34 ================= =============== =================== ==========
36 ================= =============== =================== ==========
37 ``$r0`` ``$zero`` 常量0 不使用
38 ``$r1`` ``$ra`` 返回地址 否
39 ``$r2`` ``$tp`` TLS/线程信息指针 不使用
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 ================= =============== =================== ==========
49 注意:``$r21``寄存器在ELF psABI中保留未使用,但是在Linux内核用于保存每CPU
50 变量基地址。该寄存器没有ABI命名,不过在内核中称为``$u0``。在一些遗留代码
51 中有时可能见到``$v0``和``$v1``,它们是``$a0``和``$a1``的别名,属于已经废弃
57 当系统中存在FPU时,LoongArch有32个浮点寄存器( ``$f0`` ~ ``$f31`` )。在LA64
60 浮点寄存器的使用约定与LoongArch ELF psABI规范的描述相同:
62 ================= ================== =================== ==========
64 ================= ================== =================== ==========
65 ``$f0``-``$f7`` ``$fa0``-``$fa7`` 参数寄存器 否
66 ``$f0``-``$f1`` ``$fv0``-``$fv1`` 返回值 否
67 ``$f8``-``$f23`` ``$ft0``-``$ft15`` 临时寄存器 否
68 ``$f24``-``$f31`` ``$fs0``-``$fs7`` 静态寄存器 是
69 ================= ================== =================== ==========
71 注意:在一些遗留代码中有时可能见到 ``$v0`` 和 ``$v1`` ,它们是 ``$a0``
72 和 ``$a1`` 的别名,属于已经废弃的用法。
80 - 128位向量扩展LSX(全称Loongson SIMD eXtention),
81 - 256位向量扩展LASX(全称Loongson Advanced SIMD eXtention)。
83 LSX使用 ``$v0`` ~ ``$v31`` 向量寄存器,而LASX则使用 ``$x0`` ~ ``$x31`` 。
85 浮点寄存器和向量寄存器是复用的,比如:在一个实现了LSX和LASX的核上, ``$x0`` 的
86 低128位与 ``$v0`` 共用, ``$v0`` 的低64位与 ``$f0`` 共用,其他寄存器依此类推。
91 控制状态寄存器只能在特权模式(PLV0)下访问:
93 ================= ==================================== ==========
95 ================= ==================================== ==========
103 0x7 出错(Faulting)虚拟地址 BADV
104 0x8 出错(Faulting)指令字 BADI
108 0x12 TLB表项低位0 TLBELO0
109 0x13 TLB表项低位1 TLBELO1
111 0x19 低半地址空间页全局目录基址 PGDL
112 0x1A 高半地址空间页全局目录基址 PGDH
119 0x21 特权资源配置信息1 PRCFG1
120 0x22 特权资源配置信息2 PRCFG2
121 0x23 特权资源配置信息3 PRCFG3
122 0x30+n (0≤n≤15) 数据保存寄存器 SAVEn
128 0x60 LLBit相关控制 LLBCTL
131 0x88 TLB重填异常入口地址 TLBRENTRY
132 0x89 TLB重填异常出错(Faulting)虚地址 TLBRBADV
133 0x8A TLB重填异常返回地址 TLBRERA
134 0x8B TLB重填异常数据保存 TLBRSAVE
135 0x8C TLB重填异常表项低位0 TLBRELO0
136 0x8D TLB重填异常表项低位1 TLBRELO1
137 0x8E TLB重填异常表项高位 TLBEHI
138 0x8F TLB重填异常前模式信息 TLBRPRMD
140 0x91 机器错误信息1 MERRINFO1
141 0x92 机器错误信息2 MERRINFO2
142 0x93 机器错误异常入口地址 MERRENTRY
143 0x94 机器错误异常返回地址 MERRERA
144 0x95 机器错误异常数据保存 MERRSAVE
146 0x180+n (0≤n≤3) 直接映射配置窗口n DMWn
147 0x200+2n (0≤n≤31) 性能监测配置n PMCFGn
148 0x201+2n (0≤n≤31) 性能监测计数器n PMCNTn
149 0x300 内存读写监视点整体控制 MWPC
150 0x301 内存读写监视点整体状态 MWPS
151 0x310+8n (0≤n≤7) 内存读写监视点n配置1 MWPnCFG1
152 0x311+8n (0≤n≤7) 内存读写监视点n配置2 MWPnCFG2
153 0x312+8n (0≤n≤7) 内存读写监视点n配置3 MWPnCFG3
154 0x313+8n (0≤n≤7) 内存读写监视点n配置4 MWPnCFG4
157 0x390+8n (0≤n≤7) 取指监视点n配置1 FWPnCFG1
158 0x391+8n (0≤n≤7) 取指监视点n配置2 FWPnCFG2
159 0x392+8n (0≤n≤7) 取指监视点n配置3 FWPnCFG3
160 0x393+8n (0≤n≤7) 取指监视点n配置4 FWPnCFG4
164 ================= ==================================== ==========
166 ERA,TLBRERA,MERRERA和DERA有时也分别称为EPC,TLBREPC,MERREPC和DEPC。
174 LoongArch的指令字长为32位,一共有9种基本指令格式(以及一些变体):
176 =========== ==========================
178 =========== ==========================
180 3R Opcode + Rk + Rj + Rd
181 4R Opcode + Ra + Rk + Rj + Rd
182 2RI8 Opcode + I8 + Rj + Rd
183 2RI12 Opcode + I12 + Rj + Rd
184 2RI14 Opcode + I14 + Rj + Rd
185 2RI16 Opcode + I16 + Rj + Rd
186 1RI21 Opcode + I21L + Rj + I21H
187 I26 Opcode + I26L + I26H
188 =========== ==========================
190 Opcode是指令操作码,Rj和Rk是源操作数(寄存器),Rd是目标操作数(寄存器),Ra是
191 4R-type格式特有的附加操作数(寄存器)。I8/I12/I16/I21/I26分别是8位/12位/16位/
192 21位/26位的立即数。其中较长的21位和26位立即数在指令字中被分割为高位部分与低位
193 部分,所以你们在这里的格式描述中能够看到I21L/I21H和I26L/I26H这样带后缀的表述。
198 为了简便起见,我们在此只罗列一下指令名称(助记符),需要详细信息请阅读
199 :ref:`参考文献 <loongarch-references-zh_CN>` 中的文档。
203 ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D
205 AND OR NOR XOR ANDN ORN ANDI ORI XORI
206 MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU
207 MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU
208 PCADDI PCADDU12I PCADDU18I
209 LU12I.W LU32I.D LU52I.D ADDU16I.D
213 SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W
214 SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D
218 EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D
219 BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D
220 REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D
225 BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
229 LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D
230 LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D
231 LDPTR.W LDPTR.D STPTR.W STPTR.D
237 AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D
238 AMMAX.W AMMAX.D AMMIN.W AMMIN.D
246 SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D
252 IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D
253 CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE
258 LoongArch可以使用直接映射虚拟内存和分页映射虚拟内存。
260 直接映射虚拟内存通过CSR.DMWn(n=0~3)来进行配置,虚拟地址(VA)和物理地址(PA)
265 分页映射的虚拟地址(VA)和物理地址(PA)有任意的映射关系,这种关系记录在TLB和页
266 表中。LoongArch的TLB包括一个全相联的MTLB(Multiple Page Size TLB,多样页大小TLB)
267 和一个组相联的STLB(Single Page Size TLB,单一页大小TLB)。
269 缺省状态下,LA32的整个虚拟地址空间配置如下:
271 ============ =========================== ===========================
273 ============ =========================== ===========================
274 ``UVRANGE`` ``0x00000000 - 0x7FFFFFFF`` 分页映射, 可缓存, PLV0~3
275 ``KPRANGE0`` ``0x80000000 - 0x9FFFFFFF`` 直接映射, 非缓存, PLV0
276 ``KPRANGE1`` ``0xA0000000 - 0xBFFFFFFF`` 直接映射, 可缓存, PLV0
277 ``KVRANGE`` ``0xC0000000 - 0xFFFFFFFF`` 分页映射, 可缓存, PLV0
278 ============ =========================== ===========================
280 用户态(PLV3)只能访问UVRANGE,对于直接映射的KPRANGE0和KPRANGE1,将虚拟地址的第
281 30~31位清零就等于物理地址。例如:物理地址0x00001000对应的非缓存直接映射虚拟地址
282 是0x80001000,而其可缓存直接映射虚拟地址是0xA0001000。
284 缺省状态下,LA64的整个虚拟地址空间配置如下:
286 ============ ====================== ==================================
288 ============ ====================== ==================================
289 ``XUVRANGE`` ``0x0000000000000000 - 分页映射, 可缓存, PLV0~3
291 ``XSPRANGE`` ``0x4000000000000000 - 直接映射, 可缓存 / 非缓存, PLV0
293 ``XKPRANGE`` ``0x8000000000000000 - 直接映射, 可缓存 / 非缓存, PLV0
295 ``XKVRANGE`` ``0xC000000000000000 - 分页映射, 可缓存, PLV0
297 ============ ====================== ==================================
299 用户态(PLV3)只能访问XUVRANGE,对于直接映射的XSPRANGE和XKPRANGE,将虚拟地址的第
300 60~63位清零就等于物理地址,而其缓存属性是通过虚拟地址的第60~61位配置的(0表示强序
301 非缓存,1表示一致可缓存,2表示弱序非缓存)。
303 目前,我们仅用XKPRANGE来进行直接映射,XSPRANGE保留给以后用。
305 此处给出一个直接映射的例子:物理地址0x00000000_00001000的强序非缓存直接映射虚拟地址
306 (在XKPRANGE中)是0x80000000_00001000,其一致可缓存直接映射虚拟地址(在XKPRANGE中)
307 是0x90000000_00001000,而其弱序非缓存直接映射虚拟地址(在XKPRANGE中)是0xA0000000_
310 Loongson与LoongArch的关系
311 =========================
313 LoongArch是一种RISC指令集架构(ISA),不同于现存的任何一种ISA,而Loongson(即龙
314 芯)是一个处理器家族。龙芯包括三个系列:Loongson-1(龙芯1号)是32位处理器系列,
315 Loongson-2(龙芯2号)是低端64位处理器系列,而Loongson-3(龙芯3号)是高端64位处理
316 器系列。旧的龙芯处理器基于MIPS架构,而新的龙芯处理器基于LoongArch架构。以龙芯3号
317 为例:龙芯3A1000/3B1500/3A2000/3A3000/3A4000都是兼容MIPS的,而龙芯3A5000(以及将
320 .. _loongarch-references-zh_CN:
325 Loongson官方网站(龙芯中科技术股份有限公司):
327 http://www.loongson.cn/
329 Loongson与LoongArch的开发者网站(软件与文档资源):
331 http://www.loongnix.cn/
333 https://github.com/loongson/
335 https://loongson.github.io/LoongArch-Documentation/
339 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.00-CN.pdf (中文版)
341 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.00-EN.pdf (英文版)
343 LoongArch的ELF psABI文档:
345 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v1.00-CN.pdf (中文版)
347 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v1.00-EN.pdf (英文版)
349 Loongson与LoongArch的Linux内核源码仓库:
351 https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git