summaryrefslogtreecommitdiffstats
path: root/public/sdk/inc/kxmips.h
blob: 352d9be07c044e0c047f9ede01cff61a6abdbaf1 (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
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
/*++ BUILD Version: 0003    // Increment this if a change has global effects
*/
//*++
//
// Copyright (c) 1990-1996  Microsoft Corporation
//
// Module Name:
//
//  kxmips.h
//
// Abstract:
//
//  This module contains the nongenerated part of the MIPS assembler
//  header file. In general, it contains processor architecture constant
//  information, however some assembler macros are also included.
//
// Author:
//
//  David N. Cutler (davec) 23-Mar-1990
//
// Revision History:
//
//--*/

//
// Define soft reset vector address for nonhandled cache parity errors.
//

#define SOFT_RESET_VECTOR 0xbfc00300    // default parity error routine address

//
// Define low memory transfer vector address and TB index address (temporary).
//

#define TRANSFER_VECTOR (KSEG1_BASE + 0x400) // exception handler address

//
// Define standard integer registers.
//

#define zero $0                         // read zero, writes ignored
#define AT $1                           // assembler temporary
#define v0 $2                           // return value
#define v1 $3                           //
#define a0 $4                           // argument registers
#define a1 $5                           //
#define a2 $6                           //
#define a3 $7                           //
#define t0 $8                           // caller saved registers
#define t1 $9                           //
#define t2 $10                          //
#define t3 $11                          //
#define t4 $12                          //
#define t5 $13                          //
#define t6 $14                          //
#define t7 $15                          //
#define s0 $16                          // callee 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                          // caller saved registers
#define t9 $25                          //
#define k0 $26                          // kernel reserved registers
#define k1 $27                          //
#define gp $28                          // global pointer
#define sp $29                          // stack pointer
#define s8 $30                          // callee saved register
#define ra $31                          // return address register

//
// Define standard floating point registers.
//

#define f0 $f0                          // caller saved registers
#define f1 $f1                          //
#define f2 $f2                          //
#define f3 $f3                          //
#define f4 $f4                          //
#define f5 $f5                          //
#define f6 $f6                          //
#define f7 $f7                          //
#define f8 $f8                          //
#define f9 $f9                          //
#define f10 $f10                        //
#define f11 $f11                        //
#define f12 $f12                        //
#define f13 $f13                        //
#define f14 $f14                        //
#define f15 $f15                        //
#define f16 $f16                        //
#define f17 $f17                        //
#define f18 $f18                        //
#define f19 $f19                        //
#define f20 $f20                        // callee saved registers
#define f21 $f21                        //
#define f22 $f22                        //
#define f23 $f23                        //
#define f24 $f24                        //
#define f25 $f25                        //
#define f26 $f26                        //
#define f27 $f27                        //
#define f28 $f28                        //
#define f29 $f29                        //
#define f30 $f30                        //
#define f31 $f31                        //

//
// Define R4000/R10000 system coprocessor registers.
//

#define index $0                        // TB index register
#define random $1                       // TB random register
#define entrylo0 $2                     // TB entry low 0 register
#define entrylo1 $3                     // TB entry low 1 register
#define context $4                      // TB context register
#define pagemask $5                     // Page mask register
#define wired $6                        // Wired TB entries register
#define badvaddr $8                     // TB bad virtual address register
#define count $9                        // Timer count register
#define entryhi $10                     // TB entry high register
#define compare $11                     // Timer compare register
#define psr $12                         // Processor status register
#define cause $13                       // Exception cause register
#define epc $14                         // Exception PC register
#define prid $15                        // Processor id register
#define config $16                      // Configuration register
#define lladdr $17                      // Load linked address register
#define watchlo $18                     // Watch low address register
#define watchhi $19                     // Watch high address register
#define xcontext $20                    // extended context register
#define framemask $21                   // Frame mask register
#define ecc $26                         // S-cache ECC and primary parity register
#define cacheerr $27                    // Cache error and status register
#define taglo $28                       // Cache tag low register
#define taghi $29                       // Cache tag high register
#define errorepc $30                    // Error exception PC register

//
// Define R4000 system coprocessor register bit field offsets.
//

#define INDEX_INDEX 0x0                 // TLB specified index <5:0>
#define INDEX_PROBE 0x1f                // TLB probe failure <31>

#define RANDOM_INDEX 0x0                // TLB random index <5:0>

#define ENTRYLO_G 0x0                   // Global <0>
#define ENTRYLO_V 0x1                   // Valid <1>
#define ENTRYLO_D 0x2                   // Dirty <2>
#define ENTRYLO_C 0x3                   // Cache control <5:3>
#define ENTRYLO_PFN 0x6                 // Page Frame <29:6>

#define PAGEMASK_PAGEMASK 0xd           // Page mask <24:13>

#define WIRED_NUMBER 0x0                // Wired entries <5:0>

#define ENTRYHI_PID 0x0                 // Process id <7:0>
#define ENTRYHI_VPN2 0xd                // Virtual page <31:13>

#define PID_MASK 0xfff                  // allow for ample expansion

#define PSR_IE 0x0                      // Interrupt enable <0>
#define PSR_EXL 0x1                     // Exception level <1>
#define PSR_ERL 0x2                     // Error level <2>
#define PSR_KSU 0x3                     // Kernel/supervisor/user <4:3>
#define PSR_PMODE (PSR_KSU + 1)         // Previous mode bit <4>
#define PSR_UX 0x5                      // User extended <5>
#define PSR_SX 0x6                      // Supervior extended <6>
#define PSR_KX 0x7                      // Kernel extended <7>
#define PSR_INTMASK 0x8                 // Interrupt mask <15:8>
#define PSR_DE 0x10                     // Disable cache parity and ECC <16>
#define PSR_CE 0x11                     // Check enable <17>
#define PSR_CH 0x12                     // Cache hit <18>
#define PSR_SR 0x14                     // Soft reset <20>
#define PSR_TS 0x15                     // TLB shutdown <21>
#define PSR_BEV 0x16                    // Bootstrap exception vector <22>
#define PSR_CU0 0x1c                    // Coprocessor 0 enabled <28>
#define PSR_CU1 0x1d                    // Coprocessor 1 enabled <29>
#define PSR_CU2 0x1e                    // Coprocessor 2 enabled <30>
#define PSR_CU3 0x1f                    // Coprocessor 3 enabled <31>

#define CONFIG_K0 0x0                   // Kseg0 cache algorithm <2:0>
#define CONFIG_CU 0x3                   // Update on store conditional <3>
#define CONFIG_DB 0x4                   // Data cache block size <4>
#define CONFIG_IB 0x5                   // Instruction cache block size <5>
#define CONFIG_DC 0x6                   // Data cache size <8:6>
#define CONFIG_IC 0x9                   // Instruction cache size <11:9>
#define CONFIG_EB 0xd                   // Block ordering <13>
#define CONFIG_EM 0xe                   // ECC mode enable <14>
#define CONFIG_BE 0xf                   // Big endian memory <15>
#define CONFIG_SM 0x10                  // Use dirty shared state <16>
#define CONFIG_SC 0x11                  // Secondary cache present <17>
#define CONFIG_EW 0x12                  // System address port width <19:18>
#define CONFIG_SW 0x14                  // Secondary cache port width <20>
#define CONFIG_SS 0x15                  // Split secondary cache mode <21>
#define CONFIG_SB 0x16                  // Secondary cache block size <23:22>
#define CONFIG_EP 0x18                  // Pattern for write back data <27:24>
#define CONFIG_EC 0x1c                  // System address port clock ratio <30:28>
#define CONFIG_CM 0x1f                  // Master checker mode <31>

#define ECC_ECC 0x0                     // Secondary cache ECC <7:0>

#define CACHEERR_PIDX 0x0               // Primary cache index <2:0>
#define CACHEERR_SIDX 0x3               // Secondary cache index <21:3>
#define CACHEERR_EI 0x18                // ECC error on pimary store miss <24>
#define CACHEERR_EB 0x19                // Data error on instrruction error <25>
#define CACHEERR_EE 0x1a                // Error on system address bus <26>
#define CACHEERR_ES 0x1b                // Error accessing processor state <27>
#define CACHEERR_ET 0x1c                // Error on tag field <28>
#define CACHEERR_ED 0x1d                // Error on data field <29>
#define CACHEERR_EC 0x1e                // Cache level of error <30>
#define CACHEERR_ER 0x1f                // Type of reference <31>

#define TAGLO_P 0x0                     // primary tag even parity <0>
#define TAGLO_PSTATE 0x6                // primary cache state <7:6>
#define TAGLO_PTAGLO 0x8                // primary tag low physical address <31:8>

//
// Define R4000 cause register bit offsets.
//

#define CAUSE_XCODE 0x2                 // Exception code <6:2>
#define CAUSE_INTPEND 0x8               // Interrupt pending <15:8>
#define CAUSE_CE 0x1c                   // Coprocessor unusable <29:28>
#define CAUSE_BD 0x1f                   // Branch delay slot <31>

//
// Define R4000 processor id register field offsets.
//

#define PRID_REV 0x0                    // Revision level <7:0>
#define PRID_IMP 0x8                    // Implementation type <15:8>

//
// Define R4000 exception codes.
//

#define XCODE_INTERRUPT 0x0             // Interrupt
#define XCODE_MODIFY 0x4                // TLB modify
#define XCODE_READ_MISS 0x8             // TLB read miss
#define XCODE_WRITE_MISS 0xc            // TLB write miss
#define XCODE_READ_ADDRESS_ERROR 0x10   // Read alignment error
#define XCODE_WRITE_ADDRESS_ERROR 0x14  // Write alignment error
#define XCODE_INSTRUCTION_BUS_ERROR 0x18 // Instruction bus error
#define XCODE_DATA_BUS_ERROR 0x1c       // Data bus error
#define XCODE_SYSTEM_CALL 0x20          // System call
#define XCODE_BREAKPOINT 0x24           // Breakpoint
#define XCODE_ILLEGAL_INSTRUCTION 0x28  // Illegal instruction
#define XCODE_COPROCESSOR_UNUSABLE 0x2c // Coprocessor unusable
#define XCODE_INTEGER_OVERFLOW 0x30     // Arithmetic overflow
#define XCODE_TRAP 0x34                 // Trap instruction
#define XCODE_VIRTUAL_INSTRUCTION 0x38  // Virtual instruction coherency
#define XCODE_FLOATING_EXCEPTION 0x3c   // Floating point exception
#define XCODE_WATCHPOINT 0x5c           // Watch point
#define XCODE_INVALID_USER_ADDRESS 0x70 // Invalid user address (64-bit)
#define XCODE_PANIC 0x78                // Stack overflow (software)
#define XCODE_VIRTUAL_DATA 0x7c         // Virtual data coherency

#define R4000_XCODE_MASK (0x1f << CAUSE_XCODE) // R4000 exception code mask

#define R4000_MISS_MASK (R4000_XCODE_MASK & \
                        (~(XCODE_READ_MISS ^ XCODE_WRITE_MISS))) //

//
// Define R4000 page mask values.
//

#define PAGEMASK_4KB 0x0                // 4kb page
#define PAGEMASK_16KB 0x3               // 16kb page
#define PAGEMASK_64KB 0xf               // 64kb page
#define PAGEMASK_256KB 0x3f             // 256kb page
#define PAGEMASK_1MB 0xff               // 1mb page
#define PAGEMASK_4MB 0x3ff              // 4mb page
#define PAGEMASK_16MB 0xfff             // 16mb page

//
// Define R4000 primary cache states.
//

#define PRIMARY_CACHE_INVALID 0x0       // primary cache invalid
#define PRIMARY_CACHE_SHARED 0x1        // primary cache shared (clean or dirty)
#define PRIMARY_CACHE_CLEAN_EXCLUSIVE 0x2 // primary cache clean exclusive
#define PRIMARY_CACHE_DIRTY_EXCLUSIVE 0x3 // primary cache dirty exclusive

//
// Define R4000 cache instruction operation codes.
//

#define INDEX_INVALIDATE_I 0x0          // invalidate primary instruction cache
#define INDEX_WRITEBACK_INVALIDATE_D 0x1 // writeback/invalidate primary data cache
#define INDEX_INVALIDATE_SI 0x2         // invalidate secondary instruction cache
#define INDEX_WRITEBACK_INVALIDATE_SD 0x3 // writeback/invalidate secondary data cache

#define INDEX_LOAD_TAG_I 0x4            // load primary instruction tag indexed
#define INDEX_LOAD_TAG_D 0x5            // load primary data tag indexed
#define INDEX_LOAD_TAG_SI 0x6           // load secondary instruction tag indexed
#define INDEX_LOAD_TAG_SD 0x7           // load secondary data tag indexed

#define INDEX_STORE_TAG_I 0x8           // store primary instruction tag indexed
#define INDEX_STORE_TAG_D 0x9           // store primary data tag indexed
#define INDEX_STORE_TAG_SI 0xa          // store secondary instruction tag indexed
#define INDEX_STORE_TAG_SD 0xb          // store secondary data tag indexed

#define CREATE_DIRTY_EXCLUSIVE_D 0xd    // create dirty exclusive primary data cache
#define CREATE_DIRTY_EXCLUSIVE_SD 0xf   // create dirty exclusive secondary data cache

#define HIT_INVALIDATE_I 0x10           // invalidate primary instruction cache
#define HIT_INVALIDATE_D 0x11           // invalidate primary data cache
#define HIT_INVALIDATE_SI 0x12          // invalidate secondary instruction cache
#define HIT_INVALIDATE_SD 0x13          // invalidate secondary data cache

#define HIT_WRITEBACK_INVALIDATE_D 0x15 // writeback/invalidate primary data cache
#define HIT_WRITEBACK_INVALIDATE_SD 0x17 // writeback/invalidate secondary data cache

#define HIT_WRITEBACK_D 0x19            // writeback primary data cache
#define HIT_WRITEBACK_SD 0x1b           // writeback secondary data cache

#define HIT_SET_VIRTUAL_SI 0x1e         // hit set virtual secondary instruction cache
#define HIT_SET_VIRTUAL_SD 0x1f         // hit set virtual secondary data cache

//
// Define enable and disable interrupt macros.
//

#define DISABLE_INTERRUPTS(reg) \
        .set    noreorder; \
        .set    noat;      \
        li      AT,1 << PSR_CU1; \
        mfc0    reg,psr;   \
        mtc0    AT,psr;    \
        nop;               \
        nop;               \
        nop;               \
        .set    at;        \
        .set    reorder;

#define ENABLE_INTERRUPTS(reg) \
        .set    noreorder; \
        .set    noat;      \
        mtc0    reg,psr;   \
        nop;               \
        nop;               \
        .set    at;        \
        .set    reorder;

//
// Define floating coprocessor registers
//

#define fsrid $0                        // floating identification register
#define fsr $31                         // floating status register

//
// Define floating status register bit offsets.
//

#define FSR_RM 0x0
#define FSR_SI 0x2
#define FSR_SU 0x3
#define FSR_SO 0x4
#define FSR_SZ 0x5
#define FSR_SV 0x6
#define FSR_EI 0x7
#define FSR_EU 0x8
#define FSR_EO 0x9
#define FSR_EZ 0xa
#define FSR_EV 0xb
#define FSR_XI 0xc
#define FSR_XU 0xd
#define FSR_XO 0xe
#define FSR_XZ 0xf
#define FSR_XV 0x10
#define FSR_XE 0x11
#define FSR_CC 0x17
#define FSR_FS 0x18

//
// Define save and restore floating state macros.
//

#define RESTORE_VOLATILE_FLOAT_STATE         \
        .set    noreorder;                   \
        jal     KiRestoreVolatileFloatState; \
        ldc1    f0,TrFltF0(s8);              \
        .set    reorder;

#define SAVE_VOLATILE_FLOAT_STATE            \
        .set    noreorder;                   \
        jal     KiSaveVolatileFloatState;    \
        sdc1    f0,TrFltF0(s8);              \
        .set    reorder;

#define RESTORE_NONVOLATILE_FLOAT_STATE         \
        .set    noreorder;                      \
        jal     KiRestoreNonvolatileFloatState; \
        ldc1    f20,ExFltF20(sp);               \
        .set    reorder;

#define SAVE_NONVOLATILE_FLOAT_STATE            \
        .set    noreorder;                      \
        jal     KiSaveNonvolatileFloatState;    \
        sdc1    f20,ExFltF20(sp);               \
        .set    reorder;

//
// Define TB and cache parameters.
//

#define PCR_ENTRY 0                     // TB entry numbers (2) for the PCR
#define PDR_ENTRY 2                     // TB entry number (1) for the PDR
#define LARGE_ENTRY 3                   // TB entry number (1) for large entry
#define DMA_ENTRY 4                     // TB entry number (1) for DMA/InterruptSource

#define TB_ENTRY_SIZE (3 * 4)           // size of TB entry
#define FIXED_BASE 0                    // base index of fixed TB entries
#define FIXED_ENTRIES (DMA_ENTRY + 1)   // number of fixed TB entries

//
// Define cache parameters
//

#define DCACHE_SIZE 4 * 1024            // size of data cache in bytes
#define ICACHE_SIZE 4 * 1024            // size of instruction cache in bytes
#define MINIMUM_CACHE_SIZE 4 * 1024     // minimum size of cache
#define MAXIMUM_CACHE_SIZE 128 * 1024   // maximum size fo cache

//
// Define subtitle macro
//

#define SBTTL(x)

//
// Define global definition macros.
//

#define END_REGION(Name)               \
        .globl  Name;                  \
Name:;

#define START_REGION(Name)             \
        .globl  Name;                  \
Name:;

//
// Define procedure entry macros
//

#define ALTERNATE_ENTRY(Name)           \
        .globl  Name;                   \
Name:;

#define LEAF_ENTRY(Name)                \
        .text;                          \
        .globl  Name;                   \
        .ent    Name, 0;                \
Name:;                                  \
        .frame  sp, 0, ra;              \
        .prologue 0;

#define NESTED_ENTRY(Name, fsize, retrg) \
        .text;                          \
        .globl  Name;                   \
        .ent    Name, 0;                \
Name:;                                  \
        .frame  sp, fsize, retrg;

#define ALTERNATE_ENTRY_S(Name)         \
        .globl  Name;                   \
Name:;

#define SYSTEM_ENTRY(Name)              \
        .text;                          \
        .globl  Name;                   \
        .ent    Name, 0;                \
Name:;                                  \
        .frame  sp, 0, ra;              \
        .prologue 0;

#define LEAF_ENTRY_S(Name, Section)     \
        .text   Section;                \
        .globl  Name;                   \
        .ent    Name, 0;                \
Name:;                                  \
        .frame  sp, 0, ra;              \
        .prologue 0;

#define NESTED_ENTRY_S(Name, fsize, retrg, Section) \
        .text   Section;                \
        .globl  Name;                   \
        .ent    Name, 0;                \
Name:;                                  \
        .frame  sp, fsize, retrg;

//
// Define exception handling macros.
//

#define EXCEPTION_HANDLER(Handler)      \
        .edata  1, Handler;

#define PROLOGUE_END .prologue 1;

//
// Define exception data section and align.
//

#ifndef HEADER_FILE

        .edata  0
        .text

#endif