libdragon
Loading...
Searching...
No Matches
cop0.h
Go to the documentation of this file.
1
13#ifndef __LIBDRAGON_COP0_H
14#define __LIBDRAGON_COP0_H
15
16#include <stdint.h>
17
19#define C0_COUNT() ({ \
20 uint32_t x; \
21 asm volatile("mfc0 %0,$9":"=r"(x)); \
22 x; \
23})
24
26#define C0_WRITE_COUNT(x) ({ \
27 asm volatile("mtc0 %0,$9"::"r"(x)); \
28})
29
30
32#define C0_COMPARE() ({ \
33 uint32_t x; \
34 asm volatile("mfc0 %0,$11":"=r"(x)); \
35 x; \
36})
37
39#define C0_WRITE_COMPARE(x) ({ \
40 asm volatile("mtc0 %0,$11"::"r"(x)); \
41})
42
43
45#define C0_STATUS() ({ \
46 uint32_t x; \
47 asm volatile("mfc0 %0,$12":"=r"(x)); \
48 x; \
49})
50
52#define C0_WRITE_STATUS(x) ({ \
53 asm volatile("mtc0 %0,$12"::"r"(x)); \
54})
55
65#define C0_CAUSE() ({ \
66 uint32_t x; \
67 asm volatile("mfc0 %0,$13" : "=r" (x) : ); \
68 x; \
69})
70
76#define C0_WRITE_CAUSE(x) ({ \
77 asm volatile("mtc0 %0,$13"::"r"(x)); \
78})
79
81/* Alternative version with different naming */
82#define C0_CR() C0_CAUSE()
83#define C0_WRITE_CR(x) C0_WRITE_CAUSE(x)
93#define C0_BADVADDR() ({ \
94 uint64_t x; \
95 asm volatile("dmfc0 %0,$8" : "=r" (x) : ); \
96 x; \
97})
98
109#define C0_EPC() ({ \
110 uint32_t x; \
111 asm volatile("mfc0 %0,$14" : "=r" (x) : ); \
112 x; \
113})
114
121#define C0_INDEX() ({ \
122 uint32_t x; \
123 asm volatile("mfc0 %0,$0":"=r"(x)); \
124 x; \
125})
126
133#define C0_WRITE_INDEX(x) asm volatile("mtc0 %0,$0; nop; nop"::"r"(x))
134
135
142#define C0_ENTRYHI() ({ \
143 uint32_t x; \
144 asm volatile("mfc0 %0,$10":"=r"(x)); \
145 x; \
146})
147
153#define C0_WRITE_ENTRYHI(x) asm volatile("mtc0 %0,$10; nop; nop"::"r"(x))
154
161#define C0_ENTRYLO0() ({ \
162 uint32_t x; \
163 asm volatile("mfc0 %0,$2":"=r"(x)); \
164 x; \
165})
166
173#define C0_WRITE_ENTRYLO0(x) asm volatile("mtc0 %0,$2; nop; nop"::"r"(x))
174
181#define C0_ENTRYLO1() ({ \
182 uint32_t x; \
183 asm volatile("mfc0 %0,$3":"=r"(x)); \
184 x; \
185})
186
193#define C0_WRITE_ENTRYLO1(x) asm volatile("mtc0 %0,$3; nop; nop"::"r"(x))
194
195
202#define C0_PAGEMASK() ({ \
203 uint32_t x; \
204 asm volatile("mfc0 %0,$5":"=r"(x)); \
205 x; \
206})
207
214#define C0_WRITE_PAGEMASK(x) asm volatile("mtc0 %0,$5; nop; nop"::"r"(x))
215
216
224#define C0_WIRED() ({ \
225 uint32_t x; \
226 asm volatile("mfc0 %0,$6":"=r"(x)); \
227 x; \
228})
229
236#define C0_WATCHLO() ({ \
237 uint32_t x; \
238 asm volatile("mfc0 %0,$18":"=r"(x)); \
239 x; \
240})
241
248#define C0_WRITE_WATCHLO(x) asm volatile("mtc0 %0,$18"::"r"(x))
249
257#define C0_WRITE_WIRED(x) asm volatile("mtc0 %0,$6; nop; nop"::"r"(x))
258
260/* Deprecated version of macros with wrong naming that include "READ" */
261#define C0_READ_CR() C0_CAUSE()
262#define C0_READ_EPC() C0_EPC()
263#define C0_READ_BADVADDR() C0_BADVADDR()
266/* COP0 Status bits definition. Please refer to MIPS R4300 manual. */
267#define C0_STATUS_IE 0x00000001
268#define C0_STATUS_EXL 0x00000002
269#define C0_STATUS_ERL 0x00000004
270
271/* COP0 Cause bits definition. Please refer to MIPS R4300 manual. */
272#define C0_CAUSE_BD 0x80000000
273#define C0_CAUSE_CE 0x30000000
274#define C0_CAUSE_EXC_CODE 0x0000007C
275
276/* COP0 interrupt bits definition. These are compatible bothwith mask and pending bits. */
277#define C0_INTERRUPT_0 0x00000100
278#define C0_INTERRUPT_1 0x00000200
279#define C0_INTERRUPT_2 0x00000400
280#define C0_INTERRUPT_3 0x00000800
281#define C0_INTERRUPT_4 0x00001000
282#define C0_INTERRUPT_5 0x00002000
283#define C0_INTERRUPT_6 0x00004000
284#define C0_INTERRUPT_7 0x00008000
285
286#define C0_INTERRUPT_RCP C0_INTERRUPT_2
287#define C0_INTERRUPT_CART C0_INTERRUPT_3
288#define C0_INTERRUPT_PRENMI C0_INTERRUPT_4
289#define C0_INTERRUPT_TIMER C0_INTERRUPT_7
290
297#define C0_GET_CAUSE_CE(cr) (((cr) & C0_CAUSE_CE) >> 28)
298
302#define C0_GET_CAUSE_EXC_CODE(sr) (((sr) & C0_CAUSE_EXC_CODE) >> 2)
303
304/* Flag bits valid for COP0 ENTRYLO0/ENTRYLO1 registers */
305#define C0_ENTRYLO_GLOBAL (1<<0)
306#define C0_ENTRYLO_VALID (1<<1)
307#define C0_ENTRYLO_DIRTY (1<<2)
308
309/* Flag bits valid for COP0 INDEX register */
310#define C0_INDEX_PROBE_FAILED (1<<31)
311
312
319#define C0_TLBWI() asm volatile("tlbwi; nop; nop; nop; nop")
320
328#define C0_TLBWR() asm volatile("tlbwr; nop; nop; nop; nop")
329
337#define C0_TLBR() asm volatile("tlbr; nop; nop; nop; nop")
338
347#define C0_TLBP() asm volatile("tlbp; nop; nop; nop; nop")
348
351#endif