Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/include/asm/asm.h
17282 views
1
/*
2
* This file is subject to the terms and conditions of the GNU General Public
3
* License. See the file "COPYING" in the main directory of this archive
4
* for more details.
5
*
6
* Copyright (C) 1995, 1996, 1997, 1999, 2001 by Ralf Baechle
7
* Copyright (C) 1999 by Silicon Graphics, Inc.
8
* Copyright (C) 2001 MIPS Technologies, Inc.
9
* Copyright (C) 2002 Maciej W. Rozycki
10
*
11
* Some useful macros for MIPS assembler code
12
*
13
* Some of the routines below contain useless nops that will be optimized
14
* away by gas in -O mode. These nops are however required to fill delay
15
* slots in noreorder mode.
16
*/
17
#ifndef __ASM_ASM_H
18
#define __ASM_ASM_H
19
20
#include <asm/sgidefs.h>
21
22
#ifndef CAT
23
#ifdef __STDC__
24
#define __CAT(str1, str2) str1##str2
25
#else
26
#define __CAT(str1, str2) str1/**/str2
27
#endif
28
#define CAT(str1, str2) __CAT(str1, str2)
29
#endif
30
31
/*
32
* PIC specific declarations
33
* Not used for the kernel but here seems to be the right place.
34
*/
35
#ifdef __PIC__
36
#define CPRESTORE(register) \
37
.cprestore register
38
#define CPADD(register) \
39
.cpadd register
40
#define CPLOAD(register) \
41
.cpload register
42
#else
43
#define CPRESTORE(register)
44
#define CPADD(register)
45
#define CPLOAD(register)
46
#endif
47
48
/*
49
* LEAF - declare leaf routine
50
*/
51
#define LEAF(symbol) \
52
.globl symbol; \
53
.align 2; \
54
.type symbol, @function; \
55
.ent symbol, 0; \
56
symbol: .frame sp, 0, ra
57
58
/*
59
* NESTED - declare nested routine entry point
60
*/
61
#define NESTED(symbol, framesize, rpc) \
62
.globl symbol; \
63
.align 2; \
64
.type symbol, @function; \
65
.ent symbol, 0; \
66
symbol: .frame sp, framesize, rpc
67
68
/*
69
* END - mark end of function
70
*/
71
#define END(function) \
72
.end function; \
73
.size function, .-function
74
75
/*
76
* EXPORT - export definition of symbol
77
*/
78
#define EXPORT(symbol) \
79
.globl symbol; \
80
symbol:
81
82
/*
83
* FEXPORT - export definition of a function symbol
84
*/
85
#define FEXPORT(symbol) \
86
.globl symbol; \
87
.type symbol, @function; \
88
symbol:
89
90
/*
91
* ABS - export absolute symbol
92
*/
93
#define ABS(symbol,value) \
94
.globl symbol; \
95
symbol = value
96
97
#define PANIC(msg) \
98
.set push; \
99
.set reorder; \
100
PTR_LA a0, 8f; \
101
jal panic; \
102
9: b 9b; \
103
.set pop; \
104
TEXT(msg)
105
106
/*
107
* Print formatted string
108
*/
109
#ifdef CONFIG_PRINTK
110
#define PRINT(string) \
111
.set push; \
112
.set reorder; \
113
PTR_LA a0, 8f; \
114
jal printk; \
115
.set pop; \
116
TEXT(string)
117
#else
118
#define PRINT(string)
119
#endif
120
121
#define TEXT(msg) \
122
.pushsection .data; \
123
8: .asciiz msg; \
124
.popsection;
125
126
/*
127
* Build text tables
128
*/
129
#define TTABLE(string) \
130
.pushsection .text; \
131
.word 1f; \
132
.popsection \
133
.pushsection .data; \
134
1: .asciiz string; \
135
.popsection
136
137
/*
138
* MIPS IV pref instruction.
139
* Use with .set noreorder only!
140
*
141
* MIPS IV implementations are free to treat this as a nop. The R5000
142
* is one of them. So we should have an option not to use this instruction.
143
*/
144
#ifdef CONFIG_CPU_HAS_PREFETCH
145
146
#define PREF(hint,addr) \
147
.set push; \
148
.set mips4; \
149
pref hint, addr; \
150
.set pop
151
152
#define PREFX(hint,addr) \
153
.set push; \
154
.set mips4; \
155
prefx hint, addr; \
156
.set pop
157
158
#else /* !CONFIG_CPU_HAS_PREFETCH */
159
160
#define PREF(hint, addr)
161
#define PREFX(hint, addr)
162
163
#endif /* !CONFIG_CPU_HAS_PREFETCH */
164
165
/*
166
* MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs.
167
*/
168
#if (_MIPS_ISA == _MIPS_ISA_MIPS1)
169
#define MOVN(rd, rs, rt) \
170
.set push; \
171
.set reorder; \
172
beqz rt, 9f; \
173
move rd, rs; \
174
.set pop; \
175
9:
176
#define MOVZ(rd, rs, rt) \
177
.set push; \
178
.set reorder; \
179
bnez rt, 9f; \
180
move rd, rs; \
181
.set pop; \
182
9:
183
#endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */
184
#if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3)
185
#define MOVN(rd, rs, rt) \
186
.set push; \
187
.set noreorder; \
188
bnezl rt, 9f; \
189
move rd, rs; \
190
.set pop; \
191
9:
192
#define MOVZ(rd, rs, rt) \
193
.set push; \
194
.set noreorder; \
195
beqzl rt, 9f; \
196
move rd, rs; \
197
.set pop; \
198
9:
199
#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
200
#if (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
201
(_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
202
#define MOVN(rd, rs, rt) \
203
movn rd, rs, rt
204
#define MOVZ(rd, rs, rt) \
205
movz rd, rs, rt
206
#endif /* MIPS IV, MIPS V, MIPS32 or MIPS64 */
207
208
/*
209
* Stack alignment
210
*/
211
#if (_MIPS_SIM == _MIPS_SIM_ABI32)
212
#define ALSZ 7
213
#define ALMASK ~7
214
#endif
215
#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
216
#define ALSZ 15
217
#define ALMASK ~15
218
#endif
219
220
/*
221
* Macros to handle different pointer/register sizes for 32/64-bit code
222
*/
223
224
/*
225
* Size of a register
226
*/
227
#ifdef __mips64
228
#define SZREG 8
229
#else
230
#define SZREG 4
231
#endif
232
233
/*
234
* Use the following macros in assemblercode to load/store registers,
235
* pointers etc.
236
*/
237
#if (_MIPS_SIM == _MIPS_SIM_ABI32)
238
#define REG_S sw
239
#define REG_L lw
240
#define REG_SUBU subu
241
#define REG_ADDU addu
242
#endif
243
#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
244
#define REG_S sd
245
#define REG_L ld
246
#define REG_SUBU dsubu
247
#define REG_ADDU daddu
248
#endif
249
250
/*
251
* How to add/sub/load/store/shift C int variables.
252
*/
253
#if (_MIPS_SZINT == 32)
254
#define INT_ADD add
255
#define INT_ADDU addu
256
#define INT_ADDI addi
257
#define INT_ADDIU addiu
258
#define INT_SUB sub
259
#define INT_SUBU subu
260
#define INT_L lw
261
#define INT_S sw
262
#define INT_SLL sll
263
#define INT_SLLV sllv
264
#define INT_SRL srl
265
#define INT_SRLV srlv
266
#define INT_SRA sra
267
#define INT_SRAV srav
268
#endif
269
270
#if (_MIPS_SZINT == 64)
271
#define INT_ADD dadd
272
#define INT_ADDU daddu
273
#define INT_ADDI daddi
274
#define INT_ADDIU daddiu
275
#define INT_SUB dsub
276
#define INT_SUBU dsubu
277
#define INT_L ld
278
#define INT_S sd
279
#define INT_SLL dsll
280
#define INT_SLLV dsllv
281
#define INT_SRL dsrl
282
#define INT_SRLV dsrlv
283
#define INT_SRA dsra
284
#define INT_SRAV dsrav
285
#endif
286
287
/*
288
* How to add/sub/load/store/shift C long variables.
289
*/
290
#if (_MIPS_SZLONG == 32)
291
#define LONG_ADD add
292
#define LONG_ADDU addu
293
#define LONG_ADDI addi
294
#define LONG_ADDIU addiu
295
#define LONG_SUB sub
296
#define LONG_SUBU subu
297
#define LONG_L lw
298
#define LONG_S sw
299
#define LONG_SLL sll
300
#define LONG_SLLV sllv
301
#define LONG_SRL srl
302
#define LONG_SRLV srlv
303
#define LONG_SRA sra
304
#define LONG_SRAV srav
305
306
#define LONG .word
307
#define LONGSIZE 4
308
#define LONGMASK 3
309
#define LONGLOG 2
310
#endif
311
312
#if (_MIPS_SZLONG == 64)
313
#define LONG_ADD dadd
314
#define LONG_ADDU daddu
315
#define LONG_ADDI daddi
316
#define LONG_ADDIU daddiu
317
#define LONG_SUB dsub
318
#define LONG_SUBU dsubu
319
#define LONG_L ld
320
#define LONG_S sd
321
#define LONG_SLL dsll
322
#define LONG_SLLV dsllv
323
#define LONG_SRL dsrl
324
#define LONG_SRLV dsrlv
325
#define LONG_SRA dsra
326
#define LONG_SRAV dsrav
327
328
#define LONG .dword
329
#define LONGSIZE 8
330
#define LONGMASK 7
331
#define LONGLOG 3
332
#endif
333
334
/*
335
* How to add/sub/load/store/shift pointers.
336
*/
337
#if (_MIPS_SZPTR == 32)
338
#define PTR_ADD add
339
#define PTR_ADDU addu
340
#define PTR_ADDI addi
341
#define PTR_ADDIU addiu
342
#define PTR_SUB sub
343
#define PTR_SUBU subu
344
#define PTR_L lw
345
#define PTR_S sw
346
#define PTR_LA la
347
#define PTR_LI li
348
#define PTR_SLL sll
349
#define PTR_SLLV sllv
350
#define PTR_SRL srl
351
#define PTR_SRLV srlv
352
#define PTR_SRA sra
353
#define PTR_SRAV srav
354
355
#define PTR_SCALESHIFT 2
356
357
#define PTR .word
358
#define PTRSIZE 4
359
#define PTRLOG 2
360
#endif
361
362
#if (_MIPS_SZPTR == 64)
363
#define PTR_ADD dadd
364
#define PTR_ADDU daddu
365
#define PTR_ADDI daddi
366
#define PTR_ADDIU daddiu
367
#define PTR_SUB dsub
368
#define PTR_SUBU dsubu
369
#define PTR_L ld
370
#define PTR_S sd
371
#define PTR_LA dla
372
#define PTR_LI dli
373
#define PTR_SLL dsll
374
#define PTR_SLLV dsllv
375
#define PTR_SRL dsrl
376
#define PTR_SRLV dsrlv
377
#define PTR_SRA dsra
378
#define PTR_SRAV dsrav
379
380
#define PTR_SCALESHIFT 3
381
382
#define PTR .dword
383
#define PTRSIZE 8
384
#define PTRLOG 3
385
#endif
386
387
/*
388
* Some cp0 registers were extended to 64bit for MIPS III.
389
*/
390
#if (_MIPS_SIM == _MIPS_SIM_ABI32)
391
#define MFC0 mfc0
392
#define MTC0 mtc0
393
#endif
394
#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
395
#define MFC0 dmfc0
396
#define MTC0 dmtc0
397
#endif
398
399
#define SSNOP sll zero, zero, 1
400
401
#ifdef CONFIG_SGI_IP28
402
/* Inhibit speculative stores to volatile (e.g.DMA) or invalid addresses. */
403
#include <asm/cacheops.h>
404
#define R10KCBARRIER(addr) cache Cache_Barrier, addr;
405
#else
406
#define R10KCBARRIER(addr)
407
#endif
408
409
#endif /* __ASM_ASM_H */
410
411