arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / Documentation / translations / zh_TW / arch / loongarch / introduction.rst
1 .. SPDX-License-Identifier: GPL-2.0
2
3 .. include:: ../../disclaimer-zh_TW.rst
4
5 :Original: Documentation/arch/loongarch/introduction.rst
6 :Translator: Huacai Chen <chenhuacai@loongson.cn>
7
8 =============
9 LoongArch介紹
10 =============
11
12 LoongArch是一種新的RISC ISA,在一定程度上類似於MIPS和RISC-V。LoongArch指令集
13 包括一個精簡32位版(LA32R)、一個標準32位版(LA32S)、一個64位版(LA64)。
14 LoongArch定義了四個特權級(PLV0~PLV3),其中PLV0是最高特權級,用於內核;而PLV3
15 是最低特權級,用於應用程序。本文檔介紹了LoongArch的寄存器、基礎指令集、虛擬內
16 存以及其他一些主題。
17
18 寄存器
19 ======
20
21 LoongArch的寄存器包括通用寄存器(GPRs)、浮點寄存器(FPRs)、向量寄存器(VRs)
22 和用於特權模式(PLV0)的控制狀態寄存器(CSRs)。
23
24 通用寄存器
25 ----------
26
27 LoongArch包括32個通用寄存器( ``$r0`` ~ ``$r31`` ),LA32中每個寄存器爲32位寬,
28 LA64中每個寄存器爲64位寬。 ``$r0`` 的內容總是固定爲0,而其他寄存器在體系結構層面
29 沒有特殊功能。( ``$r1`` 算是一個例外,在BL指令中固定用作鏈接返回寄存器。)
30
31 內核使用了一套LoongArch寄存器約定,定義在LoongArch ELF psABI規範中,詳細描述參見
32 :ref:`參考文獻 <loongarch-references-zh_TW>`:
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中保留未使用,但是在Linux內核用於保
51     存每CPU變量基地址。該寄存器沒有ABI命名,不過在內核中稱爲 ``$u0`` 。在
52     一些遺留代碼中有時可能見到 ``$v0`` 和 ``$v1`` ,它們是 ``$a0`` 和
53     ``$a1`` 的別名,屬於已經廢棄的用法。
54
55 浮點寄存器
56 ----------
57
58 當系統中存在FPU時,LoongArch有32個浮點寄存器( ``$f0`` ~ ``$f31`` )。在LA64
59 的CPU核上,每個寄存器均爲64位寬。
60
61 浮點寄存器的使用約定與LoongArch ELF psABI規範的描述相同:
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     注意:在一些遺留代碼中有時可能見到 ``$fv0`` 和 ``$fv1`` ,它們是
74     ``$fa0`` 和 ``$fa1`` 的別名,屬於已經廢棄的用法。
75
76
77 向量寄存器
78 ----------
79
80 LoongArch現有兩種向量擴展:
81
82 - 128位向量擴展LSX(全稱Loongson SIMD eXtention),
83 - 256位向量擴展LASX(全稱Loongson Advanced SIMD eXtention)。
84
85 LSX使用 ``$v0`` ~ ``$v31`` 向量寄存器,而LASX則使用 ``$x0`` ~ ``$x31`` 。
86
87 浮點寄存器和向量寄存器是複用的,比如:在一個實現了LSX和LASX的核上, ``$x0`` 的
88 低128位與 ``$v0`` 共用, ``$v0`` 的低64位與 ``$f0`` 共用,其他寄存器依此類推。
89
90 控制狀態寄存器
91 --------------
92
93 控制狀態寄存器只能在特權模式(PLV0)下訪問:
94
95 ================= ==================================== ==========
96 地址              全稱描述                             簡稱
97 ================= ==================================== ==========
98 0x0               當前模式信息                         CRMD
99 0x1               異常前模式信息                       PRMD
100 0x2               擴展部件使能                         EUEN
101 0x3               雜項控制                             MISC
102 0x4               異常配置                             ECFG
103 0x5               異常狀態                             ESTAT
104 0x6               異常返回地址                         ERA
105 0x7               出錯(Faulting)虛擬地址               BADV
106 0x8               出錯(Faulting)指令字                 BADI
107 0xC               異常入口地址                         EENTRY
108 0x10              TLB索引                              TLBIDX
109 0x11              TLB表項高位                          TLBEHI
110 0x12              TLB表項低位0                         TLBELO0
111 0x13              TLB表項低位1                         TLBELO1
112 0x18              地址空間標識符                       ASID
113 0x19              低半地址空間頁全局目錄基址           PGDL
114 0x1A              高半地址空間頁全局目錄基址           PGDH
115 0x1B              頁全局目錄基址                       PGD
116 0x1C              頁表遍歷控制低半部分                 PWCL
117 0x1D              頁表遍歷控制高半部分                 PWCH
118 0x1E              STLB頁大小                           STLBPS
119 0x1F              縮減虛地址配置                       RVACFG
120 0x20              CPU編號                              CPUID
121 0x21              特權資源配置信息1                    PRCFG1
122 0x22              特權資源配置信息2                    PRCFG2
123 0x23              特權資源配置信息3                    PRCFG3
124 0x30+n (0≤n≤15)   數據保存寄存器                       SAVEn
125 0x40              定時器編號                           TID
126 0x41              定時器配置                           TCFG
127 0x42              定時器值                             TVAL
128 0x43              計時器補償                           CNTC
129 0x44              定時器中斷清除                       TICLR
130 0x60              LLBit相關控制                        LLBCTL
131 0x80              實現相關控制1                        IMPCTL1
132 0x81              實現相關控制2                        IMPCTL2
133 0x88              TLB重填異常入口地址                  TLBRENTRY
134 0x89              TLB重填異常出錯(Faulting)虛地址      TLBRBADV
135 0x8A              TLB重填異常返回地址                  TLBRERA
136 0x8B              TLB重填異常數據保存                  TLBRSAVE
137 0x8C              TLB重填異常表項低位0                 TLBRELO0
138 0x8D              TLB重填異常表項低位1                 TLBRELO1
139 0x8E              TLB重填異常表項高位                  TLBEHI
140 0x8F              TLB重填異常前模式信息                TLBRPRMD
141 0x90              機器錯誤控制                         MERRCTL
142 0x91              機器錯誤信息1                        MERRINFO1
143 0x92              機器錯誤信息2                        MERRINFO2
144 0x93              機器錯誤異常入口地址                 MERRENTRY
145 0x94              機器錯誤異常返回地址                 MERRERA
146 0x95              機器錯誤異常數據保存                 MERRSAVE
147 0x98              高速緩存標籤                         CTAG
148 0x180+n (0≤n≤3)   直接映射配置窗口n                    DMWn
149 0x200+2n (0≤n≤31) 性能監測配置n                        PMCFGn
150 0x201+2n (0≤n≤31) 性能監測計數器n                      PMCNTn
151 0x300             內存讀寫監視點整體控制               MWPC
152 0x301             內存讀寫監視點整體狀態               MWPS
153 0x310+8n (0≤n≤7)  內存讀寫監視點n配置1                 MWPnCFG1
154 0x311+8n (0≤n≤7)  內存讀寫監視點n配置2                 MWPnCFG2
155 0x312+8n (0≤n≤7)  內存讀寫監視點n配置3                 MWPnCFG3
156 0x313+8n (0≤n≤7)  內存讀寫監視點n配置4                 MWPnCFG4
157 0x380             取指監視點整體控制                   FWPC
158 0x381             取指監視點整體狀態                   FWPS
159 0x390+8n (0≤n≤7)  取指監視點n配置1                     FWPnCFG1
160 0x391+8n (0≤n≤7)  取指監視點n配置2                     FWPnCFG2
161 0x392+8n (0≤n≤7)  取指監視點n配置3                     FWPnCFG3
162 0x393+8n (0≤n≤7)  取指監視點n配置4                     FWPnCFG4
163 0x500             調試寄存器                           DBG
164 0x501             調試異常返回地址                     DERA
165 0x502             調試數據保存                         DSAVE
166 ================= ==================================== ==========
167
168 ERA,TLBRERA,MERRERA和DERA有時也分別稱爲EPC,TLBREPC,MERREPC和DEPC。
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是源操作數(寄存器),Rd是目標操作數(寄存器),Ra是
193 4R-type格式特有的附加操作數(寄存器)。I8/I12/I14/I16/I21/I26分別是8位/12位/14位/
194 16位/21位/26位的立即數。其中較長的21位和26位立即數在指令字中被分割爲高位部分與低位
195 部分,所以你們在這裏的格式描述中能夠看到I21L/I21H和I26L/I26H這樣帶後綴的表述。
196
197 指令列表
198 --------
199
200 爲了簡便起見,我們在此只羅列一下指令名稱(助記符),需要詳細信息請閱讀
201 :ref:`參考文獻 <loongarch-references-zh_TW>` 中的文檔。
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 MOD.WU
209     MUL.D MULH.D MULH.DU DIV.D DIV.DU MOD.D MOD.DU
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 SRAI.W ROTRI.W
216     SLL.D SRL.D SRA.D ROTR.D SLLI.D SRLI.D SRAI.D ROTRI.D
217
218 3. 位域操作指令::
219
220     EXT.W.B EXT.W.H CLO.W CLO.D SLZ.W CLZ.D CTO.W CTO.D CTZ.W CTZ.D
221     BYTEPICK.W BYTEPICK.D BSTRINS.W BSTRINS.D BSTRPICK.W BSTRPICK.D
222     REVB.2H REVB.4H REVB.2W REVB.D REVH.2W REVH.D BITREV.4B BITREV.8B BITREV.W BITREV.D
223     MASKEQZ MASKNEZ
224
225 4. 分支轉移指令::
226
227     BEQ BNE BLT BGE BLTU BGEU BEQZ BNEZ B BL JIRL
228
229 5. 訪存讀寫指令::
230
231     LD.B LD.BU LD.H LD.HU LD.W LD.WU LD.D ST.B ST.H ST.W ST.D
232     LDX.B LDX.BU LDX.H LDX.HU LDX.W LDX.WU LDX.D STX.B STX.H STX.W STX.D
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 AMAND.D AMOR.W AMOR.D AMXOR.W AMXOR.D
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) DBCL(DBGCALL) RDTIMEL.W RDTIMEH.W RDTIME.D
249     ASRTLE.D ASRTGT.D
250
251 9. 特權指令::
252
253     CSRRD CSRWR CSRXCHG
254     IOCSRRD.B IOCSRRD.H IOCSRRD.W IOCSRRD.D IOCSRWR.B IOCSRWR.H IOCSRWR.W IOCSRWR.D
255     CACOP TLBP(TLBSRCH) TLBRD TLBWR TLBFILL TLBCLR TLBFLUSH INVTLB LDDIR LDPTE
256
257 虛擬內存
258 ========
259
260 LoongArch可以使用直接映射虛擬內存和分頁映射虛擬內存。
261
262 直接映射虛擬內存通過CSR.DMWn(n=0~3)來進行配置,虛擬地址(VA)和物理地址(PA)
263 之間有簡單的映射關係::
264
265  VA = PA + 固定偏移
266
267 分頁映射的虛擬地址(VA)和物理地址(PA)有任意的映射關係,這種關係記錄在TLB和頁
268 表中。LoongArch的TLB包括一個全相聯的MTLB(Multiple Page Size TLB,多樣頁大小TLB)
269 和一個組相聯的STLB(Single Page Size TLB,單一頁大小TLB)。
270
271 缺省狀態下,LA32的整個虛擬地址空間配置如下:
272
273 ============ =========================== ===========================
274 區段名       地址範圍                    屬性
275 ============ =========================== ===========================
276 ``UVRANGE``  ``0x00000000 - 0x7FFFFFFF`` 分頁映射, 可緩存, PLV0~3
277 ``KPRANGE0`` ``0x80000000 - 0x9FFFFFFF`` 直接映射, 非緩存, PLV0
278 ``KPRANGE1`` ``0xA0000000 - 0xBFFFFFFF`` 直接映射, 可緩存, PLV0
279 ``KVRANGE``  ``0xC0000000 - 0xFFFFFFFF`` 分頁映射, 可緩存, PLV0
280 ============ =========================== ===========================
281
282 用戶態(PLV3)只能訪問UVRANGE,對於直接映射的KPRANGE0和KPRANGE1,將虛擬地址的第
283 30~31位清零就等於物理地址。例如:物理地址0x00001000對應的非緩存直接映射虛擬地址
284 是0x80001000,而其可緩存直接映射虛擬地址是0xA0001000。
285
286 缺省狀態下,LA64的整個虛擬地址空間配置如下:
287
288 ============ ====================== ==================================
289 區段名       地址範圍               屬性
290 ============ ====================== ==================================
291 ``XUVRANGE`` ``0x0000000000000000 - 分頁映射, 可緩存, PLV0~3
292              0x3FFFFFFFFFFFFFFF``
293 ``XSPRANGE`` ``0x4000000000000000 - 直接映射, 可緩存 / 非緩存, PLV0
294              0x7FFFFFFFFFFFFFFF``
295 ``XKPRANGE`` ``0x8000000000000000 - 直接映射, 可緩存 / 非緩存, PLV0
296              0xBFFFFFFFFFFFFFFF``
297 ``XKVRANGE`` ``0xC000000000000000 - 分頁映射, 可緩存, PLV0
298              0xFFFFFFFFFFFFFFFF``
299 ============ ====================== ==================================
300
301 用戶態(PLV3)只能訪問XUVRANGE,對於直接映射的XSPRANGE和XKPRANGE,將虛擬地址的第
302 60~63位清零就等於物理地址,而其緩存屬性是通過虛擬地址的第60~61位配置的(0表示強序
303 非緩存,1表示一致可緩存,2表示弱序非緩存)。
304
305 目前,我們僅用XKPRANGE來進行直接映射,XSPRANGE保留給以後用。
306
307 此處給出一個直接映射的例子:物理地址0x00000000_00001000的強序非緩存直接映射虛擬地址
308 (在XKPRANGE中)是0x80000000_00001000,其一致可緩存直接映射虛擬地址(在XKPRANGE中)
309 是0x90000000_00001000,而其弱序非緩存直接映射虛擬地址(在XKPRANGE中)是0xA0000000_
310 00001000。
311
312 Loongson與LoongArch的關係
313 =========================
314
315 LoongArch是一種RISC指令集架構(ISA),不同於現存的任何一種ISA,而Loongson(即龍
316 芯)是一個處理器家族。龍芯包括三個系列:Loongson-1(龍芯1號)是32位處理器系列,
317 Loongson-2(龍芯2號)是低端64位處理器系列,而Loongson-3(龍芯3號)是高端64位處理
318 器系列。舊的龍芯處理器基於MIPS架構,而新的龍芯處理器基於LoongArch架構。以龍芯3號
319 爲例:龍芯3A1000/3B1500/3A2000/3A3000/3A4000都是兼容MIPS的,而龍芯3A5000(以及將
320 來的型號)都是基於LoongArch的。
321
322 .. _loongarch-references-zh_TW:
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-Documentation/
338
339 LoongArch指令集架構的文檔:
340
341   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-CN.pdf (中文版)
342
343   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-Vol1-v1.02-EN.pdf (英文版)
344
345 LoongArch的ELF psABI文檔:
346
347   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.01-CN.pdf (中文版)
348
349   https://github.com/loongson/LoongArch-Documentation/releases/latest/download/LoongArch-ELF-ABI-v2.01-EN.pdf (英文版)
350
351 Loongson與LoongArch的Linux內核源碼倉庫:
352
353   https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
354