home *** CD-ROM | disk | FTP | other *** search
/ Team Palmtops 7 / Palmtops_numero07.iso / WinCE / SDKWindowsCE / AutoPC / apcsdk10.exe / data1.cab / Emulation_Include_Files / kxppc.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-13  |  36.9 KB  |  1,050 lines

  1. //++ BUILD Version: 0003    // Increment this if a change has global effects //
  2. //*++
  3. //
  4. // Copyright (c) 1990-1993  IBM Corporation
  5. //
  6. // Module Name:
  7. //
  8. //  kxppc.h
  9. //
  10. // Abstract:
  11. //
  12. //  This module contains the nongenerated part of the PPC assembler
  13. //  header file. In general, it contains processor architecture constant
  14. //  information, however some assembler macros are also included.
  15. //
  16. //
  17. //--*/
  18.  
  19. #ifndef _KXPPC_
  20. #define _KXPPC_
  21.  
  22. #define ASM_ONLY    // allow assembler only conditionals
  23.  
  24. #ifndef _KXPPC_C_HEADER_
  25.  
  26. // =====================================================================
  27. // Begin code extracted from ppcsects.h
  28. // =====================================================================
  29.  
  30. //Purpose:
  31. //   This file defines sections for the C and C++ libs.
  32. //
  33. //   NOTE:  As needed, special "CRT" sections can be added into the existing
  34. //   init/term tables.  These will be for our use only -- users who put
  35. //   stuff in here do so at their own risk.
  36. //
  37. // beginSection - a macro for declaring and beginning a section
  38. //
  39. // endSection - a macro for ending a previously declared section
  40. //
  41. // *****
  42.  
  43. #define         beginSection(SectName) \
  44. .section        .CRT$##SectName, "drw2"
  45.  
  46. #define         endSection(SectName)
  47.  
  48. //  XIA  Begin C Initializer Sections
  49. //  XIC   Microsoft Reserved
  50. //  XIU   User
  51. //  XIZ  End C Initializer Sections
  52. //
  53. //  XCA  Begin C++ Constructor Sections
  54. //  XCC   Compiler (MS)
  55. //  XCL   Library
  56. //  XCU   User
  57. //  XCZ  End C++ Constructor Sections
  58. //
  59. //  XPA  Begin C Pre-Terminator Sections
  60. //  XPU   User
  61. //  XPX   Microsoft Reserved
  62. //  XPZ  End C Pre-Terminator Sections
  63. //
  64. //  XTA  Begin C Pre-Terminator Sections
  65. //  XTU   User
  66. //  XTX   Microsoft Reserved
  67. //  XTZ  End C Pre-Terminator Sections
  68.  
  69. // =====================================================================
  70. // End code extracted from ppcsects.h
  71. // =====================================================================
  72.  
  73. #endif // _KXPPC_C_HEADER_
  74.  
  75. //
  76. // Maximum Bit number (32 bit implementation)
  77. //
  78. #define MAX_BITS  0x1f
  79.  
  80. //
  81. // Macro to generate a mask using the SPR bit definitions below
  82. //
  83. #define MASK_SPR(shift,mask)  ((mask) << (MAX_BITS-(shift)))
  84.  
  85. // Register #'s for special purpose registers
  86.  
  87. #define DECRMEMENTER    22
  88. #define SRR0    26
  89. #define SRR1    27
  90. #define SPRG0    272
  91. #define SPRG1    273
  92. #define SPRG2    274
  93. #define SPRG3    275
  94. #define TBL        284
  95. #define TBH        285
  96. #define PVR        287
  97.  
  98.  
  99. //
  100. // Define Machine State Register bit field offsets.
  101. //
  102. // MSR_POW   0x0d Power management enable         <13>
  103. // MSR_IMPL  0x0e Implementation dependent        <14>
  104. // MSR_ILE   0x0f Interrupt Little-Endian mode    <15>
  105. // MSR_EE    0x10 External interrupt Enable       <16>
  106. // MSR_PR    0x11 Problem state                   <17>
  107. // MSR_FP    0x12 Floating Point available        <18>
  108. // MSR_ME    0x13 Machine check Enable            <19>
  109. // MSR_FE0   0x14 Floating point Exception mode 0 <20>
  110. // MSR_SE    0x15 Single-step trace Enable        <21>
  111. // MSR_BE    0x16 Branch trace Enable             <22>
  112. // MSR_FE1   0x17 Floating point Exception mode 1 <23>
  113. // MSR_IP    0x19 Interrupt Prefix                <25>
  114. // MSR_IR    0x1a Instruction Relocate            <26>
  115. // MSR_DR    0x1b Data Relocate                   <27>
  116. // MSR_RI    0x1e Recoverable Interrupt           <30>
  117. // MSR_LE    0x1f Little-Endian execution mode    <31>
  118.  
  119. #define MSR_POW   0x0d
  120. #define MSR_IMPL  0x0e
  121. #define MSR_ILE   0x0f
  122. #define MSR_EE    0x10
  123. #define MSR_PR    0x11
  124. #define MSR_FP    0x12
  125. #define MSR_ME    0x13
  126. #define MSR_FE0   0x14
  127. #define MSR_SE    0x15
  128. #define MSR_BE    0x16
  129. #define MSR_FE1   0x17
  130. #define MSR_IP    0x19
  131. #define MSR_IR    0x1a
  132. #define MSR_DR    0x1b
  133. #define MSR_RI    0x1e
  134. #define MSR_LE    0x1f
  135.  
  136.  
  137. //
  138. // Define Processor Version Register (PVR) bit fields
  139. //
  140. //  PVR_Version  0x0  Processor Version  <0:15>
  141. //  PVR_Revision 0x10 Processor Revision <16:31>
  142. #define PVR_Version  0x0
  143. #define PVR_Revision 0x10
  144.  
  145. //
  146. // Fixed Point Exception Register is Special Purpose Reg no. 1
  147. //
  148.  
  149. #define XER     0x1
  150.  
  151. //
  152. // Define Fixed Point Exception Register (XER) bit fields
  153. //
  154.  
  155. // XER_SO    0x0  Summary Overflow <0>
  156. // XER_OV    0x1  Overflow         <1>
  157. // XER_CA    0x2  Carry            <2>
  158. // XER_COMP  0x10 > Carry          <16:23>
  159. // XER_COUNT 0x19 Carry            <25:31>
  160.  
  161. #define XER_SO    0x0
  162. #define XER_OV    0x1
  163. #define XER_CA    0x2
  164. #define XER_COMP  0x10
  165. #define XER_COUNT 0x19
  166.  
  167.  
  168. //
  169. // Define Floating Point Status/Control Register (FPSCR) bit fields
  170. //
  171. // FPSCR_FX        0x0  Exception summary                          <0>
  172. // FPSCR_FEX       0x1  Enabled Exception summary                  <1>
  173. // FPSCR_VX        0x2  Invalid operation exception summary        <2>
  174. // FPSCR_OX        0x3  Overflow exception                         <3>
  175. // FPSCR_UX        0x4  Underflow exception                        <4>
  176. // FPSCR_ZX        0x5  Zero divide exception                      <5>
  177. // FPSCR_XX        0x6  Inexact exception                          <6>
  178. // FPSCR_VXSNAN    0x7  Invalid op exception (signalling NaN)      <7>
  179. // FPSCR_VXISI     0x8  Invalid op exception (infinity - infinity) <8>
  180. // FPSCR_VXIDI     0x9  Invalid op exception (infinity / infinity) <9>
  181. // FPSCR_VXZDZ     0x0a Invalid op exception (0 / 0)               <10>
  182. // FPSCR_VXIMZ     0x0b Invalid op exception (infinity * 0)        <11>
  183. // FPSCR_VXVC      0x0c Invalid op exception (compare)             <12>
  184. // FPSCR_FR        0x0d Fraction Rounded                           <13>
  185. // FPSCR_FI        0x0e Fraction Inexact                           <14>
  186. // FPSCR_C         0x0f Result Class descriptor                    <15>
  187. // FPSCR_FL        0x10 Result Less than or negative               <16>
  188. // FPSCR_FG        0x11 Result Greater than or positive            <17>
  189. // FPSCR_FE        0x12 Result Equal or zero                       <18>
  190. // FPSCR_FU        0x13 Result Unordered or NaN                    <19>
  191. // FPSCR_Res1      0x14 reserved                                   <20>
  192. // FPSCR_VXSOFT    0x15 Invalid op exception (software request)    <21>
  193. // FPSCR_VXSQRT    0x16 Invalid op exception (square root)         <22>
  194. // FPSCR_VXCVI     0x17 Invalid op exception (integer convert)     <23>
  195. // FPSCR_VE        0x18 Invalid operation exception Enable         <24>
  196. // FPSCR_OE        0x19 Overflow exception Enable                  <25>
  197. // FPSCR_UE        0x1a Underflow exception Enable                 <26>
  198. // FPSCR_ZE        0x1b Zero divide exception Enable               <27>
  199. // FPSCR_XE        0x1c Inexact exception Enable                   <28>
  200. // FPSCR_NI        0x1d Non-IEEE mode                              <29>
  201. // FPSCR_RN        0x1e Rounding control                        <30:31>
  202. #define FPSCR_FX        0x0
  203. #define FPSCR_FEX       0x1
  204. #define FPSCR_VX        0x2
  205. #define FPSCR_OX        0x3
  206. #define FPSCR_UX        0x4
  207. #define FPSCR_ZX        0x5
  208. #define FPSCR_XX        0x6
  209. #define FPSCR_VXSNAN    0x7
  210. #define FPSCR_VXISI     0x8
  211. #define FPSCR_VXIDI     0x9
  212. #define FPSCR_VXZDZ     0x0a
  213. #define FPSCR_VXIMZ     0x0b
  214. #define FPSCR_VXVC      0x0c
  215. #define FPSCR_FR        0x0d
  216. #define FPSCR_FI        0x0e
  217. #define FPSCR_C         0x0f
  218. #define FPSCR_FL        0x10
  219. #define FPSCR_FG        0x11
  220. #define FPSCR_FE        0x12
  221. #define FPSCR_FU        0x13
  222. #define FPSCR_Res1      0x14
  223. #define FPSCR_VXSOFT    0x15
  224. #define FPSCR_VXSQRT    0x16
  225. #define FPSCR_VXCVI     0x17
  226. #define FPSCR_VE        0x18
  227. #define FPSCR_OE        0x19
  228. #define FPSCR_UE        0x1a
  229. #define FPSCR_ZE        0x1b
  230. #define FPSCR_XE        0x1c
  231. #define FPSCR_NI        0x1d
  232. #define FPSCR_RN        0x1e
  233.  
  234. //
  235. // Define cache parameters
  236. //
  237.  
  238. #define DCACHE_SIZE (4 * 1024)          // size of data cache in bytes
  239. #define ICACHE_SIZE (4 * 1024)          // size of instruction cache in bytes
  240. #define MINIMUM_CACHE_SIZE (4 * 1024)   // minimum size of cache
  241. #define MAXIMUM_CACHE_SIZE (128 * 1024) // maximum size fo cache
  242.  
  243. #ifndef _KXPPC_C_HEADER_
  244.  
  245. //
  246. // Define subtitle macro
  247. //
  248.  
  249. #define SBTTL(x)
  250.  
  251. //
  252. // Define global definition macros.
  253. //
  254.  
  255. //
  256. // Define load immediate macro for 32-bit values.
  257. //
  258. //      reg       - Register to load with the 32-bit immediate
  259. //      immediate - 32-bit immediate value
  260. //
  261. #define LWI(reg,immediate)                   \
  262.         lis     reg,(immediate) >> 16        ;\
  263.         ori     reg,reg,(immediate) & 0xffff
  264.  
  265. #define END_REGION(Name)               \
  266.         .globl  Name                   ;\
  267. Name:
  268.  
  269. #define START_REGION(Name)             \
  270.         .globl  Name                   ;\
  271. Name:
  272.  
  273. //
  274. // Define macros used by procedure entry/exit macros
  275. //
  276.  
  277. //
  278. // Set register 12 to the GPR save location based on the number
  279. // of floating point registers to be saved.
  280. //
  281. #define __setFramemr(Fpr)       \
  282.         mr      r.12,r.sp
  283.  
  284. #define __setFramesubi(Fpr)     \
  285.         subi    r.12,r.sp,8*Fpr
  286.  
  287. //
  288. // Save the number of GPRs specified inline or by setting r.12 to the GPR
  289. // save location and branching to the appropriate millicode save procedure.
  290. //
  291. // Changed bla to bl in __savegpr4-__savegrp19          IBMCDB
  292. #define __savegpr0(op,Fpr)
  293. #define __savegpr1(op,Fpr)      \
  294.         stw     r.31,-(4+(8*Fpr))(r.sp)
  295. #define __savegpr2(op,Fpr)              \
  296.         stw     r.31,-(4+(8*Fpr))(r.sp) ;\
  297.         stw     r.30,-(8+(8*Fpr))(r.sp)
  298. #define __savegpr3(op,Fpr)              \
  299.         stw     r.31,-(4+(8*Fpr))(r.sp) ;\
  300.         stw     r.30,-(8+(8*Fpr))(r.sp) ;\
  301.         stw     r.29,-(12+(8*Fpr))(r.sp)
  302. #define __savegpr4(op,Fpr)      \
  303.         __setFrame##op(Fpr)     ;\
  304.         bl      _savegpr_28
  305. #define __savegpr5(op,Fpr)      \
  306.         __setFrame##op(Fpr)     ;\
  307.         bl      _savegpr_27
  308. #define __savegpr6(op,Fpr)      \
  309.         __setFrame##op(Fpr)     ;\
  310.         bl      _savegpr_26
  311. #define __savegpr7(op,Fpr)      \
  312.         __setFrame##op(Fpr)     ;\
  313.         bl      _savegpr_25
  314. #define __savegpr8(op,Fpr)      \
  315.         __setFrame##op(Fpr)     ;\
  316.         bl      _savegpr_24
  317. #define __savegpr9(op,Fpr)      \
  318.         __setFrame##op(Fpr)     ;\
  319.         bl      _savegpr_23
  320. #define __savegpr10(op,Fpr)     \
  321.         __setFrame##op(Fpr)     ;\
  322.         bl      _savegpr_22
  323. #define __savegpr11(op,Fpr)     \
  324.         __setFrame##op(Fpr)     ;\
  325.         bl      _savegpr_21
  326. #define __savegpr12(op,Fpr)     \
  327.         __setFrame##op(Fpr)     ;\
  328.         bl      _savegpr_20
  329. #define __savegpr13(op,Fpr)     \
  330.         __setFrame##op(Fpr)     ;\
  331.         bl      _savegpr_19
  332.  
  333.  
  334. #define __savegpr14(op,Fpr)     \
  335.         __setFrame##op(Fpr)     ;\
  336.         bl      _savegpr_18
  337. #define __savegpr15(op,Fpr)     \
  338.         __setFrame##op(Fpr)     ;\
  339.         bl      _savegpr_17
  340. #define __savegpr16(op,Fpr)     \
  341.         __setFrame##op(Fpr)     ;\
  342.         bl      _savegpr_16
  343. #define __savegpr17(op,Fpr)     \
  344.         __setFrame##op(Fpr)     ;\
  345.         bl      _savegpr_15
  346. #define __savegpr18(op,Fpr)     \
  347.         __setFrame##op(Fpr)     ;\
  348.         bl      _savegpr_14
  349. #define __savegpr19(op,Fpr)     \
  350.         __setFrame##op(Fpr)     ;\
  351.         bl      _savegpr_13
  352. //
  353. // Macros for removing the stack frame established through NESTED ENTRY.
  354. //
  355. #define __unsetFramemov(Fsize,Fpr)    \
  356.         addi    r.12,r.sp,Fsize  ;     \
  357.         mtlr    r.0              ;     \
  358.         mr      r.sp,r.12
  359.  
  360. #define __unsetFrameaddi(Fsize,Fpr)   \
  361.         addi    r.12,r.sp,(Fsize)-(8*Fpr)
  362.  
  363. #define __unsetFrameblr(Fsize,Fpr)    \
  364.         mtlr    r.0              ;     \
  365.         addi    r.sp,r.sp,Fsize  ;     \
  366.         blr
  367.  
  368. // Change __unsetFrameba to __unsetFrameb               IBMCDB
  369. #define __unsetFrameb(Fsize,Fpr)      \
  370.         addi    r.sp,r.sp,Fsize  ;     \
  371.         blr
  372.  
  373. // Change __unsetFramebla to __unsetFramebl             IBMCDB
  374. #define __unsetFramebl(Fsize,Fpr)
  375.  
  376. #define __unsetFramenop(Fsize,Fpr)
  377.  
  378. // Change __setLRba to __setLRb                         IBMCDB
  379. #define __setLRb(Fsize,Fpr)           \
  380.         mtlr    r.0
  381.  
  382. // Change __setLRbla to __setLRbl                       IBMCDB
  383. #define __setLRbl(Fsize,Fpr)
  384.  
  385.  
  386. //
  387. // Restore number of GPRs specified
  388. //      setr  - determines how to remove the stack frame (mov or addi)
  389. //              mov  - will cause __unsetFramemov to be used
  390. //              addi - will cause __unsetFrameaddi to be used
  391. //      opret - if set to blr will cause GPR restore to return to caller
  392. //              only used for 0 GPRs and 0 FPRs
  393. //      op    - specifies instruction to be used for the call to the
  394. //              restore millicode (ba, bla) - Changed to (b, bl)    IBMCDB
  395. //      Fsize - stack frame size
  396. //      Fpr   - number of FPRs to be restored
  397. //
  398. #define __restgpr0(setr,opret,op,Fsize,Fpr)       \
  399.         __unsetFrame##opret(Fsize,Fpr)
  400. #define __restgpr1(setr,opret,op,Fsize,Fpr)       \
  401.         __setLR##op(Fsize,Fpr)                    ;\
  402.         lwz     r.31,((Fsize)-(4+(8*Fpr)))(r.sp)  ;\
  403.         __unsetFrame##op(Fsize,Fpr)
  404. #define __restgpr2(setr,opret,op,Fsize,Fpr)       \
  405.         lwz     r.31,((Fsize)-(4+(8*Fpr)))(r.sp)  ;\
  406.         __setLR##op(Fsize,Fpr)                    ;\
  407.         lwz     r.30,((Fsize)-(8+(8*Fpr)))(r.sp)  ;\
  408.         __unsetFrame##op(Fsize,Fpr)
  409. #define __restgpr3(setr,opret,op,Fsize,Fpr)       \
  410.         lwz     r.31,((Fsize)-(4+(8*Fpr)))(r.sp)  ;\
  411.         __setLR##op(Fsize,Fpr)                    ;\
  412.         lwz     r.30,((Fsize)-(8+(8*Fpr)))(r.sp)  ;\
  413.         lwz     r.29,((Fsize)-(12+(8*Fpr)))(r.sp) ;\
  414.         __unsetFrame##op(Fsize,Fpr)
  415. #define __restgpr4(setr,opret,op,Fsize,Fpr)  \
  416.         __unsetFrame##setr(Fsize,Fpr)        ;\
  417.         op      _restgpr_28
  418. #define __restgpr5(setr,opret,op,Fsize,Fpr)  \
  419.         __unsetFrame##setr(Fsize,Fpr)        ;\
  420.         op      _restgpr_27
  421. #define __restgpr6(setr,opret,op,Fsize,Fpr)  \
  422.         __unsetFrame##setr(Fsize,Fpr)        ;\
  423.         op      _restgpr_26
  424. #define __restgpr7(setr,opret,op,Fsize,Fpr)  \
  425.         __unsetFrame##setr(Fsize,Fpr)        ;\
  426.         op      _restgpr_25
  427. #define __restgpr8(setr,opret,op,Fsize,Fpr)  \
  428.         __unsetFrame##setr(Fsize,Fpr)        ;\
  429.         op      _restgpr_24
  430. #define __restgpr9(setr,opret,op,Fsize,Fpr)  \
  431.         __unsetFrame##setr(Fsize,Fpr)        ;\
  432.         op      _restgpr_23
  433. #define __restgpr10(setr,opret,op,Fsize,Fpr) \
  434.         __unsetFrame##setr(Fsize,Fpr)        ;\
  435.         op      _restgpr_22
  436. #define __restgpr11(setr,opret,op,Fsize,Fpr) \
  437.         __unsetFrame##setr(Fsize,Fpr)        ;\
  438.         op      _restgpr_21
  439. #define __restgpr12(setr,opret,op,Fsize,Fpr) \
  440.         __unsetFrame##setr(Fsize,Fpr)        ;\
  441.         op      _restgpr_20
  442. #define __restgpr13(setr,opret,op,Fsize,Fpr) \
  443.         __unsetFrame##setr(Fsize,Fpr)        ;\
  444.         op      _restgpr_19
  445.  
  446.  
  447. #define __restgpr14(setr,opret,op,Fsize,Fpr) \
  448.         __unsetFrame##setr(Fsize,Fpr)        ;\
  449.         op      _restgpr_18
  450. #define __restgpr15(setr,opret,op,Fsize,Fpr) \
  451.         __unsetFrame##setr(Fsize,Fpr)        ;\
  452.         op      _restgpr_17
  453. #define __restgpr16(setr,opret,op,Fsize,Fpr) \
  454.         __unsetFrame##setr(Fsize,Fpr)        ;\
  455.         op      _restgpr_16
  456. #define __restgpr17(setr,opret,op,Fsize,Fpr) \
  457.         __unsetFrame##setr(Fsize,Fpr)        ;\
  458.         op      _restgpr_15
  459. #define __restgpr18(setr,opret,op,Fsize,Fpr) \
  460.         __unsetFrame##setr(Fsize,Fpr)        ;\
  461.         op      _restgpr_14
  462. #define __restgpr19(setr,opret,op,Fsize,Fpr) \
  463.         __unsetFrame##setr(Fsize,Fpr)        ;\
  464.         op      _restgpr_13
  465.  
  466. //
  467. // Set r.12 to GPR save location based on number of FPRs to save.
  468. //
  469. #define __setGPRFrm0(Fsize,Gpr,Fpr)          \
  470.         __savegpr##Gpr(mr,0)                 ;\
  471.         stwu    r.sp,-(Fsize)(r.sp)          ;\
  472.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  473. #define __setGPRFrm1(Fsize,Gpr,Fpr)          \
  474.         __savegpr##Gpr(subi,1)
  475. #define __setGPRFrm2(Fsize,Gpr,Fpr)          \
  476.         __savegpr##Gpr(subi,2)
  477. #define __setGPRFrm3(Fsize,Gpr,Fpr)          \
  478.         __savegpr##Gpr(subi,3)
  479. #define __setGPRFrm4(Fsize,Gpr,Fpr)          \
  480.         __savegpr##Gpr(subi,4)
  481. #define __setGPRFrm5(Fsize,Gpr,Fpr)          \
  482.         __savegpr##Gpr(subi,5)
  483. #define __setGPRFrm6(Fsize,Gpr,Fpr)          \
  484.         __savegpr##Gpr(subi,6)
  485. #define __setGPRFrm7(Fsize,Gpr,Fpr)          \
  486.         __savegpr##Gpr(subi,7)
  487. #define __setGPRFrm8(Fsize,Gpr,Fpr)          \
  488.         __savegpr##Gpr(subi,8)
  489. #define __setGPRFrm9(Fsize,Gpr,Fpr)          \
  490.         __savegpr##Gpr(subi,9)
  491. #define __setGPRFrm10(Fsize,Gpr,Fpr)         \
  492.         __savegpr##Gpr(subi,10)
  493. #define __setGPRFrm11(Fsize,Gpr,Fpr)         \
  494.         __savegpr##Gpr(subi,11)
  495. #define __setGPRFrm12(Fsize,Gpr,Fpr)         \
  496.         __savegpr##Gpr(subi,12)
  497. #define __setGPRFrm13(Fsize,Gpr,Fpr)         \
  498.         __savegpr##Gpr(subi,13)
  499.  
  500.  
  501. #define __setGPRFrm14(Fsize,Gpr,Fpr)         \
  502.         __savegpr##Gpr(subi,14)
  503. #define __setGPRFrm15(Fsize,Gpr,Fpr)         \
  504.         __savegpr##Gpr(subi,15)
  505. #define __setGPRFrm16(Fsize,Gpr,Fpr)         \
  506.         __savegpr##Gpr(subi,16)
  507. #define __setGPRFrm17(Fsize,Gpr,Fpr)         \
  508.         __savegpr##Gpr(subi,17)
  509. #define __setGPRFrm18(Fsize,Gpr,Fpr)         \
  510.         __savegpr##Gpr(subi,18)
  511.  
  512. //
  513. // Generate epilogue code for NESTED EXIT based on number of GPRs and FPRs
  514. // to be restored.
  515. //      Fsize - stack frame size
  516. //      Gpr   - number of GPRs to restore
  517. //      Fpr   - number of FPRs to restore
  518. //
  519. // Changed 3rd argument to __restgpr##Gpr in __unsetGPRFrm1 from ba to b      IBMCDB
  520. // Changed 3rd argument to __restgpr##Gpr in __unsetGPRFrm2-18 from bla to bl IBMCDB
  521. #define __unsetGPRFrm0(Fsize,Gpr,Fpr)           \
  522.         __restgpr##Gpr(mov,blr,b,Fsize,Fpr)
  523. #define __unsetGPRFrm1(Fsize,Gpr,Fpr)           \
  524.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  525.         mtlr    r.0                             ;\
  526.         lfd     f.31,((Fsize)-8)(r.sp)          ;\
  527.         addi    r.sp,r.sp,Fsize                 ;\
  528.         blr
  529. #define __unsetGPRFrm2(Fsize,Gpr,Fpr)           \
  530.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  531.         lfd     f.31,((Fsize)-8)(r.sp)          ;\
  532.         mtlr    r.0                             ;\
  533.         lfd     f.30,((Fsize)-16)(r.sp)         ;\
  534.         addi    r.sp,r.sp,Fsize                 ;\
  535.         blr
  536. #define __unsetGPRFrm3(Fsize,Gpr,Fpr)           \
  537.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  538.         lfd     f.31,((Fsize)-8)(r.sp)          ;\
  539.         mtlr    r.0                             ;\
  540.         lfd     f.30,((Fsize)-16)(r.sp)         ;\
  541.         lfd     f.29,((Fsize)-24)(r.sp)         ;\
  542.         addi    r.sp,r.sp,Fsize                 ;\
  543.         blr
  544. #define __unsetGPRFrm4(Fsize,Gpr,Fpr)           \
  545.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  546.         addi    r.sp,r.sp,Fsize                 ;\
  547.         mtlr    r.0                             ;\
  548.         __restfpr##Fpr
  549. #define __unsetGPRFrm5(Fsize,Gpr,Fpr)           \
  550.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  551.         addi    r.sp,r.sp,Fsize                 ;\
  552.         mtlr    r.0                             ;\
  553.         __restfpr##Fpr
  554. #define __unsetGPRFrm6(Fsize,Gpr,Fpr)           \
  555.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  556.         addi    r.sp,r.sp,Fsize                 ;\
  557.         mtlr    r.0                             ;\
  558.         __restfpr##Fpr
  559.  
  560.  
  561. #define __unsetGPRFrm7(Fsize,Gpr,Fpr)           \
  562.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  563.         addi    r.sp,r.sp,Fsize                 ;\
  564.         mtlr    r.0                             ;\
  565.         __restfpr##Fpr
  566. #define __unsetGPRFrm8(Fsize,Gpr,Fpr)           \
  567.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  568.         addi    r.sp,r.sp,Fsize                 ;\
  569.         mtlr    r.0                             ;\
  570.         __restfpr##Fpr
  571. #define __unsetGPRFrm9(Fsize,Gpr,Fpr)           \
  572.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  573.         addi    r.sp,r.sp,Fsize                 ;\
  574.         mtlr    r.0                             ;\
  575.         __restfpr##Fpr
  576. #define __unsetGPRFrm10(Fsize,Gpr,Fpr)          \
  577.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  578.         addi    r.sp,r.sp,Fsize                 ;\
  579.         mtlr    r.0                             ;\
  580.         __restfpr##Fpr
  581. #define __unsetGPRFrm11(Fsize,Gpr,Fpr)          \
  582.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  583.         addi    r.sp,r.sp,Fsize                 ;\
  584.         mtlr    r.0                             ;\
  585.         __restfpr##Fpr
  586. #define __unsetGPRFrm12(Fsize,Gpr,Fpr)          \
  587.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  588.         addi    r.sp,r.sp,Fsize                 ;\
  589.         mtlr    r.0                             ;\
  590.         __restfpr##Fpr
  591. #define __unsetGPRFrm13(Fsize,Gpr,Fpr)          \
  592.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  593.         addi    r.sp,r.sp,Fsize                 ;\
  594.         mtlr    r.0                             ;\
  595.         __restfpr##Fpr
  596. #define __unsetGPRFrm14(Fsize,Gpr,Fpr)          \
  597.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  598.         addi    r.sp,r.sp,Fsize                 ;\
  599.         mtlr    r.0                             ;\
  600.         __restfpr##Fpr
  601. #define __unsetGPRFrm15(Fsize,Gpr,Fpr)          \
  602.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  603.         addi    r.sp,r.sp,Fsize                 ;\
  604.         mtlr    r.0                             ;\
  605.         __restfpr##Fpr
  606. #define __unsetGPRFrm16(Fsize,Gpr,Fpr)          \
  607.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  608.         addi    r.sp,r.sp,Fsize                 ;\
  609.         mtlr    r.0                             ;\
  610.         __restfpr##Fpr
  611. #define __unsetGPRFrm17(Fsize,Gpr,Fpr)          \
  612.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  613.         addi    r.sp,r.sp,Fsize                 ;\
  614.         mtlr    r.0                             ;\
  615.         __restfpr##Fpr
  616. #define __unsetGPRFrm18(Fsize,Gpr,Fpr)          \
  617.         __restgpr##Gpr(addi,nop,bl,Fsize,Fpr)  ;\
  618.         addi    r.sp,r.sp,Fsize                 ;\
  619.         mtlr    r.0                             ;\
  620.         __restfpr##Fpr
  621.  
  622.  
  623. //
  624. // Save the number of FPRs specified inline or by branching to the appropriate
  625. // millicode procedure.
  626. //
  627. // Change bla to bl in __savefrp4-18            IBMCDB
  628. #define __savefpr0(Fsize,Gpr,Fpr)
  629. #define __savefpr1(Fsize,Gpr,Fpr)   \
  630.         stfd    f.31,-8(r.sp)       ;\
  631.         stwu    r.sp,-(Fsize)(r.sp) ;\
  632.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  633. #define __savefpr2(Fsize,Gpr,Fpr)   \
  634.         stfd    f.31,-8(r.sp)       ;\
  635.         stfd    f.30,-16(r.sp)      ;\
  636.         stwu    r.sp,-(Fsize)(r.sp) ;\
  637.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  638. #define __savefpr3(Fsize,Gpr,Fpr)   \
  639.         stfd    f.31,-8(r.sp)       ;\
  640.         stfd    f.30,-16(r.sp)      ;\
  641.         stfd    f.29,-24(r.sp)      ;\
  642.         stwu    r.sp,-(Fsize)(r.sp) ;\
  643.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  644. #define __savefpr4(Fsize,Gpr,Fpr)   \
  645.         bl      _savefpr_28       ;   \
  646.         stwu    r.sp,-(Fsize)(r.sp) ;\
  647.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  648. #define __savefpr5(Fsize,Gpr,Fpr)   \
  649.         bl      _savefpr_27       ;   \
  650.         stwu    r.sp,-(Fsize)(r.sp) ;\
  651.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  652. #define __savefpr6(Fsize,Gpr,Fpr)   \
  653.         bl      _savefpr_26       ;   \
  654.         stwu    r.sp,-(Fsize)(r.sp) ;\
  655.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  656. #define __savefpr7(Fsize,Gpr,Fpr)   \
  657.         bl      _savefpr_25       ;   \
  658.         stwu    r.sp,-(Fsize)(r.sp) ;\
  659.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  660. #define __savefpr8(Fsize,Gpr,Fpr)   \
  661.         bl      _savefpr_24       ;   \
  662.         stwu    r.sp,-(Fsize)(r.sp) ;\
  663.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  664. #define __savefpr9(Fsize,Gpr,Fpr)   \
  665.         bl      _savefpr_23       ;   \
  666.         stwu    r.sp,-(Fsize)(r.sp) ;\
  667.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  668. #define __savefpr10(Fsize,Gpr,Fpr)  \
  669.         bl      _savefpr_22       ;   \
  670.         stwu    r.sp,-(Fsize)(r.sp) ;\
  671.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  672. #define __savefpr11(Fsize,Gpr,Fpr)  \
  673.         bl      _savefpr_21       ;   \
  674.         stwu    r.sp,-(Fsize)(r.sp) ;\
  675.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  676. #define __savefpr12(Fsize,Gpr,Fpr)  \
  677.         bl      _savefpr_20       ;   \
  678.         stwu    r.sp,-(Fsize)(r.sp) ;\
  679.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  680. #define __savefpr13(Fsize,Gpr,Fpr)  \
  681.         bl      _savefpr_19       ;   \
  682.         stwu    r.sp,-(Fsize)(r.sp) ;\
  683.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  684. #define __savefpr14(Fsize,Gpr,Fpr)  \
  685.         bl      _savefpr_18       ;   \
  686.         stwu    r.sp,-(Fsize)(r.sp) ;\
  687.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  688. #define __savefpr15(Fsize,Gpr,Fpr)  \
  689.         bl      _savefpr_17       ;   \
  690.         stwu    r.sp,-(Fsize)(r.sp) ;\
  691.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  692. #define __savefpr16(Fsize,Gpr,Fpr)  \
  693.         bl      _savefpr_16       ;   \
  694.         stwu    r.sp,-(Fsize)(r.sp) ;\
  695.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  696. #define __savefpr17(Fsize,Gpr,Fpr)  \
  697.         bl      _savefpr_15       ;   \
  698.         stwu    r.sp,-(Fsize)(r.sp) ;\
  699.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  700. #define __savefpr18(Fsize,Gpr,Fpr)  \
  701.         bl      _savefpr_14       ;   \
  702.         stwu    r.sp,-(Fsize)(r.sp) ;\
  703.         stw     r.0,(Fsize)-(4*(Gpr+1)+(8 * Fpr))(r.sp)
  704.  
  705.  
  706. //
  707. // Restore the number of FPRs specified inline or by branching to the
  708. // appropriate millicode procedure.
  709. //
  710. // Changed ba to b in __restfpr4-18             IBMCDB
  711. #define __restfpr0
  712. #define __restfpr4              \
  713.         b       _restfpr_28
  714. #define __restfpr5              \
  715.         b       _restfpr_27
  716. #define __restfpr6              \
  717.         b       _restfpr_26
  718. #define __restfpr7              \
  719.         b       _restfpr_25
  720. #define __restfpr8              \
  721.         b       _restfpr_24
  722. #define __restfpr9              \
  723.         b       _restfpr_23
  724. #define __restfpr10             \
  725.         b       _restfpr_22
  726. #define __restfpr11             \
  727.         b       _restfpr_21
  728. #define __restfpr12             \
  729.         b       _restfpr_20
  730. #define __restfpr13             \
  731.         b       _restfpr_19
  732. #define __restfpr14             \
  733.         b       _restfpr_18
  734. #define __restfpr15             \
  735.         b       _restfpr_17
  736. #define __restfpr16             \
  737.         b       _restfpr_16
  738. #define __restfpr17             \
  739.         b       _restfpr_15
  740. #define __restfpr18             \
  741.         b       _restfpr_14
  742.  
  743. #endif // _KXPPC_C_HEADER_
  744.  
  745.  
  746. //**************************************************************************/
  747. //
  748. //      PPC Linkage support macros
  749. //
  750. //
  751. //**************************************************************************/
  752. //      Caller's stack frame is addressed via R1, which points to
  753. //      the stack frame header.  The 6 words following where R1 points
  754. //      comprise the header.  The area PRECEEDING R1 is where FPRs are saved,
  755. //      and the area preceeding that is where GPRs are saved.
  756. //
  757. //              |                                      |
  758. //              +--------------------------------------+
  759. //              |                                      |
  760. //              |                                      |
  761. //              |  Saved GPRs                          |
  762. //              |                                      |
  763. //              |                                      |
  764. //              |                                      |
  765. //              +--------------------------------------+
  766. //              |                                      |
  767. //              |                                      |
  768. //              |  Saved FPRs                          |
  769. //              |                                      |
  770. //              |                                      |
  771. //              |                                      |
  772. //   R1 ------> +------------------+-------------------+
  773. //              |  Back chain      |  Reserved         |
  774. //              +------------------+-------------------+
  775. //              |  Parameter Wd 0  |  Parameter Wd 1   |
  776. //              +------------------+-------------------+
  777. //              |  Parameter Wd 2  |  Parameter Wd 3   |
  778. //              +------------------+-------------------+
  779. //              |  Parameter Wd 4  |  Parameter Wd 5   |
  780. //              +------------------+-------------------+
  781. //              |  Parameter Wd 6  |  Parameter Wd 7   |
  782. //              +------------------+-------------------+
  783. //              |  ...                                 |
  784. //
  785. //      Offsets to various elements of stack frame header
  786.  
  787. #define STK_RSP         0
  788.  
  789. #define STK_HDR_SZ      8
  790. #define STK_P0          STK_HDR_SZ
  791. #define STK_P1          (STK_P0+4)
  792. #define STK_P2          (STK_P0+8)
  793. #define STK_P3          (STK_P0+12)
  794. #define STK_P4          (STK_P0+16)
  795. #define STK_P5          (STK_P0+20)
  796. #define STK_P6          (STK_P0+24)
  797. #define STK_P7          (STK_P0+28)
  798. #define STK_MIN_FRAME   40
  799.  
  800. #ifndef _KXPPC_C_HEADER_
  801.  
  802. //
  803. // Define procedure entry/exit macros
  804. //
  805. // Name  - Name of the nested procedure entry
  806. // Fsize - Stack frame size
  807. // Gprs  - Number of general purpose registers to save
  808. // Fprs  - Number of floating point registers to save
  809. //
  810.  
  811. //
  812. // For primary entry points (NESTED_ENTRY, LEAF_ENTRY), a function table
  813. // entry (for debugging, exception handling) is built.
  814. //
  815. // For all entry points, a function descriptor is built.
  816. //
  817. //
  818. // NESTED_ENTRY is used for routines that call other routines; a stack
  819. // frame is acquired and registers are saved.
  820. //
  821. // LEAF_ENTRY is used for routines that do not call other routines; no stack
  822. // frame is acquired and no registers are saved.
  823. //
  824. //
  825. // NESTED_ENTRY_EX and LEAF_ENTRY_EX are used when an exception or termination
  826. // handler is provided.
  827. //
  828. //
  829. // NESTED_ENTRY always saves the LR register. Fsize must account for this.
  830. // Fsize must be a multiple of 8 bytes.
  831. // Minimum stack frame size is 64 bytes.
  832. //
  833. //
  834. // The PROLOGUE_END macro must be coded in all routines that used NESTED_ENTRY
  835. // or NESTED_ENTRY_EX, because the function table entry refers to the label
  836. // that it generates.
  837. //
  838. // SPECIAL_ENTRY is a used for routines that function like a LEAF_ENTRY
  839. // but require some prologue for exception handling. An example of this
  840. // is a stack checking routine which must make a system call to get
  841. // the TEB pointer. The efficiency of a LEAF_ENTRY is needed, but also
  842. // parts of the NESTED_ENTRY are required for the system call.
  843. //
  844. // Just like the NESTED_ENTRY, SPECIAL_ENTRY requires the PROLOGUE_END
  845. // macro.
  846. //
  847. // FN_TABLE, DUMMY_ENTRY, and DUMMY_EXIT are used to construct the "prologues"
  848. // for low-level exception handling code.  These prologues are never executed,
  849. // but are present to allow unwinding through the hand-written low-level
  850. // assembly code.  See real0.s for examples.
  851.  
  852. //
  853. // The following macros are provided for coding by assembly language programmers
  854. //
  855.  
  856. #define NESTED_ENTRY(Name,Fsize,Gprs,Fprs)      \
  857.         __fntabentry(Name)                      ;\
  858.         __begintext(Name)                       ;\
  859.         mflr    r.0                             ;\
  860.         __setGPRFrm##Fprs(Fsize,Gprs,Fprs)      ;\
  861.         __savefpr##Fprs(Fsize,Gprs,Fprs)
  862.  
  863. #define NESTED_ENTRY_EX(Name,Fsize,Gprs,Fprs,LangHandler,Scope) \
  864.         __fntabentryEx(Name,LangHandler,Scope)  ;\
  865.         __begintext(Name)                       ;\
  866.         mflr    r.0                             ;\
  867.         __setGPRFrm##Fprs(Fsize,Gprs,Fprs)      ;\
  868.         __savefpr##Fprs(Fsize,Gprs,Fprs)
  869.  
  870. #define NESTED_ENTRY_S(Name,Fsize,Gprs,Fprs,Section) \
  871.         __fntabentry(Name)                      ;\
  872.         __begintext_S(Name,Section)             ;\
  873.         mflr    r.0                             ;\
  874.         __setGPRFrm##Fprs(Fsize,Gprs,Fprs)      ;\
  875.         __savefpr##Fprs(Fsize,Gprs,Fprs)
  876.  
  877. #define NESTED_ENTRY_EX_S(Name,Fsize,Gprs,Fprs,LangHandler,Scope,Section) \
  878.         __fntabentryEx(Name,LangHandler,Scope)  ;\
  879.         __begintext_S(Name,Section)             ;\
  880.         mflr    r.0                             ;\
  881.         __setGPRFrm##Fprs(Fsize,Gprs,Fprs)      ;\
  882.         __savefpr##Fprs(Fsize,Gprs,Fprs)
  883.  
  884. #define NESTED_EXIT(Name,Fsize,Gprs,Fprs)                    \
  885. Name##.epi:                                                     \
  886.         lwz     r.0,((Fsize)-(4*(Gprs+1)+(8*Fprs)))(r.sp)       ;\
  887.         __unsetGPRFrm##Fprs(Fsize,Gprs,Fprs)                    ;\
  888. Name##.end:
  889.  
  890. #define PROLOGUE_END(Name)      \
  891. Name##.body:
  892.  
  893. #define ALTERNATE_ENTRY(Name)           \
  894.         __begintext(Name)
  895.  
  896. #define LEAF_ENTRY(Name)                \
  897.         __begintext(Name)               ;\
  898. Name##.body:
  899.  
  900. #define LEAF_ENTRY_EX(Name,LangHandler,Scope) \
  901.         __begintext(Name)                     ;\
  902. Name##.body:
  903.  
  904. #define SPECIAL_ENTRY(Name)              \
  905.         __fntabentry(Name)               ;\
  906.         __begintext(Name)
  907.  
  908. #define DUMMY_ENTRY(Name)               \
  909.         __begintext(Name)
  910.  
  911. #define ALTERNATE_ENTRY_S(Name,Section) \
  912.         __begintext_S(Name,Section)
  913.  
  914. #define LEAF_ENTRY_S(Name,Section)      \
  915.         __begintext_S(Name,Section)     ;\
  916. Name##.body:
  917.  
  918. #define LEAF_ENTRY_EX_S(Name,LangHandler,Scope,Section) \
  919.         __begintext_S(Name,Section)           ;\
  920. Name##.body:
  921.  
  922. #define SPECIAL_ENTRY_S(Name,Section)    \
  923.         __fntabentry(Name)               ;\
  924.         __begintext_S(Name,Section)
  925.  
  926. #define DUMMY_ENTRY_S(Name,Section)     \
  927.         __begintext_S(Name,Section)
  928.  
  929. #define LEAF_EXIT(Name)                 \
  930.         blr                             ;\
  931. Name##.end:
  932.  
  933. #define ALTERNATE_EXIT(Name)            \
  934.         blr
  935.  
  936. #define SPECIAL_EXIT(Name)              \
  937.         blr                             ;\
  938. Name##.end:
  939.  
  940. #define DUMMY_EXIT(Name)                \
  941. Name##.end:
  942.  
  943. #define FN_TABLE(Name)                  \
  944.         __fntabentry(Name)
  945.  
  946. #define FN_TABLE_EX(Name,ExHandler,Data) \
  947.         __fntabentryEx(Name,ExHandler,Data)
  948.  
  949. //
  950. // Define special section "names" for use with the NESTED/LEAF_ENTRY_S
  951. // macros.   For the moment just define all possibilities as .text.
  952. //
  953.  
  954. #define _TEXT$normal    .text
  955. #define _TEXT$00        .text
  956. #define _TEXT$01        .text
  957.  
  958.  
  959. //
  960. // Internal macros, used by the above (not for programmer use)
  961. //
  962.  
  963. #define __fntabentry(Name)               \
  964.         .pdata                                          ;\
  965.         .align  2                                       ;\
  966.         .long   Name                                    ;\
  967.         .long   ( ((Name##.body-Name) >> 2) |              \
  968.                   (((Name##.end-Name) >> 2) << 8) )
  969.  
  970. #define __fntabentryEx(Name,ExHandler,Data)              \
  971.         .pdata                                          ;\
  972.         .align  2                                       ;\
  973.         .long   Name                                    ;\
  974.         .long   ( ((Name##.body-Name) >> 2) |              \
  975.                   (((Name##.end-Name) >> 2) << 8) |        \
  976.                   (1 << 31 ) )                          ;\
  977.         .text                                           ;\
  978.         .align  3                                       ;\
  979.         .long   ExHandler                               ;\
  980.         .long   Data
  981.  
  982.  
  983. #define __begintext(Name)                       \
  984.         .text                                   ;\
  985.         .align  2                               ;\
  986.         .globl  Name                            ;\
  987. Name:
  988.  
  989. #define __begintext_S(Name,Section)             \
  990.         .section Section                        ;\
  991.         .align  2                               ;\
  992.         .globl  Name                            ;\
  993. Name:
  994.  
  995. //
  996. // KIPCR(reg)
  997. //
  998. // Get address of KiPcr into reg
  999. //
  1000.  
  1001. #define KIPCR(reg) li   reg, 0xffffd000
  1002.  
  1003.  
  1004. //
  1005. // DISABLE_INTERRUPTS(p0,s0)
  1006. //
  1007. // Clear EXTERNAL INTERRUPT ENABLE bit in Machine State Register
  1008. // (bit MSR:EE).
  1009. //
  1010. // Returns OLD value in p0
  1011. // Destroys s0 (actually, s0 contains new value)
  1012.  
  1013. #define DISABLE_INTERRUPTS(p0, s0)                                      ; \
  1014.         mfmsr   p0                                                      ; \
  1015.         rlwinm  s0,p0,0,~MASK_SPR(MSR_EE,1)                             ; \
  1016.         mtmsr   s0
  1017.  
  1018. #define ENABLE_INTERRUPTS(p0) mtmsr     p0
  1019.  
  1020.  
  1021. #endif // _KXPPC_C_HEADER_
  1022.  
  1023.  
  1024. #ifndef _PPC601_
  1025. #define _PPC601_        601
  1026. #endif
  1027. #define PPC60X  _PPC601_
  1028.  
  1029. //
  1030. //  Exception entry reasons.  Passed to KiDispatchException from
  1031. //  exception entry routines.
  1032. //
  1033. #define ppc_machine_check       1
  1034. #define ppc_data_storage        2
  1035. #define ppc_instruction_storage 3
  1036. #define ppc_external            4
  1037. #define ppc_alignment           5
  1038. #define ppc_program             6
  1039. #define ppc_fp_unavailable      7
  1040. #define ppc_decrementer         8
  1041. #define ppc_direct_store_error  9
  1042. #define ppc_syscall             10
  1043. #define ppc_trace               11
  1044. #define ppc_fp_assist           12
  1045. #define ppc_run_mode            13
  1046. #define ppc_panic               256
  1047.  
  1048.  
  1049. #endif // _KXPPC_
  1050.