1 .. SPDX-License-Identifier: GPL-2.0
3 =========================
4 Introduction to LoongArch
5 =========================
7 LoongArch is a new RISC ISA, which is a bit like MIPS or RISC-V. There are
8 currently 3 variants: a reduced 32-bit version (LA32R), a standard 32-bit
9 version (LA32S) and a 64-bit version (LA64). There are 4 privilege levels
10 (PLVs) defined in LoongArch: PLV0~PLV3, from high to low. Kernel runs at PLV0
11 while applications run at PLV3. This document introduces the registers, basic
12 instruction set, virtual memory and some other topics of LoongArch.
17 LoongArch registers include general purpose registers (GPRs), floating point
18 registers (FPRs), vector registers (VRs) and control status registers (CSRs)
19 used in privileged mode (PLV0).
24 LoongArch has 32 GPRs ( ``$r0`` ~ ``$r31`` ); each one is 32-bit wide in LA32
25 and 64-bit wide in LA64. ``$r0`` is hard-wired to zero, and the other registers
26 are not architecturally special. (Except ``$r1``, which is hard-wired as the
27 link register of the BL instruction.)
29 The kernel uses a variant of the LoongArch register convention, as described in
30 the LoongArch ELF psABI spec, in :ref:`References <loongarch-references>`:
32 ================= =============== =================== ============
33 Name Alias Usage Preserved
35 ================= =============== =================== ============
36 ``$r0`` ``$zero`` Constant zero Unused
37 ``$r1`` ``$ra`` Return address No
38 ``$r2`` ``$tp`` TLS/Thread pointer Unused
39 ``$r3`` ``$sp`` Stack pointer Yes
40 ``$r4``-``$r11`` ``$a0``-``$a7`` Argument registers No
41 ``$r4``-``$r5`` ``$v0``-``$v1`` Return value No
42 ``$r12``-``$r20`` ``$t0``-``$t8`` Temp registers No
43 ``$r21`` ``$u0`` Percpu base address Unused
44 ``$r22`` ``$fp`` Frame pointer Yes
45 ``$r23``-``$r31`` ``$s0``-``$s8`` Static registers Yes
46 ================= =============== =================== ============
49 The register ``$r21`` is reserved in the ELF psABI, but used by the Linux
50 kernel for storing the percpu base address. It normally has no ABI name,
51 but is called ``$u0`` in the kernel. You may also see ``$v0`` or ``$v1``
52 in some old code,however they are deprecated aliases of ``$a0`` and ``$a1``
58 LoongArch has 32 FPRs ( ``$f0`` ~ ``$f31`` ) when FPU is present. Each one is
59 64-bit wide on the LA64 cores.
61 The floating-point register convention is the same as described in the
62 LoongArch ELF psABI spec:
64 ================= ================== =================== ============
65 Name Alias Usage Preserved
67 ================= ================== =================== ============
68 ``$f0``-``$f7`` ``$fa0``-``$fa7`` Argument registers No
69 ``$f0``-``$f1`` ``$fv0``-``$fv1`` Return value No
70 ``$f8``-``$f23`` ``$ft0``-``$ft15`` Temp registers No
71 ``$f24``-``$f31`` ``$fs0``-``$fs7`` Static registers Yes
72 ================= ================== =================== ============
75 You may see ``$fv0`` or ``$fv1`` in some old code, however they are
76 deprecated aliases of ``$fa0`` and ``$fa1`` respectively.
81 There are currently 2 vector extensions to LoongArch:
83 - LSX (Loongson SIMD eXtension) with 128-bit vectors,
84 - LASX (Loongson Advanced SIMD eXtension) with 256-bit vectors.
86 LSX brings ``$v0`` ~ ``$v31`` while LASX brings ``$x0`` ~ ``$x31`` as the vector
89 The VRs overlap with FPRs: for example, on a core implementing LSX and LASX,
90 the lower 128 bits of ``$x0`` is shared with ``$v0``, and the lower 64 bits of
91 ``$v0`` is shared with ``$f0``; same with all other VRs.
96 CSRs can only be accessed from privileged mode (PLV0):
98 ================= ===================================== ==============
99 Address Full Name Abbrev Name
100 ================= ===================================== ==============
101 0x0 Current Mode Information CRMD
102 0x1 Pre-exception Mode Information PRMD
103 0x2 Extension Unit Enable EUEN
104 0x3 Miscellaneous Control MISC
105 0x4 Exception Configuration ECFG
106 0x5 Exception Status ESTAT
107 0x6 Exception Return Address ERA
108 0x7 Bad (Faulting) Virtual Address BADV
109 0x8 Bad (Faulting) Instruction Word BADI
110 0xC Exception Entrypoint Address EENTRY
111 0x10 TLB Index TLBIDX
112 0x11 TLB Entry High-order Bits TLBEHI
113 0x12 TLB Entry Low-order Bits 0 TLBELO0
114 0x13 TLB Entry Low-order Bits 1 TLBELO1
115 0x18 Address Space Identifier ASID
116 0x19 Page Global Directory Address for PGDL
117 Lower-half Address Space
118 0x1A Page Global Directory Address for PGDH
119 Higher-half Address Space
120 0x1B Page Global Directory Address PGD
121 0x1C Page Walk Control for Lower- PWCL
123 0x1D Page Walk Control for Higher- PWCH
125 0x1E STLB Page Size STLBPS
126 0x1F Reduced Virtual Address Configuration RVACFG
127 0x20 CPU Identifier CPUID
128 0x21 Privileged Resource Configuration 1 PRCFG1
129 0x22 Privileged Resource Configuration 2 PRCFG2
130 0x23 Privileged Resource Configuration 3 PRCFG3
131 0x30+n (0≤n≤15) Saved Data register SAVEn
132 0x40 Timer Identifier TID
133 0x41 Timer Configuration TCFG
134 0x42 Timer Value TVAL
135 0x43 Compensation of Timer Count CNTC
136 0x44 Timer Interrupt Clearing TICLR
137 0x60 LLBit Control LLBCTL
138 0x80 Implementation-specific Control 1 IMPCTL1
139 0x81 Implementation-specific Control 2 IMPCTL2
140 0x88 TLB Refill Exception Entrypoint TLBRENTRY
142 0x89 TLB Refill Exception BAD (Faulting) TLBRBADV
144 0x8A TLB Refill Exception Return Address TLBRERA
145 0x8B TLB Refill Exception Saved Data TLBRSAVE
147 0x8C TLB Refill Exception Entry Low-order TLBRELO0
149 0x8D TLB Refill Exception Entry Low-order TLBRELO1
151 0x8E TLB Refill Exception Entry High-order TLBEHI
153 0x8F TLB Refill Exception Pre-exception TLBRPRMD
155 0x90 Machine Error Control MERRCTL
156 0x91 Machine Error Information 1 MERRINFO1
157 0x92 Machine Error Information 2 MERRINFO2
158 0x93 Machine Error Exception Entrypoint MERRENTRY
160 0x94 Machine Error Exception Return MERRERA
162 0x95 Machine Error Exception Saved Data MERRSAVE
165 0x180+n (0≤n≤3) Direct Mapping Configuration Window n DMWn
166 0x200+2n (0≤n≤31) Performance Monitor Configuration n PMCFGn
167 0x201+2n (0≤n≤31) Performance Monitor Overall Counter n PMCNTn
168 0x300 Memory Load/Store WatchPoint MWPC
170 0x301 Memory Load/Store WatchPoint MWPS
172 0x310+8n (0≤n≤7) Memory Load/Store WatchPoint n MWPnCFG1
174 0x311+8n (0≤n≤7) Memory Load/Store WatchPoint n MWPnCFG2
176 0x312+8n (0≤n≤7) Memory Load/Store WatchPoint n MWPnCFG3
178 0x313+8n (0≤n≤7) Memory Load/Store WatchPoint n MWPnCFG4
180 0x380 Instruction Fetch WatchPoint FWPC
182 0x381 Instruction Fetch WatchPoint FWPS
184 0x390+8n (0≤n≤7) Instruction Fetch WatchPoint n FWPnCFG1
186 0x391+8n (0≤n≤7) Instruction Fetch WatchPoint n FWPnCFG2
188 0x392+8n (0≤n≤7) Instruction Fetch WatchPoint n FWPnCFG3
190 0x393+8n (0≤n≤7) Instruction Fetch WatchPoint n FWPnCFG4
192 0x500 Debug Register DBG
193 0x501 Debug Exception Return Address DERA
194 0x502 Debug Exception Saved Data Register DSAVE
195 ================= ===================================== ==============
197 ERA, TLBRERA, MERRERA and DERA are sometimes also known as EPC, TLBREPC, MERREPC
198 and DEPC respectively.
200 Basic Instruction Set
201 =====================
206 LoongArch instructions are 32 bits wide, belonging to 9 basic instruction
207 formats (and variants of them):
209 =========== ==========================
210 Format name Composition
211 =========== ==========================
213 3R Opcode + Rk + Rj + Rd
214 4R Opcode + Ra + Rk + Rj + Rd
215 2RI8 Opcode + I8 + Rj + Rd
216 2RI12 Opcode + I12 + Rj + Rd
217 2RI14 Opcode + I14 + Rj + Rd
218 2RI16 Opcode + I16 + Rj + Rd
219 1RI21 Opcode + I21L + Rj + I21H
220 I26 Opcode + I26L + I26H
221 =========== ==========================
223 Rd is the destination register operand, while Rj, Rk and Ra ("a" stands for
224 "additional") are the source register operands. I8/I12/I14/I16/I21/I26 are
225 immediate operands of respective width. The longer I21 and I26 are stored
226 in separate higher and lower parts in the instruction word, denoted by the "L"
232 For brevity, only instruction names (mnemonics) are listed here; please see the
233 :ref:`References <loongarch-references>` for details.
236 1. Arithmetic Instructions::
238 ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D
240 AND OR NOR XOR ANDN ORN ANDI ORI XORI
241 MUL.W MULH.W MULH.WU DIV.W DIV.WU MOD.W MOD.WU
242 MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU
243 PCADDI PCADDU12I PCADDU18I
244 LU12I.W LU32I.D LU52I.D ADDU16I.D
246 2. Bit-shift Instructions::
248 SLL.W SRL.W SRA.W ROTR.W SLLI.W SRLI.W SRAI.W ROTRI.W
249 SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D
251 3. Bit-manipulation Instructions::
253 EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D
254 BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D
255 REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D
258 4. Branch Instructions::
260 BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
262 5. Load/Store Instructions::
264 LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D
265 LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D
266 LDPTR.W LDPTR.D STPTR.W STPTR.D
269 6. Atomic Operation Instructions::
272 AMSWAP.W AMSWAP.D AMADD.W AMADD.D AMAND.W AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D
273 AMMAX.W AMMAX.D AMMIN.W AMMIN.D
275 7. Barrier Instructions::
279 8. Special Instructions::
281 SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D
284 9. Privileged Instructions::
287 IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D
288 CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE
293 LoongArch supports direct-mapped virtual memory and page-mapped virtual memory.
295 Direct-mapped virtual memory is configured by CSR.DMWn (n=0~3), it has a simple
296 relationship between virtual address (VA) and physical address (PA)::
298 VA = PA + FixedOffset
300 Page-mapped virtual memory has arbitrary relationship between VA and PA, which
301 is recorded in TLB and page tables. LoongArch's TLB includes a fully-associative
302 MTLB (Multiple Page Size TLB) and set-associative STLB (Single Page Size TLB).
304 By default, the whole virtual address space of LA32 is configured like this:
306 ============ =========================== =============================
307 Name Address Range Attributes
308 ============ =========================== =============================
309 ``UVRANGE`` ``0x00000000 - 0x7FFFFFFF`` Page-mapped, Cached, PLV0~3
310 ``KPRANGE0`` ``0x80000000 - 0x9FFFFFFF`` Direct-mapped, Uncached, PLV0
311 ``KPRANGE1`` ``0xA0000000 - 0xBFFFFFFF`` Direct-mapped, Cached, PLV0
312 ``KVRANGE`` ``0xC0000000 - 0xFFFFFFFF`` Page-mapped, Cached, PLV0
313 ============ =========================== =============================
315 User mode (PLV3) can only access UVRANGE. For direct-mapped KPRANGE0 and
316 KPRANGE1, PA is equal to VA with bit30~31 cleared. For example, the uncached
317 direct-mapped VA of 0x00001000 is 0x80001000, and the cached direct-mapped
318 VA of 0x00001000 is 0xA0001000.
320 By default, the whole virtual address space of LA64 is configured like this:
322 ============ ====================== ======================================
323 Name Address Range Attributes
324 ============ ====================== ======================================
325 ``XUVRANGE`` ``0x0000000000000000 - Page-mapped, Cached, PLV0~3
327 ``XSPRANGE`` ``0x4000000000000000 - Direct-mapped, Cached / Uncached, PLV0
329 ``XKPRANGE`` ``0x8000000000000000 - Direct-mapped, Cached / Uncached, PLV0
331 ``XKVRANGE`` ``0xC000000000000000 - Page-mapped, Cached, PLV0
333 ============ ====================== ======================================
335 User mode (PLV3) can only access XUVRANGE. For direct-mapped XSPRANGE and
336 XKPRANGE, PA is equal to VA with bits 60~63 cleared, and the cache attribute
337 is configured by bits 60~61 in VA: 0 is for strongly-ordered uncached, 1 is
338 for coherent cached, and 2 is for weakly-ordered uncached.
340 Currently we only use XKPRANGE for direct mapping and XSPRANGE is reserved.
342 To put this in action: the strongly-ordered uncached direct-mapped VA (in
343 XKPRANGE) of 0x00000000_00001000 is 0x80000000_00001000, the coherent cached
344 direct-mapped VA (in XKPRANGE) of 0x00000000_00001000 is 0x90000000_00001000,
345 and the weakly-ordered uncached direct-mapped VA (in XKPRANGE) of 0x00000000
346 _00001000 is 0xA0000000_00001000.
348 Relationship of Loongson and LoongArch
349 ======================================
351 LoongArch is a RISC ISA which is different from any other existing ones, while
352 Loongson is a family of processors. Loongson includes 3 series: Loongson-1 is
353 the 32-bit processor series, Loongson-2 is the low-end 64-bit processor series,
354 and Loongson-3 is the high-end 64-bit processor series. Old Loongson is based on
355 MIPS, while New Loongson is based on LoongArch. Take Loongson-3 as an example:
356 Loongson-3A1000/3B1500/3A2000/3A3000/3A4000 are MIPS-compatible, while Loongson-
357 3A5000 (and future revisions) are all based on LoongArch.
359 .. _loongarch-references:
364 Official web site of Loongson Technology Corp. Ltd.:
366 http://www.loongson.cn/
368 Developer web site of Loongson and LoongArch (Software and Documentation):
370 http://www.loongnix.cn/
372 https://github.com/loongson/
374 https://loongson.github.io/LoongArch-Documentation/
376 Documentation of LoongArch ISA:
378 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-CN.pdf (in Chinese)
380 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-EN.pdf (in English)
382 Documentation of LoongArch ELF psABI:
384 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.00-CN.pdf (in Chinese)
386 https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.00-EN.pdf (in English)
388 Linux kernel repository of Loongson and LoongArch:
390 https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git