1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
|
/*
* r4600.h - register and address space definitions for the R4600 processor
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* The following software is offered for use in the public domain.
* There is no warranty with regard to this software or its performance
* and the user must accept the software "AS IS" with all faults.
*
* THE CONTRIBUTORS DISCLAIM ANY WARRANTIES, EXPRESS OR IMPLIED, WITH
* REGARD TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _R4600_H
#define _R4600_H
/*
* R4600 general registers
*/
#define zero $0
#define at $1 /* assembler temporary */
#define v0 $2 /* value holders */
#define v1 $3
#define a0 $4 /* arguments */
#define a1 $5
#define a2 $6
#define a3 $7
#define t0 $8 /* temporaries */
#define t1 $9
#define t2 $10
#define t3 $11
#define t4 $12
#define t5 $13
#define t6 $14
#define t7 $15
#define s0 $16 /* saved registers */
#define s1 $17
#define s2 $18
#define s3 $19
#define s4 $20
#define s5 $21
#define s6 $22
#define s7 $23
#define t8 $24 /* temporaries */
#define t9 $25
#define k0 $26 /* kernel registers */
#define k1 $27
#define gp $28 /* global pointer */
#define sp $29 /* stack pointer */
#define s8 $30 /* saved register */
#define fp $30 /* frame pointer (obsolete usage) */
#define ra $31 /* return address */
/*
* Kernel address space definitions (32 bit/64 bit compatibility spaces)
*/
#define K0BASE 0x80000000
#define K0SIZE 0x20000000
#define K1BASE 0xa0000000
#define K1SIZE 0x20000000
#define PHYS_TO_K0(pa) ((pa)|K0BASE)
#define PHYS_TO_K1(pa) ((pa)|K1BASE)
#define K0_TO_PHYS(va) ((va)&(K0SIZE-1))
#define K1_TO_PHYS(va) ((va)&(K1SIZE-1))
#define K0_TO_K1(va) ((va)|K1SIZE)
#define K1_TO_K0(va) ((va)&~K1SIZE)
/*
* System Control Coprocessor (CP0) memory-management registers
*/
#define C0_INDEX $0 /* TLB Index */
#define C0_RANDOM $1 /* TLB Random */
#define C0_ENTRYLO0 $2 /* TLB EntryLo0 */
#define C0_ENTRYLO1 $3 /* TLB EntryLo1 */
#define C0_PAGEMASK $5 /* TLB PageMask */
#define C0_WIRED $6 /* TLB Wired */
#define C0_ENTRYHI $10 /* TLB EntryHi */
#define C0_PRID $15 /* Processor Revision Indentifier */
#define C0_CONFIG $16 /* Config */
#define C0_LLADDR $17 /* LLAddr */
#define C0_TAGLO $28 /* TagLo */
#define C0_TAGHI $29 /* TagHi (always zero on the R4600) */
/* EntryHi register fields */
#define EH_REGION_MASK 0xc000000000000000 /* 11=krnl, 01=supv, 00=user */
#define EH_REGION_SHIFT 62
#define EH_FILL_MASK 0x3fffff0000000000 /* (holds replica of bit 63) */
#define EH_FILL_SHIFT 40
#define EH_VPN2_MASK 0x000000ffffffe000 /* Virtual pageno div 2 */
#define EH_VPN2_SHIFT 13
#define EH_ASID_MASK 0x00000000000000ff /* Address space ID */
#define EH_ASID_SHIFT 0
/* EntryLo register fields */
#define EL_PFN_MASK 0x000000003fffffc0 /* Page Frame Number */
#define EL_PFN_SHIFT 6
#define EL_C_MASK 0x0000000000000038 /* Cacheability attributes */
#define EL_C_SHIFT 3
#define EL_D_MASK 0x0000000000000004 /* Dirty bit */
#define EL_D_SHIFT 2
#define EL_V_MASK 0x0000000000000002 /* Valid bit */
#define EL_V_SHIFT 1
#define EL_G_MASK 0x0000000000000001 /* Global bit */
#define EL_G_SHIFT 0
/* PageMask register fields */
#define PM_MASK 0x01ffe000 /* Page size mask: */
#define PM_M_4K 0x00000000 /* 4K bytes */
#define PM_M_16K 0x00006000 /* 16K bytes */
#define PM_M_64K 0x0001e000 /* 64K bytes */
#define PM_M_256K 0x0007e000 /* 256K bytes */
#define PM_M_1M 0x001fe000 /* 1M bytes */
#define PM_M_4M 0x007fe000 /* 4M bytes */
#define PM_M_16M 0x01ffe000 /* 16M bytes */
/* Index register fields */
#define IR_P_MASK 0x80000000 /* TLB Probe (TLBP) failure */
#define IR_INDEX_MASK 0x0000003f /* Index of TLB entry for TLBR/TLBWI */
/* Random register */
#define RR_INDEX_MASK 0x0000003f /* Index of TLB entry for TLBWR */
#define NTLBENTRIES 48 /* Max TLB index is one less */
/* Wired register */
#define WR_INDEX_MASK 0x0000003f /* Number of wired TLB entries */
/* PrID register fields */
#define PRID_IMP_MASK (0xff<<8) /* Implementation number */
#define PRID_REV_MASK (0xff<<0) /* Revision number */
/* Config register fields (read only except for K0 cacheability attributes) */
#define CFG_ECMASK 0x70000000 /* System Clock Ratio: */
#define CFG_ECBY2 0x00000000 /* processor clock divided by 2 */
#define CFG_ECBY3 0x10000000 /* processor clock divided by 3 */
#define CFG_ECBY4 0x20000000 /* processor clock divided by 4 */
#define CFG_ECBY5 0x30000000 /* processor clock divided by 5 */
#define CFG_ECBY6 0x40000000 /* processor clock divided by 6 */
#define CFG_ECBY7 0x50000000 /* processor clock divided by 7 */
#define CFG_ECBY8 0x60000000 /* processor clock divided by 8 */
#define CFG_EC_RESERVED 0x70000000 /* (reserved) */
#define CFG_EPMASK 0x0f000000 /* Writeback pattern: */
#define CFG_EPD 0x00000000 /* DDDD (one dword every cycle) */
#define CFG_EPDDx 0x01000000 /* DDxDDx (2 dword/3 cyc) */
#define CFG_EPDDxx 0x02000000 /* DDxDDx (2 dword/4 cyc) */
#define CFG_EPDxDx 0x03000000 /* DxDxDxDx (2 dword/4 cyc) */
#define CFG_EPDDxxx 0x04000000 /* DDxxxDDxxx (2 dword/5 cyc) */
#define CFG_EPDDxxxx 0x05000000 /* DDxxxxDDxxxx (2 dword/6 cyc) */
#define CFG_EPDxxDxx 0x06000000 /* DxxDxxDxxDxx (2 dword/6 cyc) */
#define CFG_EPDDxxxxx 0x07000000 /* DDxxxxxDDxxxxx (2 dword/7 cyc) */
#define CFG_EPDDxxxxxx 0x08000000 /* DDxxxxxxDDxxxxxx (2 dword/8 cyc) */
#define CFG_BEMASK 0x00008000 /* Big Endian */
#define CFG_EMMASK 0x00004000 /* set to 1 => Parity mode enabled */
#define CFG_EBMASK 0x00002000 /* set to 1 => Sub-block ordering */
#define CFG_ICMASK 0x00000e00 /* I-cache size = 2**(12+IC) bytes */
#define CFG_ICSHIFT 9
#define CFG_DCMASK 0x000001c0 /* D-cache size = 2**(12+DC) bytes */
#define CFG_DCSHIFT 6
#define CFG_IBMASK 0x00000020 /* set to 1 => 32 byte I-cache line */
#define CFG_DBMASK 0x00000010 /* set to 1 => 32 byte D-cache line */
#define CFG_K0C_MASK 0x00000007 /* KSEG0 cacheability attributes: */
#define CFG_C_WTNOALLOC 0 /* write thru, no write allocate */
#define CFG_C_WTALLOC 1 /* write thru, write allocate */
#define CFG_C_UNCACHED 2 /* uncached */
#define CFG_C_WRITEBACK 3 /* writeback, non-coherent */
/* Primary Cache TagLo */
#define TAG_PTAG_MASK 0xffffff00 /* P-Cache Tag (Addr 35:12) */
#define TAG_PTAG_SHIFT 8
#define TAG_PSTATE_MASK 0x000000c0 /* P-Cache State */
#define TAG_PSTATE_SHIFT 6
#define TAG_FIFO_BIT_MASK 0x00000002 /* P-Cache FIFO bit */
#define TAG_FIFO_BIT_SHIFT 1
#define TAG_PARITY_MASK 0x00000001 /* P-Cache Tag Parity */
#define TAG_PARITY_SHIFT 0
#define PSTATE_INVAL 0 /* Invalid */
#define PSTATE_SHARED 1 /* Should not occur */
#define PSTATE_CLEAN_EXCL 2 /* Should not occur */
#define PSTATE_DIRTY_EXCL 3 /* Dirty exclusive */
/*
* System Control Coprocessor (CP0) exception processing registers
*/
#define C0_CONTEXT $4 /* Context */
#define C0_BADVADDR $8 /* Bad Virtual Address */
#define C0_COUNT $9 /* Count */
#define C0_COMPARE $11 /* Compare */
#define C0_STATUS $12 /* Processor Status */
#define C0_CAUSE $13 /* Exception Cause */
#define C0_EPC $14 /* Exception PC */
#define C0_XCONTEXT $20 /* XContext */
#define C0_ECC $26 /* ECC */
#define C0_CACHEERR $27 /* CacheErr */
#define C0_ERROREPC $30 /* ErrorEPC */
/* Status register fields */
#define SR_CUMASK 0xf0000000 /* Coprocessor usable bits */
#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
#define SR_CU2 0x40000000 /* coprocessor 2 usable */
#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
#define SR_FR 0x04000000 /* Enable 32 floating-point registers */
#define SR_RE 0x02000000 /* Reverse Endian in user mode */
#define SR_BEV 0x00400000 /* Bootstrap Exception Vector */
#define SR_TS 0x00200000 /* TLB shutdown (reserved on R4600) */
#define SR_SR 0x00100000 /* Soft Reset */
#define SR_CH 0x00040000 /* Cache Hit */
#define SR_CE 0x00020000 /* ECC register modifies check bits */
#define SR_DE 0x00010000 /* Disable cache errors */
#define SR_IMASK 0x0000ff00 /* Interrupt Mask */
#define SR_IMASK8 0x00000000 /* Interrupt Mask level=8 */
#define SR_IMASK7 0x00008000 /* Interrupt Mask level=7 */
#define SR_IMASK6 0x0000c000 /* Interrupt Mask level=6 */
#define SR_IMASK5 0x0000e000 /* Interrupt Mask level=5 */
#define SR_IMASK4 0x0000f000 /* Interrupt Mask level=4 */
#define SR_IMASK3 0x0000f800 /* Interrupt Mask level=3 */
#define SR_IMASK2 0x0000fc00 /* Interrupt Mask level=2 */
#define SR_IMASK1 0x0000fe00 /* Interrupt Mask level=1 */
#define SR_IMASK0 0x0000ff00 /* Interrupt Mask level=0 */
#define SR_IBIT8 0x00008000 /* (Intr5) */
#define SR_IBIT7 0x00004000 /* (Intr4) */
#define SR_IBIT6 0x00002000 /* (Intr3) */
#define SR_IBIT5 0x00001000 /* (Intr2) */
#define SR_IBIT4 0x00000800 /* (Intr1) */
#define SR_IBIT3 0x00000400 /* (Intr0) */
#define SR_IBIT2 0x00000200 /* (Software Interrupt 1) */
#define SR_IBIT1 0x00000100 /* (Software Interrupt 0) */
#define SR_KX 0x00000080 /* xtlb in kernel mode */
#define SR_SX 0x00000040 /* mips3 & xtlb in supervisor mode */
#define SR_UX 0x00000020 /* mips3 & xtlb in user mode */
#define SR_KSU_MASK 0x00000018 /* ksu mode mask */
#define SR_KSU_USER 0x00000010 /* user mode */
#define SR_KSU_SUPV 0x00000008 /* supervisor mode */
#define SR_KSU_KERN 0x00000000 /* kernel mode */
#define SR_ERL 0x00000004 /* error level */
#define SR_EXL 0x00000002 /* exception level */
#define SR_IE 0x00000001 /* interrupt enable */
/* Cause register fields */
#define CAUSE_BD 0x80000000 /* Branch Delay */
#define CAUSE_CEMASK 0x30000000 /* Coprocessor Error */
#define CAUSE_CESHIFT 28 /* Right justify CE */
#define CAUSE_IPMASK 0x0000ff00 /* Interrupt Pending */
#define CAUSE_IPSHIFT 8 /* Right justify IP */
#define CAUSE_IP8 0x00008000 /* (Intr5) */
#define CAUSE_IP7 0x00004000 /* (Intr4) */
#define CAUSE_IP6 0x00002000 /* (Intr3) */
#define CAUSE_IP5 0x00001000 /* (Intr2) */
#define CAUSE_IP4 0x00000800 /* (Intr1) */
#define CAUSE_IP3 0x00000400 /* (Intr0) */
#define CAUSE_SW2 0x00000200 /* (Software Interrupt 1) */
#define CAUSE_SW1 0x00000100 /* (Software Interrupt 0) */
#define CAUSE_EXCMASK 0x0000007c /* Exception Code */
#define CAUSE_EXCSHIFT 2 /* Right justify EXC */
/* Exception Codes */
#define EXC_INT 0 /* External interrupt */
#define EXC_MOD 1 /* TLB modification exception */
#define EXC_TLBL 2 /* TLB miss (Load or Ifetch) */
#define EXC_TLBS 3 /* TLB miss (Store) */
#define EXC_ADEL 4 /* Address error (Load or Ifetch) */
#define EXC_ADES 5 /* Address error (Store) */
#define EXC_IBE 6 /* Bus error (Ifetch) */
#define EXC_DBE 7 /* Bus error (data load or store) */
#define EXC_SYS 8 /* System call */
#define EXC_BP 9 /* Break point */
#define EXC_RI 10 /* Reserved instruction */
#define EXC_CPU 11 /* Coprocessor unusable */
#define EXC_OVF 12 /* Arithmetic overflow */
#define EXC_TRAP 13 /* Trap exception */
#define EXC_FPE 15 /* Floating Point Exception */
/* CacheErr register */
#define CACHEERR_TYPE 0x80000000 /* reference type:
0=Instr, 1=Data */
#define CACHEERR_LEVEL 0x40000000 /* cache level:
0=Primary, 1=Secondary */
#define CACHEERR_DATA 0x20000000 /* data field:
0=No error, 1=Error */
#define CACHEERR_TAG 0x10000000 /* tag field:
0=No error, 1=Error */
#define CACHEERR_REQ 0x08000000 /* request type:
0=Internal, 1=External */
#define CACHEERR_BUS 0x04000000 /* error on bus:
0=No, 1=Yes */
#define CACHEERR_BOTH 0x02000000 /* Data & Instruction error:
0=No, 1=Yes */
#define CACHEERR_REFILL 0x01000000 /* Error on Refill:
0=No, 1=Yes */
#define CACHEERR_SIDX_MASK 0x003ffff8 /* PADDR(21..3) */
#define CACHEERR_SIDX_SHIFT 0
#define CACHEERR_PIDX_MASK 0x00000007 /* VADDR(14..12) */
#define CACHEERR_PIDX_SHIFT 12
/*
* R4600 Cache operations
*/
#define Index_Invalidate_I 0x0 /* 0 0 */
#define Index_Writeback_Inv_D 0x1 /* 0 1 */
#define Index_Load_Tag_I 0x4 /* 1 0 */
#define Index_Load_Tag_D 0x5 /* 1 1 */
#define Index_Store_Tag_I 0x8 /* 2 0 */
#define Index_Store_Tag_D 0x9 /* 2 1 */
#define Create_Dirty_Exc_D 0xD /* 3 1 */
#define Hit_Invalidate_I 0x10 /* 4 0 */
#define Hit_Invalidate_D 0x11 /* 4 1 */
#define Fill_I 0x14 /* 5 0 */
#define Hit_Writeback_Inv_D 0x15 /* 5 1 */
#define Hit_Writeback_I 0x18 /* 6 0 */
#define Hit_Writeback_D 0x19 /* 6 1 */
/*
* Floating Point Coprocessor (CP1) registers
*/
#define C1_IRR $0 /* Implementation/Revision register */
#define C1_CSR $31 /* FPU Control/Status register */
/* Implementation/Revision reg fields */
#define IRR_IMP_MASK (0xff<<8) /* Implementation number */
#define IRR_REV_MASK (0xff<<0) /* Revision number */
/* FPU Control/Status register fields */
#define CSR_FS 0x01000000 /* Set to flush denormals to zero */
#define CSR_C 0x00800000 /* Condition bit (set by FP compare) */
#define CSR_CMASK (0x3f<<12)
#define CSR_CE 0x00020000
#define CSR_CV 0x00010000
#define CSR_CZ 0x00008000
#define CSR_CO 0x00004000
#define CSR_CU 0x00002000
#define CSR_CI 0x00001000
#define CSR_EMASK (0x1f<<7)
#define CSR_EV 0x00000800
#define CSR_EZ 0x00000400
#define CSR_EO 0x00000200
#define CSR_EU 0x00000100
#define CSR_EI 0x00000080
#define CSR_FMASK (0x1f<<2)
#define CSR_FV 0x00000040
#define CSR_FZ 0x00000020
#define CSR_FO 0x00000010
#define CSR_FU 0x00000008
#define CSR_FI 0x00000004
#define CSR_RMODE_MASK (0x3<<0)
#define CSR_RM 0x00000003
#define CSR_RP 0x00000002
#define CSR_RZ 0x00000001
#define CSR_RN 0x00000000
#endif /* _R4600_H */
|