1 .. SPDX-License-Identifier: GPL-2.0 2 3 .. include:: ../../disclaimer-zh_CN.rst 4 5 :Original: Documentation/arch/loongarch/introd 6 :Translator: Huacai Chen <chenhuacai@loongson.c 7 8 ============= 9 LoongArch介绍 10 ============= 11 12 LoongArch是一种新的RISC ISA,在一定 13 包括一个精简32位版(LA32R)、一个 14 LoongArch定义了四个特权级(PLV0~PLV3 15 是最低特权级,用于应用程序。本 16 存以及其他一些主题。 17 18 寄存器 19 ====== 20 21 LoongArch的寄存器包括通用寄存器(G 22 和用于特权模式(PLV0)的控制状态 23 24 通用寄存器 25 ---------- 26 27 LoongArch包括32个通用寄存器( ``$r0`` 28 LA64中每个寄存器为64位宽。 ``$r0`` 29 没有特殊功能。( ``$r1`` 算是一个 30 31 内核使用了一套LoongArch寄存器约定 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 51 存每CPU变量基地址。该寄存器没 52 一些遗留代码中有时可能见到 `` 53 ``$a1`` 的别名,属于已经废弃的 54 55 浮点寄存器 56 ---------- 57 58 当系统中存在FPU时,LoongArch有32个 59 的CPU核上,每个寄存器均为64位宽 60 61 浮点寄存器的使用约定与LoongArch ELF 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 注意:在一些遗留代码中有时可 74 ``$fa0`` 和 ``$fa1`` 的别名,属于 75 76 77 向量寄存器 78 ---------- 79 80 LoongArch现有两种向量扩展: 81 82 - 128位向量扩展LSX(全称Loongson SIMD 83 - 256位向量扩展LASX(全称Loongson Adva 84 85 LSX使用 ``$v0`` ~ ``$v31`` 向量寄存器 86 87 浮点寄存器和向量寄存器是复用的 88 低128位与 ``$v0`` 共用, ``$v0`` 的低6 89 90 控制状态寄存器 91 -------------- 92 93 控制状态寄存器只能在特权模式(P 94 95 ================= ============================ 96 地址 全称描述 97 ================= ============================ 98 0x0 当前模式信息 99 0x1 异常前模式信息 100 0x2 扩展部件使能 101 0x3 杂项控制 102 0x4 异常配置 103 0x5 异常状态 104 0x6 异常返回地址 105 0x7 出错(Faulting)虚拟地址 106 0x8 出错(Faulting)指令字 107 0xC 异常入口地址 108 0x10 TLB索引 109 0x11 TLB表项高位 110 0x12 TLB表项低位0 111 0x13 TLB表项低位1 112 0x18 地址空间标识符 113 0x19 低半地址空间页全局 114 0x1A 高半地址空间页全局 115 0x1B 页全局目录基址 116 0x1C 页表遍历控制低半部 117 0x1D 页表遍历控制高半部 118 0x1E STLB页大小 119 0x1F 缩减虚地址配置 120 0x20 CPU编号 121 0x21 特权资源配置信息1 122 0x22 特权资源配置信息2 123 0x23 特权资源配置信息3 124 0x30+n (0≤n≤15) 数据保存寄存器 125 0x40 定时器编号 126 0x41 定时器配置 127 0x42 定时器值 128 0x43 计时器补偿 129 0x44 定时器中断清除 130 0x60 LLBit相关控制 131 0x80 实现相关控制1 132 0x81 实现相关控制2 133 0x88 TLB重填异常入口地址 134 0x89 TLB重填异常出错(Faulti 135 0x8A TLB重填异常返回地址 136 0x8B TLB重填异常数据保存 137 0x8C TLB重填异常表项低位0 138 0x8D TLB重填异常表项低位1 139 0x8E TLB重填异常表项高位 140 0x8F TLB重填异常前模式信 141 0x90 机器错误控制 142 0x91 机器错误信息1 143 0x92 机器错误信息2 144 0x93 机器错误异常入口地 145 0x94 机器错误异常返回地 146 0x95 机器错误异常数据保 147 0x98 高速缓存标签 148 0x180+n (0≤n≤3) 直接映射配置窗口 149 0x200+2n (0≤n≤31) 性能监测配置n 150 0x201+2n (0≤n≤31) 性能监测计数器n 151 0x300 内存读写监视点整体 152 0x301 内存读写监视点整体 153 0x310+8n (0≤n≤7) 内存读写监视点n 154 0x311+8n (0≤n≤7) 内存读写监视点n 155 0x312+8n (0≤n≤7) 内存读写监视点n 156 0x313+8n (0≤n≤7) 内存读写监视点n 157 0x380 取指监视点整体控制 158 0x381 取指监视点整体状态 159 0x390+8n (0≤n≤7) 取指监视点n配置1 160 0x391+8n (0≤n≤7) 取指监视点n配置2 161 0x392+8n (0≤n≤7) 取指监视点n配置3 162 0x393+8n (0≤n≤7) 取指监视点n配置4 163 0x500 调试寄存器 164 0x501 调试异常返回地址 165 0x502 调试数据保存 166 ================= ============================ 167 168 ERA,TLBRERA,MERRERA和DERA有时也分别 169 170 基础指令集 171 ========== 172 173 指令格式 174 -------- 175 176 LoongArch的指令字长为32位,一共有9 177 178 =========== ========================== 179 格式名称 指令构成 180 =========== ========================== 181 2R Opcode + Rj + Rd 182 3R Opcode + Rk + Rj + Rd 183 4R Opcode + Ra + Rk + Rj + Rd 184 2RI8 Opcode + I8 + Rj + Rd 185 2RI12 Opcode + I12 + Rj + Rd 186 2RI14 Opcode + I14 + Rj + Rd 187 2RI16 Opcode + I16 + Rj + Rd 188 1RI21 Opcode + I21L + Rj + I21H 189 I26 Opcode + I26L + I26H 190 =========== ========================== 191 192 Opcode是指令操作码,Rj和Rk是源操作 193 4R-type格式特有的附加操作数(寄存 194 16位/21位/26位的立即数。其中较长 195 部分,所以你们在这里的格式描述 196 197 指令列表 198 -------- 199 200 为了简便起见,我们在此只罗列一 201 :ref:`参考文献 <loongarch-references-zh_CN 202 203 1. 算术运算指令:: 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 MO 209 MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MO 210 PCADDI PCADDU12I PCADDU18I 211 LU12I.W LU32I.D LU52I.D ADDU16I.D 212 213 2. 移位运算指令:: 214 215 SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRA 216 SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRA 217 218 3. 位域操作指令:: 219 220 EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CT 221 BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D 222 REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REV 223 MASKEQZ MASKNEZ 224 225 4. 分支转移指令:: 226 227 BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL J 228 229 5. 访存读写指令:: 230 231 LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B 232 LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX 233 LDPTR.W LDPTR.D STPTR.W STPTR.D 234 PRELD PRELDX 235 236 6. 原子操作指令:: 237 238 LL.W SC.W LL.D SC.D 239 AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W 240 AMMAX.W AMMAX.D AMMIN.W AMMIN.D 241 242 7. 栅障指令:: 243 244 IBAR DBAR 245 246 8. 特殊指令:: 247 248 SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) D 249 ASRTLE.D ASRTGT.D 250 251 9. 特权指令:: 252 253 CSRRD CSRWR CSRXCHG 254 IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IO 255 CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TL 256 257 虚拟内存 258 ======== 259 260 LoongArch可以使用直接映射虚拟内存 261 262 直接映射虚拟内存通过CSR.DMWn(n=0~3 263 之间有简单的映射关系:: 264 265 VA = PA + 固定偏移 266 267 分页映射的虚拟地址(VA)和物理 268 表中。LoongArch的TLB包括一个全相联 269 和一个组相联的STLB(Single Page Size T 270 271 缺省状态下,LA32的整个虚拟地址空 272 273 ============ =========================== ===== 274 区段名 地址范围 275 ============ =========================== ===== 276 ``UVRANGE`` ``0x00000000 - 0x7FFFFFFF`` 分 277 ``KPRANGE0`` ``0x80000000 - 0x9FFFFFFF`` 直 278 ``KPRANGE1`` ``0xA0000000 - 0xBFFFFFFF`` 直 279 ``KVRANGE`` ``0xC0000000 - 0xFFFFFFFF`` 分 280 ============ =========================== ===== 281 282 用户态(PLV3)只能访问UVRANGE,对 283 30~31位清零就等于物理地址。例如 284 是0x80001000,而其可缓存直接映射虚 285 286 缺省状态下,LA64的整个虚拟地址空 287 288 ============ ====================== ========== 289 区段名 地址范围 属 290 ============ ====================== ========== 291 ``XUVRANGE`` ``0x0000000000000000 - 分页映 292 0x3FFFFFFFFFFFFFFF`` 293 ``XSPRANGE`` ``0x4000000000000000 - 直接映 294 0x7FFFFFFFFFFFFFFF`` 295 ``XKPRANGE`` ``0x8000000000000000 - 直接映 296 0xBFFFFFFFFFFFFFFF`` 297 ``XKVRANGE`` ``0xC000000000000000 - 分页映 298 0xFFFFFFFFFFFFFFFF`` 299 ============ ====================== ========== 300 301 用户态(PLV3)只能访问XUVRANGE,对 302 60~63位清零就等于物理地址,而其 303 非缓存,1表示一致可缓存,2表示 304 305 目前,我们仅用XKPRANGE来进行直接 306 307 此处给出一个直接映射的例子:物 308 (在XKPRANGE中)是0x80000000_00001000, 309 是0x90000000_00001000,而其弱序非缓存 310 00001000。 311 312 Loongson与LoongArch的关系 313 ========================= 314 315 LoongArch是一种RISC指令集架构(ISA) 316 芯)是一个处理器家族。龙芯包括 317 Loongson-2(龙芯2号)是低端64位处理 318 器系列。旧的龙芯处理器基于MIPS架 319 为例:龙芯3A1000/3B1500/3A2000/3A3000/3A4 320 来的型号)都是基于LoongArch的。 321 322 .. _loongarch-references-zh_CN: 323 324 参考文献 325 ======== 326 327 Loongson官方网站(龙芯中科技术股 328 329 http://www.loongson.cn/ 330 331 Loongson与LoongArch的开发者网站(软 332 333 http://www.loongnix.cn/ 334 335 https://github.com/loongson/ 336 337 https://loongson.github.io/LoongArch-Documen 338 339 LoongArch指令集架构的文档: 340 341 https://github.com/loongson/LoongArch-Docume 342 343 https://github.com/loongson/LoongArch-Docume 344 345 LoongArch的ELF psABI文档: 346 347 https://github.com/loongson/LoongArch-Docume 348 349 https://github.com/loongson/LoongArch-Docume 350 351 Loongson与LoongArch的Linux内核源码仓库 352 353 https://git.kernel.org/pub/scm/linux/kernel/
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.