home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / sdk / winh / mips / kxmips.h < prev   
Encoding:
C/C++ Source or Header  |  1995-07-11  |  26.9 KB  |  746 lines

  1. /*++ BUILD Version: 0003    // Increment this if a change has global effects
  2. */
  3. //*++
  4. //
  5. // Copyright (c) 1990-1993  Microsoft Corporation
  6. //
  7. // Module Name:
  8. //
  9. //  kxmips.h
  10. //
  11. // Abstract:
  12. //
  13. //  This module contains the nongenerated part of the MIPS assembler
  14. //  header file. In general, it contains processor architecture constant
  15. //  information, however some assembler macros are also included.
  16. //
  17. // Author:
  18. //
  19. //  David N. Cutler (davec) 23-Mar-1990
  20. //
  21. // Revision History:
  22. //
  23. //--*/
  24.  
  25. //
  26. // Define load linked and store conditional opcodes if system is not an r4000
  27. //
  28.  
  29. #if defined(R3000)
  30.  
  31. #define ll lw
  32. #define sc sw
  33.  
  34. #endif
  35.  
  36. //
  37. // Define soft reset vector address for nonhandled cache parity errors.
  38. //
  39.  
  40. #if defined(R4000)
  41.  
  42. #define SOFT_RESET_VECTOR 0xbfc00300    // default parity error routine address
  43.  
  44. #endif
  45.  
  46. //
  47. // Define low memory transfer vector address and TB index address (temporary).
  48. //
  49.  
  50. #define TRANSFER_VECTOR (KSEG1_BASE + 0x400) // exception handler address
  51.  
  52. //
  53. // Define standard integer registers.
  54. //
  55.  
  56. #define zero $0                         // read zero, writes ignored
  57. #define AT $1                           // assembler temporary
  58. #define v0 $2                           // return value
  59. #define v1 $3                           //
  60. #define a0 $4                           // argument registers
  61. #define a1 $5                           //
  62. #define a2 $6                           //
  63. #define a3 $7                           //
  64. #define t0 $8                           // caller saved registers
  65. #define t1 $9                           //
  66. #define t2 $10                          //
  67. #define t3 $11                          //
  68. #define t4 $12                          //
  69. #define t5 $13                          //
  70. #define t6 $14                          //
  71. #define t7 $15                          //
  72. #define s0 $16                          // callee saved registers
  73. #define s1 $17                          //
  74. #define s2 $18                          //
  75. #define s3 $19                          //
  76. #define s4 $20                          //
  77. #define s5 $21                          //
  78. #define s6 $22                          //
  79. #define s7 $23                          //
  80. #define t8 $24                          // caller saved registers
  81. #define t9 $25                          //
  82. #define k0 $26                          // kernel reserved registers
  83. #define k1 $27                          //
  84. #define gp $28                          // global pointer
  85. #define sp $29                          // stack pointer
  86. #define s8 $30                          // callee saved register
  87. #define ra $31                          // return address register
  88.  
  89. //
  90. // Define standard floating point registers.
  91. //
  92.  
  93. #define f0 $f0                          // caller saved registers
  94. #define f1 $f1                          //
  95. #define f2 $f2                          //
  96. #define f3 $f3                          //
  97. #define f4 $f4                          //
  98. #define f5 $f5                          //
  99. #define f6 $f6                          //
  100. #define f7 $f7                          //
  101. #define f8 $f8                          //
  102. #define f9 $f9                          //
  103. #define f10 $f10                        //
  104. #define f11 $f11                        //
  105. #define f12 $f12                        //
  106. #define f13 $f13                        //
  107. #define f14 $f14                        //
  108. #define f15 $f15                        //
  109. #define f16 $f16                        //
  110. #define f17 $f17                        //
  111. #define f18 $f18                        //
  112. #define f19 $f19                        //
  113. #define f20 $f20                        // callee saved registers
  114. #define f21 $f21                        //
  115. #define f22 $f22                        //
  116. #define f23 $f23                        //
  117. #define f24 $f24                        //
  118. #define f25 $f25                        //
  119. #define f26 $f26                        //
  120. #define f27 $f27                        //
  121. #define f28 $f28                        //
  122. #define f29 $f29                        //
  123. #define f30 $f30                        //
  124. #define f31 $f31                        //
  125.  
  126. //
  127. // Define R3000 system coprocessor registers.
  128. //
  129.  
  130. #if defined(R3000)
  131.  
  132. #define index $0                        // TB index register
  133. #define random $1                       // TB random register
  134. #define entrylo $2                      // TB entry low register
  135. #define context $4                      // TB context register
  136. #define badvaddr $8                     // TB bad virtual address register
  137. #define entryhi $10                     // TB entry high register
  138. #define psr $12                         // processor status register
  139. #define cause $13                       // exception cause register
  140. #define epc $14                         // exception PC register
  141. #define prid $15                        // processor id register
  142.  
  143. //
  144. // Define R3000 system coprocessor register bit field offsets.
  145. //
  146.  
  147. #define INDEX_INDEX 0x8                 // TLB specified index <13:8>
  148. #define INDEX_PROBE 0x1f                // TLB probe failure <31>
  149.  
  150. #define RANDOM_INDEX 0x8                // TLB random index <13:8>
  151.  
  152. #define ENTRYLO_G 0x8                   // Global <8>
  153. #define ENTRYLO_V 0x9                   // Valid <9>
  154. #define ENTRYLO_D 0xa                   // Dirty <10>
  155. #define ENTRYLO_N 0xb                   // Nocache <11>
  156. #define ENTRYLO_PFN 0xc                 // Page Frame <31:12>
  157.  
  158. #define ENTRYHI_PID 0x6                 // Process id <11:6>
  159. #define ENTRYHI_VPN 0xc                 // Virtual page <31:12>
  160.  
  161. #define PSR_IEC 0x0                     // Current interrupt enable <0>
  162. #define PSR_KUC 0x1                     // Current kernel/user <1>
  163. #define PSR_IEP 0x2                     // Previous interrupt enable <2>
  164. #define PSR_KUP 0x3                     // Previous kernel/user <3>
  165. #define PSR_PMODE PSR_KUP               // Previous mode bit <3>
  166. #define PSR_IEO 0x4                     // Old interrupt enable <4>
  167. #define PSR_KUO 0x5                     // Old kernel/user <5>
  168. #define PSR_INTMASK 0x8                 // Interrupt mask <15:8>
  169. #define PSR_ISC 0x10                    // Isolate d-cache <16>
  170. #define PSR_SWC 0x11                    // Swap caches <17>
  171. #define PSR_PZ 0x12                     // Parity zero <18>
  172. #define PSR_CM 0x13                     // Cache miss <19>
  173. #define PSR_PE 0x14                     // Parity error <20>
  174. #define PSR_TS 0x15                     // TLB shutdown <21>
  175. #define PSR_BEV 0x16                    // Bootstrap exception vector <22>
  176. #define PSR_CU0 0x1c                    // Coprocessor 0 enabled <28>
  177. #define PSR_CU1 0x1d                    // Coprocessor 1 enabled <29>
  178. #define PSR_CU2 0x1e                    // Coprocessor 2 enabled <30>
  179. #define PSR_CU3 0x1f                    // Coprocessor 3 enabled <31>
  180.  
  181. #endif
  182.  
  183. //
  184. // Define R4000 system coprocessor registers.
  185. //
  186.  
  187. #if defined(R4000)
  188.  
  189. #define index $0                        // TB index register
  190. #define random $1                       // TB random register
  191. #define entrylo0 $2                     // TB entry low 0 register
  192. #define entrylo1 $3                     // TB entry low 1 register
  193. #define context $4                      // TB context register
  194. #define pagemask $5                     // Page mask register
  195. #define wired $6                        // Wired TB entries register
  196. #define badvaddr $8                     // TB bad virtual address register
  197. #define count $9                        // Timer count register
  198. #define entryhi $10                     // TB entry high register
  199. #define compare $11                     // Timer compare register
  200. #define psr $12                         // Processor status register
  201. #define cause $13                       // Exception cause register
  202. #define epc $14                         // Exception PC register
  203. #define prid $15                        // Processor id register
  204. #define config $16                      // Configuration register
  205. #define lladdr $17                      // Load linked address register
  206. #define watchlo $18                     // Watch low address register
  207. #define watchhi $19                     // Watch high address register
  208. #define ecc $26                         // S-cache ECC and primary parity register
  209. #define cacheerr $27                    // Cache error and status register
  210. #define taglo $28                       // Cache tag low register
  211. #define taghi $29                       // Cache tag high register
  212. #define errorepc $30                    // Error exception PC register
  213.  
  214. //
  215. // Define R4000 system coprocessor register bit field offsets.
  216. //
  217.  
  218. #define INDEX_INDEX 0x0                 // TLB specified index <5:0>
  219. #define INDEX_PROBE 0x1f                // TLB probe failure <31>
  220.  
  221. #define RANDOM_INDEX 0x0                // TLB random index <5:0>
  222.  
  223. #define ENTRYLO_G 0x0                   // Global <0>
  224. #define ENTRYLO_V 0x1                   // Valid <1>
  225. #define ENTRYLO_D 0x2                   // Dirty <2>
  226. #define ENTRYLO_C 0x3                   // Cache control <5:3>
  227. #define ENTRYLO_PFN 0x6                 // Page Frame <29:6>
  228.  
  229. #define PAGEMASK_PAGEMASK 0xd           // Page mask <24:13>
  230.  
  231. #define WIRED_NUMBER 0x0                // Wired entries <5:0>
  232.  
  233. #define ENTRYHI_PID 0x0                 // Process id <7:0>
  234. #define ENTRYHI_VPN2 0xd                // Virtual page <31:13>
  235.  
  236. #define PID_MASK 0xfff                  // allow for ample expansion
  237.  
  238. #define PSR_IE 0x0                      // Interrupt enable <0>
  239. #define PSR_EXL 0x1                     // Exception level <1>
  240. #define PSR_ERL 0x2                     // Error level <2>
  241. #define PSR_KSU 0x3                     // Kernel/supervisor/user <4:3>
  242. #define PSR_PMODE (PSR_KSU + 1)         // Previous mode bit <4>
  243. #define PSR_UX 0x5                      // User extended <5>
  244. #define PSR_SX 0x6                      // Supervior extended <6>
  245. #define PSR_KX 0x7                      // Kernel extended <7>
  246. #define PSR_INTMASK 0x8                 // Interrupt mask <15:8>
  247. #define PSR_DE 0x10                     // Disable cache parity and ECC <16>
  248. #define PSR_CE 0x11                     // Check enable <17>
  249. #define PSR_CH 0x12                     // Cache hit <18>
  250. #define PSR_SR 0x14                     // Soft reset <20>
  251. #define PSR_TS 0x15                     // TLB shutdown <21>
  252. #define PSR_BEV 0x16                    // Bootstrap exception vector <22>
  253. #define PSR_CU0 0x1c                    // Coprocessor 0 enabled <28>
  254. #define PSR_CU1 0x1d                    // Coprocessor 1 enabled <29>
  255. #define PSR_CU2 0x1e                    // Coprocessor 2 enabled <30>
  256. #define PSR_CU3 0x1f                    // Coprocessor 3 enabled <31>
  257.  
  258. #define CONFIG_K0 0x0                   // Kseg0 cache algorithm <2:0>
  259. #define CONFIG_CU 0x3                   // Update on store conditional <3>
  260. #define CONFIG_DB 0x4                   // Data cache block size <4>
  261. #define CONFIG_IB 0x5                   // Instruction cache block size <5>
  262. #define CONFIG_DC 0x6                   // Data cache size <8:6>
  263. #define CONFIG_IC 0x9                   // Instruction cache size <11:9>
  264. #define CONFIG_EB 0xd                   // Block ordering <13>
  265. #define CONFIG_EM 0xe                   // ECC mode enable <14>
  266. #define CONFIG_BE 0xf                   // Big endian memory <15>
  267. #define CONFIG_SM 0x10                  // Use dirty shared state <16>
  268. #define CONFIG_SC 0x11                  // Secondary cache present <17>
  269. #define CONFIG_EW 0x12                  // System address port width <19:18>
  270. #define CONFIG_SW 0x14                  // Secondary cache port width <20>
  271. #define CONFIG_SS 0x15                  // Split secondary cache mode <21>
  272. #define CONFIG_SB 0x16                  // Secondary cache block size <23:22>
  273. #define CONFIG_EP 0x18                  // Pattern for write back data <27:24>
  274. #define CONFIG_EC 0x1c                  // System address port clock ratio <30:28>
  275. #define CONFIG_CM 0x1f                  // Master checker mode <31>
  276.  
  277. #define ECC_ECC 0x0                     // Secondary cache ECC <7:0>
  278.  
  279. #define CACHEERR_PIDX 0x0               // Primary cache index <2:0>
  280. #define CACHEERR_SIDX 0x3               // Secondary cache index <21:3>
  281. #define CACHEERR_EI 0x18                // ECC error on pimary store miss <24>
  282. #define CACHEERR_EB 0x19                // Data error on instrruction error <25>
  283. #define CACHEERR_EE 0x1a                // Error on system address bus <26>
  284. #define CACHEERR_ES 0x1b                // Error accessing processor state <27>
  285. #define CACHEERR_ET 0x1c                // Error on tag field <28>
  286. #define CACHEERR_ED 0x1d                // Error on data field <29>
  287. #define CACHEERR_EC 0x1e                // Cache level of error <30>
  288. #define CACHEERR_ER 0x1f                // Type of reference <31>
  289.  
  290. #define TAGLO_P 0x0                     // primary tag even parity <0>
  291. #define TAGLO_PSTATE 0x6                // primary cache state <7:6>
  292. #define TAGLO_PTAGLO 0x8                // primary tag low physical address <31:8>
  293.  
  294. #endif
  295.  
  296. //
  297. // Define R3000 and R4000 cause register bit offsets.
  298. //
  299.  
  300. #define CAUSE_XCODE 0x2                 // Exception code <6:2>
  301. #define CAUSE_INTPEND 0x8               // Interrupt pending <15:8>
  302. #define CAUSE_CE 0x1c                   // Coprocessor unusable <29:28>
  303. #define CAUSE_BD 0x1f                   // Branch delay slot <31>
  304.  
  305. //
  306. // Define R3000 and R4000 processor id register field offsets.
  307. //
  308.  
  309. #define PRID_REV 0x0                    // Revision level <7:0>
  310. #define PRID_IMP 0x8                    // Implementation type <15:8>
  311.  
  312. //
  313. // Define R3000 and R4000 exception codes.
  314. //
  315.  
  316. #define XCODE_INTERRUPT 0x0             // Interrupt
  317. #define XCODE_MODIFY 0x4                // TLB modify
  318. #define XCODE_READ_MISS 0x8             // TLB read miss
  319. #define XCODE_WRITE_MISS 0xc            // TLB write miss
  320. #define XCODE_READ_ADDRESS_ERROR 0x10   // Read alignment error
  321. #define XCODE_WRITE_ADDRESS_ERROR 0x14  // Write alignment error
  322. #define XCODE_INSTRUCTION_BUS_ERROR 0x18 // Instruction bus error
  323. #define XCODE_DATA_BUS_ERROR 0x1c       // Data bus error
  324. #define XCODE_SYSTEM_CALL 0x20          // System call
  325. #define XCODE_BREAKPOINT 0x24           // Breakpoint
  326. #define XCODE_ILLEGAL_INSTRUCTION 0x28  // Illegal instruction
  327. #define XCODE_COPROCESSOR_UNUSABLE 0x2c // Coprocessor unusable
  328. #define XCODE_INTEGER_OVERFLOW 0x30     // Arithmetic overflow
  329.  
  330. #if defined(R3000)
  331.  
  332. #define XCODE_PANIC 0x3c                // Stack overflow (software)
  333.  
  334. #define R3000_XCODE_MASK (0xf << CAUSE_XCODE) // R3000 exception code mask
  335.  
  336. #define R3000_MISS_MASK (R3000_XCODE_MASK & \
  337.                         (~(XCODE_READ_MISS ^ XCODE_WRITE_MISS))) //
  338.  
  339. #endif
  340.  
  341. #if defined(R4000)
  342.  
  343. #define XCODE_TRAP 0x34                 // Trap instruction
  344. #define XCODE_VIRTUAL_INSTRUCTION 0x38  // Virtual instruction coherency
  345. #define XCODE_FLOATING_EXCEPTION 0x3c   // Floating point exception
  346. #define XCODE_WATCHPOINT 0x5c           // Watch point
  347. #define XCODE_PANIC 0x78                // Stack overflow (software)
  348. #define XCODE_VIRTUAL_DATA 0x7c         // Virtual data coherency
  349.  
  350. #define R4000_XCODE_MASK (0x1f << CAUSE_XCODE) // R4000 exception code mask
  351.  
  352. #define R4000_MISS_MASK (R4000_XCODE_MASK & \
  353.                         (~(XCODE_READ_MISS ^ XCODE_WRITE_MISS))) //
  354.  
  355. #endif
  356.  
  357. //
  358. // Define R4000 page mask values.
  359. //
  360.  
  361. #if defined(R4000)
  362.  
  363. #define PAGEMASK_4KB 0x0                // 4kb page
  364. #define PAGEMASK_16KB 0x3               // 16kb page
  365. #define PAGEMASK_64KB 0xf               // 64kb page
  366. #define PAGEMASK_256KB 0x3f             // 256kb page
  367. #define PAGEMASK_1MB 0xff               // 1mb page
  368. #define PAGEMASK_4MB 0x3ff              // 4mb page
  369. #define PAGEMASK_16MB 0xfff             // 16mb page
  370.  
  371. #endif
  372.  
  373. //
  374. // Define R4000 primary cache states.
  375. //
  376.  
  377. #if defined(R4000)
  378.  
  379. #define PRIMARY_CACHE_INVALID 0x0       // primary cache invalid
  380. #define PRIMARY_CACHE_SHARED 0x1        // primary cache shared (clean or dirty)
  381. #define PRIMARY_CACHE_CLEAN_EXCLUSIVE 0x2 // primary cache clean exclusive
  382. #define PRIMARY_CACHE_DIRTY_EXCLUSIVE 0x3 // primary cache dirty exclusive
  383.  
  384. #endif
  385.  
  386. //
  387. // Define R4000 cache instruction operation codes.
  388. //
  389.  
  390. #if defined(R4000)
  391.  
  392. #define INDEX_INVALIDATE_I 0x0          // invalidate primary instruction cache
  393. #define INDEX_WRITEBACK_INVALIDATE_D 0x1 // writeback/invalidate primary data cache
  394. #define INDEX_INVALIDATE_SI 0x2         // invalidate secondary instruction cache
  395. #define INDEX_WRITEBACK_INVALIDATE_SD 0x3 // writeback/invalidate secondary data cache
  396.  
  397. #define INDEX_LOAD_TAG_I 0x4            // load primary instruction tag indexed
  398. #define INDEX_LOAD_TAG_D 0x5            // load primary data tag indexed
  399. #define INDEX_LOAD_TAG_SI 0x6           // load secondary instruction tag indexed
  400. #define INDEX_LOAD_TAG_SD 0x7           // load secondary data tag indexed
  401.  
  402. #define INDEX_STORE_TAG_I 0x8           // store primary instruction tag indexed
  403. #define INDEX_STORE_TAG_D 0x9           // store primary data tag indexed
  404. #define INDEX_STORE_TAG_SI 0xa          // store secondary instruction tag indexed
  405. #define INDEX_STORE_TAG_SD 0xb          // store secondary data tag indexed
  406.  
  407. #define CREATE_DIRTY_EXCLUSIVE_D 0xd    // create dirty exclusive primary data cache
  408. #define CREATE_DIRTY_EXCLUSIVE_SD 0xf   // create dirty exclusive secondary data cache
  409.  
  410. #define HIT_INVALIDATE_I 0x10           // invalidate primary instruction cache
  411. #define HIT_INVALIDATE_D 0x11           // invalidate primary data cache
  412. #define HIT_INVALIDATE_SI 0x12          // invalidate secondary instruction cache
  413. #define HIT_INVALIDATE_SD 0x13          // invalidate secondary data cache
  414.  
  415. #define HIT_WRITEBACK_INVALIDATE_D 0x15 // writeback/invalidate primary data cache
  416. #define HIT_WRITEBACK_INVALIDATE_SD 0x17 // writeback/invalidate secondary data cache
  417.  
  418. #define HIT_WRITEBACK_D 0x19            // writeback primary data cache
  419. #define HIT_WRITEBACK_SD 0x1b           // writeback secondary data cache
  420.  
  421. #define HIT_SET_VIRTUAL_SI 0x1e         // hit set virtual secondary instruction cache
  422. #define HIT_SET_VIRTUAL_SD 0x1f         // hit set virtual secondary data cache
  423.  
  424. #endif
  425.  
  426. //
  427. // Define enable and disable interrupt macros.
  428. //
  429.  
  430. #if defined(R3000)
  431.  
  432. #define DISABLE_INTERRUPTS(reg) \
  433.         .set    noreorder; \
  434.         .set    noat;      \
  435.         li      AT,1 << PSR_CU1; \
  436.         mfc0    reg,psr;   \
  437.         mtc0    AT,psr;    \
  438.         nop;               \
  439.         nop;               \
  440.         .set    at;        \
  441.         .set    reorder;
  442.  
  443. #define ENABLE_INTERRUPTS(reg) \
  444.         .set    noreorder; \
  445.         .set    noat;      \
  446.         mtc0    reg,psr;   \
  447.         nop;               \
  448.         .set    at;        \
  449.         .set    reorder;
  450.  
  451. #endif
  452.  
  453. #if defined(R4000)
  454.  
  455. #define DISABLE_INTERRUPTS(reg) \
  456.         .set    noreorder; \
  457.         .set    noat;      \
  458.         li      AT,1 << PSR_CU1; \
  459.         mfc0    reg,psr;   \
  460.         mtc0    AT,psr;    \
  461.         nop;               \
  462.         nop;               \
  463.         nop;               \
  464.         .set    at;        \
  465.         .set    reorder;
  466.  
  467. #define ENABLE_INTERRUPTS(reg) \
  468.         .set    noreorder; \
  469.         .set    noat;      \
  470.         mtc0    reg,psr;   \
  471.         nop;               \
  472.         nop;               \
  473.         .set    at;        \
  474.         .set    reorder;
  475.  
  476. #endif
  477.  
  478. //
  479. // Define floating coprocessor registers
  480. //
  481.  
  482. #define fsrid $0                        // floating identification register
  483. #define fsr $31                         // floating status register
  484.  
  485. //
  486. // Define floating status register bit offsets.
  487. //
  488.  
  489. #define FSR_RM 0x0
  490. #define FSR_SI 0x2
  491. #define FSR_SU 0x3
  492. #define FSR_SO 0x4
  493. #define FSR_SZ 0x5
  494. #define FSR_SV 0x6
  495. #define FSR_EI 0x7
  496. #define FSR_EU 0x8
  497. #define FSR_EO 0x9
  498. #define FSR_EZ 0xa
  499. #define FSR_EV 0xb
  500. #define FSR_XI 0xc
  501. #define FSR_XU 0xd
  502. #define FSR_XO 0xe
  503. #define FSR_XZ 0xf
  504. #define FSR_XV 0x10
  505. #define FSR_XE 0x11
  506. #define FSR_CC 0x17
  507. #define FSR_FS 0x18
  508.  
  509. //
  510. // Define save and restore floating state macros.
  511. //
  512.  
  513. #if defined(R3000)
  514.  
  515. #define RESTORE_VOLATILE_FLOAT_STATE         \
  516.         .set    noreorder;                   \
  517.         jal     KiRestoreVolatileFloatState; \
  518.         lwc1    f0,TrFltF0(s8);              \
  519.         .set    reorder;
  520.  
  521. #define SAVE_VOLATILE_FLOAT_STATE            \
  522.         .set    noreorder;                   \
  523.         jal     KiSaveVolatileFloatState;    \
  524.         swc1    f0,TrFltF0(s8);              \
  525.         .set    reorder;
  526.  
  527. #endif
  528.  
  529. #if defined(R4000)
  530.  
  531. #define RESTORE_VOLATILE_FLOAT_STATE         \
  532.         .set    noreorder;                   \
  533.         jal     KiRestoreVolatileFloatState; \
  534.         ldc1    f0,TrFltF0(s8);              \
  535.         .set    reorder;
  536.  
  537. #define SAVE_VOLATILE_FLOAT_STATE            \
  538.         .set    noreorder;                   \
  539.         jal     KiSaveVolatileFloatState;    \
  540.         sdc1    f0,TrFltF0(s8);              \
  541.         .set    reorder;
  542.  
  543. #endif
  544.  
  545. #if defined(R3000)
  546.  
  547. #define RESTORE_NONVOLATILE_FLOAT_STATE         \
  548.         .set    noreorder;                      \
  549.         jal     KiRestoreNonvolatileFloatState; \
  550.         lwc1    f20,ExFltF20(sp);               \
  551.         .set    reorder;
  552.  
  553. #define SAVE_NONVOLATILE_FLOAT_STATE            \
  554.         .set    noreorder;                      \
  555.         jal     KiSaveNonvolatileFloatState;    \
  556.         swc1    f20,ExFltF20(sp);               \
  557.         .set    reorder;
  558.  
  559. #endif
  560.  
  561. #if defined(R4000)
  562.  
  563. #define RESTORE_NONVOLATILE_FLOAT_STATE         \
  564.         .set    noreorder;                      \
  565.         jal     KiRestoreNonvolatileFloatState; \
  566.         ldc1    f20,ExFltF20(sp);               \
  567.         .set    reorder;
  568.  
  569. #define SAVE_NONVOLATILE_FLOAT_STATE            \
  570.         .set    noreorder;                      \
  571.         jal     KiSaveNonvolatileFloatState;    \
  572.         sdc1    f20,ExFltF20(sp);               \
  573.         .set    reorder;
  574.  
  575. #endif
  576.  
  577. //
  578. // Define TB and cache parameters.
  579. //
  580.  
  581. #if defined(R3000)
  582.  
  583. #define NUMBER_PIDS 64                  // number of process ids
  584.  
  585. #define PCR_ENTRY 0                     // TB entry numbers (2) for the PCR
  586. #define PDR_ENTRY 2                     // TB entry number (1) for the PDR
  587. #define KSTACK_ENTRY 3                  // TB entry numbers (2) for kernel stack
  588. #define KDPORT_ENTRY 5                  // TB entry number (1) for debug port
  589. #define DMA_ENTRY 6                     // TB entry number (1) for DMA registers
  590. #define INTERRUPT_ENTRY 7               // TB entry number (1) for interrupt source
  591.  
  592. #define TB_SIZE 64                      // number of TB entries
  593. #define TB_ENTRY_SIZE (2 * 4)           // size of TB entry
  594. #define FIXED_BASE 0                    // base index of fixed TB entries
  595. #define FIXED_ENTRIES (INTERRUPT_ENTRY + 1) // number of fixed TB entries
  596. #define RANDOM_BASE FIXED_ENTRIES       // base index of random TB entries
  597. #define RANDOM_ENTRIES (TB_SIZE - RANDOM_BASE) // number of random TB entries
  598.  
  599. #endif
  600.  
  601. #if defined(R4000)
  602.  
  603. #define PCR_ENTRY 0                     // TB entry numbers (2) for the PCR
  604. #define PDR_ENTRY 2                     // TB entry number (1) for the PDR
  605. #define LARGE_ENTRY 3                   // TB entry number (1) for large entry
  606. #define DMA_ENTRY 4                     // TB entry number (1) for DMA/InterruptSource
  607.  
  608. #define TB_ENTRY_SIZE (3 * 4)           // size of TB entry
  609. #define FIXED_BASE 0                    // base index of fixed TB entries
  610. #define FIXED_ENTRIES (DMA_ENTRY + 1)   // number of fixed TB entries
  611.  
  612. #endif
  613.  
  614. //
  615. // Define cache parameters
  616. //
  617.  
  618. #define DCACHE_SIZE 4 * 1024            // size of data cache in bytes
  619. #define ICACHE_SIZE 4 * 1024            // size of instruction cache in bytes
  620. #define MINIMUM_CACHE_SIZE 4 * 1024     // minimum size of cache
  621. #define MAXIMUM_CACHE_SIZE 128 * 1024   // maximum size fo cache
  622.  
  623. //
  624. // Define subtitle macro
  625. //
  626.  
  627. #define SBTTL(x)
  628.  
  629. //
  630. // Define global definition macros.
  631. //
  632.  
  633. #define END_REGION(Name)               \
  634.         .globl  Name;                  \
  635. Name:;
  636.  
  637. #define START_REGION(Name)             \
  638.         .globl  Name;                  \
  639. Name:;
  640.  
  641. //
  642. // Define trap frame generation macro.
  643. //
  644.  
  645. #define GENERATE_TRAP_FRAME             \
  646.         .set    noreorder;              \
  647.         .set    noat;                   \
  648.         jal     KiGenerateTrapFrame;    \
  649.         sw      AT,TrIntAt(s8);         \
  650.         .set    at;                     \
  651.         .set    reorder;
  652.  
  653. //
  654. // Define restore volatile integer state macro.
  655. //
  656.  
  657. #define RESTORE_VOLATILE_INTEGER_STATE  \
  658.         .set    noreorder;              \
  659.         .set    noat;                   \
  660.         jal     KiRestoreVolatileIntegerState; \
  661.         lw      AT,TrIntAt(s8);         \
  662.         .set    at;                     \
  663.         .set    reorder;
  664.  
  665. //
  666. // Define save volatile integer state macro.
  667. //
  668.  
  669. #define SAVE_VOLATILE_INTEGER_STATE     \
  670.         .set    noreorder;              \
  671.         .set    noat;                   \
  672.         jal     KiSaveVolatileIntegerState; \
  673.         sw      AT,TrIntAt(s8);         \
  674.         .set    at;                     \
  675.         .set    reorder;
  676.  
  677. //
  678. // Define procedure entry macros
  679. //
  680.  
  681. #define ALTERNATE_ENTRY(Name)           \
  682.         .globl  Name;                   \
  683. Name:;
  684.  
  685. #define LEAF_ENTRY(Name)                \
  686.         .text;                          \
  687.         .globl  Name;                   \
  688.         .ent    Name, 0;                \
  689. Name:;                                  \
  690.         .frame  sp, 0, ra;              \
  691.         .prologue 0;
  692.  
  693. #define NESTED_ENTRY(Name, fsize, retrg) \
  694.         .text;                          \
  695.         .globl  Name;                   \
  696.         .ent    Name, 0;                \
  697. Name:;                                  \
  698.         .frame  sp, fsize, retrg;
  699.  
  700. #define ALTERNATE_ENTRY_S(Name)         \
  701.         .globl  Name;                   \
  702. Name:;
  703.  
  704. #define SYSTEM_ENTRY(Name)              \
  705.         .text;                          \
  706.         .globl  Name;                   \
  707.         .ent    Name, 0;                \
  708. Name:;                                  \
  709.         .frame  sp, 0, ra;              \
  710.         .prologue 0;
  711.  
  712. #define LEAF_ENTRY_S(Name, Section)     \
  713.         .text   Section;                \
  714.         .globl  Name;                   \
  715.         .ent    Name, 0;                \
  716. Name:;                                  \
  717.         .frame  sp, 0, ra;              \
  718.         .prologue 0;
  719.  
  720. #define NESTED_ENTRY_S(Name, fsize, retrg, Section) \
  721.         .text   Section;                \
  722.         .globl  Name;                   \
  723.         .ent    Name, 0;                \
  724. Name:;                                  \
  725.         .frame  sp, fsize, retrg;
  726.  
  727. //
  728. // Define exception handling macros.
  729. //
  730.  
  731. #define EXCEPTION_HANDLER(Handler)      \
  732.         .edata  1, Handler;
  733.  
  734. #define PROLOGUE_END .prologue 1;
  735.  
  736. //
  737. // Define exception data section and align.
  738. //
  739.  
  740. #ifndef HEADER_FILE
  741.  
  742.         .edata  0
  743.         .text
  744.  
  745. #endif
  746.