summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/mips/shared/gdbstub/r4600.h
blob: 14c1353a2d153493cabfbce6ec074cb3a984fb47 (plain) (blame)
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 */