xref: /linux/Documentation/arch/loongarch/introduction.rst (revision 981368e1440b76f68b1ac8f5fb14e739f80ecc4e)
1.. SPDX-License-Identifier: GPL-2.0
2
3=========================
4Introduction to LoongArch
5=========================
6
7LoongArch is a new RISC ISA, which is a bit like MIPS or RISC-V. There are
8currently 3 variants: a reduced 32-bit version (LA32R), a standard 32-bit
9version (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
11while applications run at PLV3. This document introduces the registers, basic
12instruction set, virtual memory and some other topics of LoongArch.
13
14Registers
15=========
16
17LoongArch registers include general purpose registers (GPRs), floating point
18registers (FPRs), vector registers (VRs) and control status registers (CSRs)
19used in privileged mode (PLV0).
20
21GPRs
22----
23
24LoongArch has 32 GPRs ( ``$r0`` ~ ``$r31`` ); each one is 32-bit wide in LA32
25and 64-bit wide in LA64. ``$r0`` is hard-wired to zero, and the other registers
26are not architecturally special. (Except ``$r1``, which is hard-wired as the
27link register of the BL instruction.)
28
29The kernel uses a variant of the LoongArch register convention, as described in
30the LoongArch ELF psABI spec, in :ref:`References <loongarch-references>`:
31
32================= =============== =================== ============
33Name              Alias           Usage               Preserved
34                                                      across calls
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================= =============== =================== ============
47
48.. Note::
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``
53    respectively.
54
55FPRs
56----
57
58LoongArch has 32 FPRs ( ``$f0`` ~ ``$f31`` ) when FPU is present. Each one is
5964-bit wide on the LA64 cores.
60
61The floating-point register convention is the same as described in the
62LoongArch ELF psABI spec:
63
64================= ================== =================== ============
65Name              Alias              Usage               Preserved
66                                                         across calls
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================= ================== =================== ============
73
74.. Note::
75    You may see ``$fv0`` or ``$fv1`` in some old code, however they are
76    deprecated aliases of ``$fa0`` and ``$fa1`` respectively.
77
78VRs
79----
80
81There are currently 2 vector extensions to LoongArch:
82
83- LSX (Loongson SIMD eXtension) with 128-bit vectors,
84- LASX (Loongson Advanced SIMD eXtension) with 256-bit vectors.
85
86LSX brings ``$v0`` ~ ``$v31`` while LASX brings ``$x0`` ~ ``$x31`` as the vector
87registers.
88
89The VRs overlap with FPRs: for example, on a core implementing LSX and LASX,
90the 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.
92
93CSRs
94----
95
96CSRs can only be accessed from privileged mode (PLV0):
97
98================= ===================================== ==============
99Address           Full Name                             Abbrev Name
100================= ===================================== ==============
1010x0               Current Mode Information              CRMD
1020x1               Pre-exception Mode Information        PRMD
1030x2               Extension Unit Enable                 EUEN
1040x3               Miscellaneous Control                 MISC
1050x4               Exception Configuration               ECFG
1060x5               Exception Status                      ESTAT
1070x6               Exception Return Address              ERA
1080x7               Bad (Faulting) Virtual Address        BADV
1090x8               Bad (Faulting) Instruction Word       BADI
1100xC               Exception Entrypoint Address          EENTRY
1110x10              TLB Index                             TLBIDX
1120x11              TLB Entry High-order Bits             TLBEHI
1130x12              TLB Entry Low-order Bits 0            TLBELO0
1140x13              TLB Entry Low-order Bits 1            TLBELO1
1150x18              Address Space Identifier              ASID
1160x19              Page Global Directory Address for     PGDL
117                  Lower-half Address Space
1180x1A              Page Global Directory Address for     PGDH
119                  Higher-half Address Space
1200x1B              Page Global Directory Address         PGD
1210x1C              Page Walk Control for Lower-          PWCL
122                  half Address Space
1230x1D              Page Walk Control for Higher-         PWCH
124                  half Address Space
1250x1E              STLB Page Size                        STLBPS
1260x1F              Reduced Virtual Address Configuration RVACFG
1270x20              CPU Identifier                        CPUID
1280x21              Privileged Resource Configuration 1   PRCFG1
1290x22              Privileged Resource Configuration 2   PRCFG2
1300x23              Privileged Resource Configuration 3   PRCFG3
1310x30+n (0≤n≤15)   Saved Data register                   SAVEn
1320x40              Timer Identifier                      TID
1330x41              Timer Configuration                   TCFG
1340x42              Timer Value                           TVAL
1350x43              Compensation of Timer Count           CNTC
1360x44              Timer Interrupt Clearing              TICLR
1370x60              LLBit Control                         LLBCTL
1380x80              Implementation-specific Control 1     IMPCTL1
1390x81              Implementation-specific Control 2     IMPCTL2
1400x88              TLB Refill Exception Entrypoint       TLBRENTRY
141                  Address
1420x89              TLB Refill Exception BAD (Faulting)   TLBRBADV
143                  Virtual Address
1440x8A              TLB Refill Exception Return Address   TLBRERA
1450x8B              TLB Refill Exception Saved Data       TLBRSAVE
146                  Register
1470x8C              TLB Refill Exception Entry Low-order  TLBRELO0
148                  Bits 0
1490x8D              TLB Refill Exception Entry Low-order  TLBRELO1
150                  Bits 1
1510x8E              TLB Refill Exception Entry High-order TLBEHI
152                  Bits
1530x8F              TLB Refill Exception Pre-exception    TLBRPRMD
154                  Mode Information
1550x90              Machine Error Control                 MERRCTL
1560x91              Machine Error Information 1           MERRINFO1
1570x92              Machine Error Information 2           MERRINFO2
1580x93              Machine Error Exception Entrypoint    MERRENTRY
159                  Address
1600x94              Machine Error Exception Return        MERRERA
161                  Address
1620x95              Machine Error Exception Saved Data    MERRSAVE
163                  Register
1640x98              Cache TAGs                            CTAG
1650x180+n (0≤n≤3)   Direct Mapping Configuration Window n DMWn
1660x200+2n (0≤n≤31) Performance Monitor Configuration n   PMCFGn
1670x201+2n (0≤n≤31) Performance Monitor Overall Counter n PMCNTn
1680x300             Memory Load/Store WatchPoint          MWPC
169                  Overall Control
1700x301             Memory Load/Store WatchPoint          MWPS
171                  Overall Status
1720x310+8n (0≤n≤7)  Memory Load/Store WatchPoint n        MWPnCFG1
173                  Configuration 1
1740x311+8n (0≤n≤7)  Memory Load/Store WatchPoint n        MWPnCFG2
175                  Configuration 2
1760x312+8n (0≤n≤7)  Memory Load/Store WatchPoint n        MWPnCFG3
177                  Configuration 3
1780x313+8n (0≤n≤7)  Memory Load/Store WatchPoint n        MWPnCFG4
179                  Configuration 4
1800x380             Instruction Fetch WatchPoint          FWPC
181                  Overall Control
1820x381             Instruction Fetch WatchPoint          FWPS
183                  Overall Status
1840x390+8n (0≤n≤7)  Instruction Fetch WatchPoint n        FWPnCFG1
185                  Configuration 1
1860x391+8n (0≤n≤7)  Instruction Fetch WatchPoint n        FWPnCFG2
187                  Configuration 2
1880x392+8n (0≤n≤7)  Instruction Fetch WatchPoint n        FWPnCFG3
189                  Configuration 3
1900x393+8n (0≤n≤7)  Instruction Fetch WatchPoint n        FWPnCFG4
191                  Configuration 4
1920x500             Debug Register                        DBG
1930x501             Debug Exception Return Address        DERA
1940x502             Debug Exception Saved Data Register   DSAVE
195================= ===================================== ==============
196
197ERA, TLBRERA, MERRERA and DERA are sometimes also known as EPC, TLBREPC, MERREPC
198and DEPC respectively.
199
200Basic Instruction Set
201=====================
202
203Instruction formats
204-------------------
205
206LoongArch instructions are 32 bits wide, belonging to 9 basic instruction
207formats (and variants of them):
208
209=========== ==========================
210Format name Composition
211=========== ==========================
2122R          Opcode + Rj + Rd
2133R          Opcode + Rk + Rj + Rd
2144R          Opcode + Ra + Rk + Rj + Rd
2152RI8        Opcode + I8 + Rj + Rd
2162RI12       Opcode + I12 + Rj + Rd
2172RI14       Opcode + I14 + Rj + Rd
2182RI16       Opcode + I16 + Rj + Rd
2191RI21       Opcode + I21L + Rj + I21H
220I26         Opcode + I26L + I26H
221=========== ==========================
222
223Rd 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
225immediate operands of respective width. The longer I21 and I26 are stored
226in separate higher and lower parts in the instruction word, denoted by the "L"
227and "H" suffixes.
228
229List of Instructions
230--------------------
231
232For brevity, only instruction names (mnemonics) are listed here; please see the
233:ref:`References <loongarch-references>` for details.
234
235
2361. Arithmetic Instructions::
237
238    ADD.W SUB.W ADDI.W ADD.D SUB.D ADDI.D
239    SLT SLTU SLTI SLTUI
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
245
2462. Bit-shift Instructions::
247
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
250
2513. Bit-manipulation Instructions::
252
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
256    MASKEQZ MASKNEZ
257
2584. Branch Instructions::
259
260    BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
261
2625. Load/Store Instructions::
263
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
267    PRELD PRELDX
268
2696. Atomic Operation Instructions::
270
271    LL.W SC.W LL.D SC.D
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
274
2757. Barrier Instructions::
276
277    IBAR DBAR
278
2798. Special Instructions::
280
281    SYSCALL BREAK CPUCFG NOP IDLE ERTN(ERET) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D
282    ASRTLE.D ASRTGT.D
283
2849. Privileged Instructions::
285
286    CSRRD CSRWR CSRXCHG
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
289
290Virtual Memory
291==============
292
293LoongArch supports direct-mapped virtual memory and page-mapped virtual memory.
294
295Direct-mapped virtual memory is configured by CSR.DMWn (n=0~3), it has a simple
296relationship between virtual address (VA) and physical address (PA)::
297
298 VA = PA + FixedOffset
299
300Page-mapped virtual memory has arbitrary relationship between VA and PA, which
301is recorded in TLB and page tables. LoongArch's TLB includes a fully-associative
302MTLB (Multiple Page Size TLB) and set-associative STLB (Single Page Size TLB).
303
304By default, the whole virtual address space of LA32 is configured like this:
305
306============ =========================== =============================
307Name         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============ =========================== =============================
314
315User mode (PLV3) can only access UVRANGE. For direct-mapped KPRANGE0 and
316KPRANGE1, PA is equal to VA with bit30~31 cleared. For example, the uncached
317direct-mapped VA of 0x00001000 is 0x80001000, and the cached direct-mapped
318VA of 0x00001000 is 0xA0001000.
319
320By default, the whole virtual address space of LA64 is configured like this:
321
322============ ====================== ======================================
323Name         Address Range          Attributes
324============ ====================== ======================================
325``XUVRANGE`` ``0x0000000000000000 - Page-mapped, Cached, PLV0~3
326             0x3FFFFFFFFFFFFFFF``
327``XSPRANGE`` ``0x4000000000000000 - Direct-mapped, Cached / Uncached, PLV0
328             0x7FFFFFFFFFFFFFFF``
329``XKPRANGE`` ``0x8000000000000000 - Direct-mapped, Cached / Uncached, PLV0
330             0xBFFFFFFFFFFFFFFF``
331``XKVRANGE`` ``0xC000000000000000 - Page-mapped, Cached, PLV0
332             0xFFFFFFFFFFFFFFFF``
333============ ====================== ======================================
334
335User mode (PLV3) can only access XUVRANGE. For direct-mapped XSPRANGE and
336XKPRANGE, PA is equal to VA with bits 60~63 cleared, and the cache attribute
337is configured by bits 60~61 in VA: 0 is for strongly-ordered uncached, 1 is
338for coherent cached, and 2 is for weakly-ordered uncached.
339
340Currently we only use XKPRANGE for direct mapping and XSPRANGE is reserved.
341
342To put this in action: the strongly-ordered uncached direct-mapped VA (in
343XKPRANGE) of 0x00000000_00001000 is 0x80000000_00001000, the coherent cached
344direct-mapped VA (in XKPRANGE) of 0x00000000_00001000 is 0x90000000_00001000,
345and the weakly-ordered uncached direct-mapped VA (in XKPRANGE) of 0x00000000
346_00001000 is 0xA0000000_00001000.
347
348Relationship of Loongson and LoongArch
349======================================
350
351LoongArch is a RISC ISA which is different from any other existing ones, while
352Loongson is a family of processors. Loongson includes 3 series: Loongson-1 is
353the 32-bit processor series, Loongson-2 is the low-end 64-bit processor series,
354and Loongson-3 is the high-end 64-bit processor series. Old Loongson is based on
355MIPS, while New Loongson is based on LoongArch. Take Loongson-3 as an example:
356Loongson-3A1000/3B1500/3A2000/3A3000/3A4000 are MIPS-compatible, while Loongson-
3573A5000 (and future revisions) are all based on LoongArch.
358
359.. _loongarch-references:
360
361References
362==========
363
364Official web site of Loongson Technology Corp. Ltd.:
365
366  http://www.loongson.cn/
367
368Developer web site of Loongson and LoongArch (Software and Documentation):
369
370  http://www.loongnix.cn/
371
372  https://github.com/loongson/
373
374  https://loongson.github.io/LoongArch-Documentation/
375
376Documentation of LoongArch ISA:
377
378  https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-CN.pdf (in Chinese)
379
380  https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-EN.pdf (in English)
381
382Documentation of LoongArch ELF psABI:
383
384  https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.00-CN.pdf (in Chinese)
385
386  https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.00-EN.pdf (in English)
387
388Linux kernel repository of Loongson and LoongArch:
389
390  https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
391