processor.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:30k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ASM_PPC64_PROCESSOR_H
  2. #define __ASM_PPC64_PROCESSOR_H
  3. /*
  4.  * Copyright (C) 2001 PPC 64 Team, IBM Corp
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License
  8.  * as published by the Free Software Foundation; either version
  9.  * 2 of the License, or (at your option) any later version.
  10.  */
  11. #include <linux/stringify.h>
  12. #ifndef __ASSEMBLY__
  13. #include <asm/atomic.h>
  14. #include <asm/ppcdebug.h>
  15. #include <asm/a.out.h>
  16. #endif
  17. #include <asm/ptrace.h>
  18. #include <asm/types.h>
  19. #include <asm/delay.h>
  20. /*
  21.  * Default implementation of macro that returns current
  22.  * instruction pointer ("program counter").
  23.  */
  24. #define current_text_addr() ({ __label__ _l; _l: &&_l;})
  25. /* Machine State Register (MSR) Fields */
  26. #define MSR_SF_LG 63              /* Enable 64 bit mode */
  27. #define MSR_ISF_LG 61              /* Interrupt 64b mode valid on 630 */
  28. #define MSR_HV_LG  60              /* Hypervisor state */
  29. #define MSR_VEC_LG 25         /* Enable AltiVec */
  30. #define MSR_POW_LG 18 /* Enable Power Management */
  31. #define MSR_WE_LG 18 /* Wait State Enable */
  32. #define MSR_TGPR_LG 17 /* TLB Update registers in use */
  33. #define MSR_CE_LG 17 /* Critical Interrupt Enable */
  34. #define MSR_ILE_LG 16 /* Interrupt Little Endian */
  35. #define MSR_EE_LG 15 /* External Interrupt Enable */
  36. #define MSR_PR_LG 14 /* Problem State / Privilege Level */
  37. #define MSR_FP_LG 13 /* Floating Point enable */
  38. #define MSR_ME_LG 12 /* Machine Check Enable */
  39. #define MSR_FE0_LG 11 /* Floating Exception mode 0 */
  40. #define MSR_SE_LG 10 /* Single Step */
  41. #define MSR_BE_LG 9 /* Branch Trace */
  42. #define MSR_DE_LG 9  /* Debug Exception Enable */
  43. #define MSR_FE1_LG 8 /* Floating Exception mode 1 */
  44. #define MSR_IP_LG 6 /* Exception prefix 0x000/0xFFF */
  45. #define MSR_IR_LG 5  /* Instruction Relocate */
  46. #define MSR_DR_LG 4  /* Data Relocate */
  47. #define MSR_PE_LG 3 /* Protection Enable */
  48. #define MSR_PX_LG 2 /* Protection Exclusive Mode */
  49. #define MSR_RI_LG 1 /* Recoverable Exception */
  50. #define MSR_LE_LG 0  /* Little Endian */
  51. #ifdef __ASSEMBLY__
  52. #define __MASK(X) (1<<(X))
  53. #else
  54. #define __MASK(X) (1UL<<(X))
  55. #endif
  56. #define MSR_SF __MASK(MSR_SF_LG) /* Enable 64 bit mode */
  57. #define MSR_ISF __MASK(MSR_ISF_LG) /* Interrupt 64b mode valid on 630 */
  58. #define MSR_HV  __MASK(MSR_HV_LG) /* Hypervisor state */
  59. #define MSR_VEC __MASK(MSR_VEC_LG) /* Enable AltiVec */
  60. #define MSR_POW __MASK(MSR_POW_LG) /* Enable Power Management */
  61. #define MSR_WE __MASK(MSR_WE_LG) /* Wait State Enable */
  62. #define MSR_TGPR __MASK(MSR_TGPR_LG) /* TLB Update registers in use */
  63. #define MSR_CE __MASK(MSR_CE_LG) /* Critical Interrupt Enable */
  64. #define MSR_ILE __MASK(MSR_ILE_LG) /* Interrupt Little Endian */
  65. #define MSR_EE __MASK(MSR_EE_LG) /* External Interrupt Enable */
  66. #define MSR_PR __MASK(MSR_PR_LG) /* Problem State / Privilege Level */
  67. #define MSR_FP __MASK(MSR_FP_LG) /* Floating Point enable */
  68. #define MSR_ME __MASK(MSR_ME_LG) /* Machine Check Enable */
  69. #define MSR_FE0 __MASK(MSR_FE0_LG) /* Floating Exception mode 0 */
  70. #define MSR_SE __MASK(MSR_SE_LG) /* Single Step */
  71. #define MSR_BE __MASK(MSR_BE_LG) /* Branch Trace */
  72. #define MSR_DE __MASK(MSR_DE_LG) /* Debug Exception Enable */
  73. #define MSR_FE1 __MASK(MSR_FE1_LG) /* Floating Exception mode 1 */
  74. #define MSR_IP __MASK(MSR_IP_LG) /* Exception prefix 0x000/0xFFF */
  75. #define MSR_IR __MASK(MSR_IR_LG) /* Instruction Relocate */
  76. #define MSR_DR __MASK(MSR_DR_LG) /* Data Relocate */
  77. #define MSR_PE __MASK(MSR_PE_LG) /* Protection Enable */
  78. #define MSR_PX __MASK(MSR_PX_LG) /* Protection Exclusive Mode */
  79. #define MSR_RI __MASK(MSR_RI_LG) /* Recoverable Exception */
  80. #define MSR_LE __MASK(MSR_LE_LG) /* Little Endian */
  81. #define MSR_ MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF
  82. #define MSR_KERNEL      MSR_ | MSR_SF | MSR_HV
  83. #define MSR_USER32 MSR_ | MSR_PR | MSR_EE
  84. #define MSR_USER64 MSR_USER32 | MSR_SF
  85. /* Floating Point Status and Control Register (FPSCR) Fields */
  86. #define FPSCR_FX 0x80000000 /* FPU exception summary */
  87. #define FPSCR_FEX 0x40000000 /* FPU enabled exception summary */
  88. #define FPSCR_VX 0x20000000 /* Invalid operation summary */
  89. #define FPSCR_OX 0x10000000 /* Overflow exception summary */
  90. #define FPSCR_UX 0x08000000 /* Underflow exception summary */
  91. #define FPSCR_ZX 0x04000000 /* Zero-divide exception summary */
  92. #define FPSCR_XX 0x02000000 /* Inexact exception summary */
  93. #define FPSCR_VXSNAN 0x01000000 /* Invalid op for SNaN */
  94. #define FPSCR_VXISI 0x00800000 /* Invalid op for Inv - Inv */
  95. #define FPSCR_VXIDI 0x00400000 /* Invalid op for Inv / Inv */
  96. #define FPSCR_VXZDZ 0x00200000 /* Invalid op for Zero / Zero */
  97. #define FPSCR_VXIMZ 0x00100000 /* Invalid op for Inv * Zero */
  98. #define FPSCR_VXVC 0x00080000 /* Invalid op for Compare */
  99. #define FPSCR_FR 0x00040000 /* Fraction rounded */
  100. #define FPSCR_FI 0x00020000 /* Fraction inexact */
  101. #define FPSCR_FPRF 0x0001f000 /* FPU Result Flags */
  102. #define FPSCR_FPCC 0x0000f000 /* FPU Condition Codes */
  103. #define FPSCR_VXSOFT 0x00000400 /* Invalid op for software request */
  104. #define FPSCR_VXSQRT 0x00000200 /* Invalid op for square root */
  105. #define FPSCR_VXCVI 0x00000100 /* Invalid op for integer convert */
  106. #define FPSCR_VE 0x00000080 /* Invalid op exception enable */
  107. #define FPSCR_OE 0x00000040 /* IEEE overflow exception enable */
  108. #define FPSCR_UE 0x00000020 /* IEEE underflow exception enable */
  109. #define FPSCR_ZE 0x00000010 /* IEEE zero divide exception enable */
  110. #define FPSCR_XE 0x00000008 /* FP inexact exception enable */
  111. #define FPSCR_NI 0x00000004 /* FPU non IEEE-Mode */
  112. #define FPSCR_RN 0x00000003 /* FPU rounding control */
  113. /* Special Purpose Registers (SPRNs)*/
  114. #define SPRN_CDBCR 0x3D7 /* Cache Debug Control Register */
  115. #define SPRN_CTR 0x009 /* Count Register */
  116. #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */
  117. #define SPRN_DAC1 0x3F6 /* Data Address Compare 1 */
  118. #define SPRN_DAC2 0x3F7 /* Data Address Compare 2 */
  119. #define SPRN_DAR 0x013 /* Data Address Register */
  120. #define SPRN_DBAT0L 0x219 /* Data BAT 0 Lower Register */
  121. #define SPRN_DBAT0U 0x218 /* Data BAT 0 Upper Register */
  122. #define SPRN_DBAT1L 0x21B /* Data BAT 1 Lower Register */
  123. #define SPRN_DBAT1U 0x21A /* Data BAT 1 Upper Register */
  124. #define SPRN_DBAT2L 0x21D /* Data BAT 2 Lower Register */
  125. #define SPRN_DBAT2U 0x21C /* Data BAT 2 Upper Register */
  126. #define SPRN_DBAT3L 0x21F /* Data BAT 3 Lower Register */
  127. #define SPRN_DBAT3U 0x21E /* Data BAT 3 Upper Register */
  128. #define SPRN_DBCR 0x3F2 /* Debug Control Regsiter */
  129. #define   DBCR_EDM 0x80000000
  130. #define   DBCR_IDM 0x40000000
  131. #define   DBCR_RST(x) (((x) & 0x3) << 28)
  132. #define     DBCR_RST_NONE        0
  133. #define     DBCR_RST_CORE        1
  134. #define     DBCR_RST_CHIP        2
  135. #define     DBCR_RST_SYSTEM 3
  136. #define   DBCR_IC 0x08000000 /* Instruction Completion Debug Evnt */
  137. #define   DBCR_BT 0x04000000 /* Branch Taken Debug Event */
  138. #define   DBCR_EDE 0x02000000 /* Exception Debug Event */
  139. #define   DBCR_TDE 0x01000000 /* TRAP Debug Event */
  140. #define   DBCR_FER 0x00F80000 /* First Events Remaining Mask */
  141. #define   DBCR_FT 0x00040000 /* Freeze Timers on Debug Event */
  142. #define   DBCR_IA1 0x00020000 /* Instr. Addr. Compare 1 Enable */
  143. #define   DBCR_IA2 0x00010000 /* Instr. Addr. Compare 2 Enable */
  144. #define   DBCR_D1R 0x00008000 /* Data Addr. Compare 1 Read Enable */
  145. #define   DBCR_D1W 0x00004000 /* Data Addr. Compare 1 Write Enable */
  146. #define   DBCR_D1S(x) (((x) & 0x3) << 12) /* Data Adrr. Compare 1 Size */
  147. #define     DAC_BYTE 0
  148. #define     DAC_HALF 1
  149. #define     DAC_WORD 2
  150. #define     DAC_QUAD 3
  151. #define   DBCR_D2R 0x00000800 /* Data Addr. Compare 2 Read Enable */
  152. #define   DBCR_D2W 0x00000400 /* Data Addr. Compare 2 Write Enable */
  153. #define   DBCR_D2S(x) (((x) & 0x3) << 8) /* Data Addr. Compare 2 Size */
  154. #define   DBCR_SBT 0x00000040 /* Second Branch Taken Debug Event */
  155. #define   DBCR_SED 0x00000020 /* Second Exception Debug Event */
  156. #define   DBCR_STD 0x00000010 /* Second Trap Debug Event */
  157. #define   DBCR_SIA 0x00000008 /* Second IAC Enable */
  158. #define   DBCR_SDA 0x00000004 /* Second DAC Enable */
  159. #define   DBCR_JOI 0x00000002 /* JTAG Serial Outbound Int. Enable */
  160. #define   DBCR_JII 0x00000001 /* JTAG Serial Inbound Int. Enable */
  161. #define SPRN_DBCR0 0x3F2 /* Debug Control Register 0 */
  162. #define SPRN_DBCR1 0x3BD /* Debug Control Register 1 */
  163. #define SPRN_DBSR 0x3F0 /* Debug Status Register */
  164. #define SPRN_DCCR 0x3FA /* Data Cache Cacheability Register */
  165. #define   DCCR_NOCACHE 0 /* Noncacheable */
  166. #define   DCCR_CACHE 1 /* Cacheable */
  167. #define SPRN_DCMP 0x3D1 /* Data TLB Compare Register */
  168. #define SPRN_DCWR 0x3BA /* Data Cache Write-thru Register */
  169. #define   DCWR_COPY 0 /* Copy-back */
  170. #define   DCWR_WRITE 1 /* Write-through */
  171. #define SPRN_DEAR 0x3D5 /* Data Error Address Register */
  172. #define SPRN_DEC 0x016 /* Decrement Register */
  173. #define SPRN_DMISS 0x3D0 /* Data TLB Miss Register */
  174. #define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */
  175. #define SPRN_EAR 0x11A /* External Address Register */
  176. #define SPRN_ESR 0x3D4 /* Exception Syndrome Register */
  177. #define   ESR_IMCP 0x80000000 /* Instr. Machine Check - Protection */
  178. #define   ESR_IMCN 0x40000000 /* Instr. Machine Check - Non-config */
  179. #define   ESR_IMCB 0x20000000 /* Instr. Machine Check - Bus error */
  180. #define   ESR_IMCT 0x10000000 /* Instr. Machine Check - Timeout */
  181. #define   ESR_PIL 0x08000000 /* Program Exception - Illegal */
  182. #define   ESR_PPR 0x04000000 /* Program Exception - Priveleged */
  183. #define   ESR_PTR 0x02000000 /* Program Exception - Trap */
  184. #define   ESR_DST 0x00800000 /* Storage Exception - Data miss */
  185. #define   ESR_DIZ 0x00400000 /* Storage Exception - Zone fault */
  186. #define SPRN_EVPR 0x3D6 /* Exception Vector Prefix Register */
  187. #define SPRN_HASH1 0x3D2 /* Primary Hash Address Register */
  188. #define SPRN_HASH2 0x3D3 /* Secondary Hash Address Resgister */
  189. #define SPRN_HID0 0x3F0 /* Hardware Implementation Register 0 */
  190. #define   HID0_EMCP (1<<31) /* Enable Machine Check pin */
  191. #define   HID0_EBA (1<<29) /* Enable Bus Address Parity */
  192. #define   HID0_EBD (1<<28) /* Enable Bus Data Parity */
  193. #define   HID0_SBCLK (1<<27)
  194. #define   HID0_EICE (1<<26)
  195. #define   HID0_ECLK (1<<25)
  196. #define   HID0_PAR (1<<24)
  197. #define   HID0_DOZE (1<<23)
  198. #define   HID0_NAP (1<<22)
  199. #define   HID0_SLEEP (1<<21)
  200. #define   HID0_DPM (1<<20)
  201. #define   HID0_ICE (1<<15) /* Instruction Cache Enable */
  202. #define   HID0_DCE (1<<14) /* Data Cache Enable */
  203. #define   HID0_ILOCK (1<<13) /* Instruction Cache Lock */
  204. #define   HID0_DLOCK (1<<12) /* Data Cache Lock */
  205. #define   HID0_ICFI (1<<11) /* Instr. Cache Flash Invalidate */
  206. #define   HID0_DCI (1<<10) /* Data Cache Invalidate */
  207. #define   HID0_SPD (1<<9) /* Speculative disable */
  208. #define   HID0_SGE (1<<7) /* Store Gathering Enable */
  209. #define   HID0_SIED (1<<7) /* Serial Instr. Execution [Disable] */
  210. #define   HID0_BTIC (1<<5) /* Branch Target Instruction Cache Enable */
  211. #define   HID0_ABE (1<<3) /* Address Broadcast Enable */
  212. #define   HID0_BHTE (1<<2) /* Branch History Table Enable */
  213. #define   HID0_BTCD (1<<1) /* Branch target cache disable */
  214. #define SPRN_MSRDORM 0x3F1 /* Hardware Implementation Register 1 */
  215. #define SPRN_IABR 0x3F2 /* Instruction Address Breakpoint Register */
  216. #define SPRN_NIADORM 0x3F3 /* Hardware Implementation Register 2 */
  217. #define SPRN_TSC  0x3FD /* Thread switch control */
  218. #define SPRN_TST  0x3FC /* Thread switch timeout */
  219. #define SPRN_IAC1 0x3F4 /* Instruction Address Compare 1 */
  220. #define SPRN_IAC2 0x3F5 /* Instruction Address Compare 2 */
  221. #define SPRN_IBAT0L 0x211 /* Instruction BAT 0 Lower Register */
  222. #define SPRN_IBAT0U 0x210 /* Instruction BAT 0 Upper Register */
  223. #define SPRN_IBAT1L 0x213 /* Instruction BAT 1 Lower Register */
  224. #define SPRN_IBAT1U 0x212 /* Instruction BAT 1 Upper Register */
  225. #define SPRN_IBAT2L 0x215 /* Instruction BAT 2 Lower Register */
  226. #define SPRN_IBAT2U 0x214 /* Instruction BAT 2 Upper Register */
  227. #define SPRN_IBAT3L 0x217 /* Instruction BAT 3 Lower Register */
  228. #define SPRN_IBAT3U 0x216 /* Instruction BAT 3 Upper Register */
  229. #define SPRN_ICCR 0x3FB /* Instruction Cache Cacheability Register */
  230. #define   ICCR_NOCACHE 0 /* Noncacheable */
  231. #define   ICCR_CACHE 1 /* Cacheable */
  232. #define SPRN_ICDBDR 0x3D3 /* Instruction Cache Debug Data Register */
  233. #define SPRN_ICMP 0x3D5 /* Instruction TLB Compare Register */
  234. #define SPRN_ICTC 0x3FB /* Instruction Cache Throttling Control Reg */
  235. #define SPRN_IMISS 0x3D4 /* Instruction TLB Miss Register */
  236. #define SPRN_IMMR 0x27E   /* Internal Memory Map Register */
  237. #define SPRN_L2CR 0x3F9 /* Level 2 Cache Control Regsiter */
  238. #define SPRN_LR 0x008 /* Link Register */
  239. #define SPRN_PBL1 0x3FC /* Protection Bound Lower 1 */
  240. #define SPRN_PBL2 0x3FE /* Protection Bound Lower 2 */
  241. #define SPRN_PBU1 0x3FD /* Protection Bound Upper 1 */
  242. #define SPRN_PBU2 0x3FF /* Protection Bound Upper 2 */
  243. #define SPRN_PID 0x3B1 /* Process ID */
  244. #define SPRN_PIR 0x3FF /* Processor Identification Register */
  245. #define SPRN_PIT 0x3DB /* Programmable Interval Timer */
  246. #define SPRN_PVR 0x11F /* Processor Version Register */
  247. #define SPRN_RPA 0x3D6 /* Required Physical Address Register */
  248. #define SPRN_SDR1 0x019 /* MMU Hash Base Register */
  249. #define SPRN_SGR 0x3B9 /* Storage Guarded Register */
  250. #define   SGR_NORMAL 0
  251. #define   SGR_GUARDED 1
  252. #define SPRN_SPRG0 0x110 /* Special Purpose Register General 0 */
  253. #define SPRN_SPRG1 0x111 /* Special Purpose Register General 1 */
  254. #define SPRN_SPRG2 0x112 /* Special Purpose Register General 2 */
  255. #define SPRN_SPRG3 0x113 /* Special Purpose Register General 3 */
  256. #define SPRN_SRR0 0x01A /* Save/Restore Register 0 */
  257. #define SPRN_SRR1 0x01B /* Save/Restore Register 1 */
  258. #define SPRN_SRR2 0x3DE /* Save/Restore Register 2 */
  259. #define SPRN_SRR3  0x3DF /* Save/Restore Register 3 */
  260. #define SPRN_TBHI 0x3DC /* Time Base High */
  261. #define SPRN_TBHU 0x3CC /* Time Base High User-mode */
  262. #define SPRN_TBLO 0x3DD /* Time Base Low */
  263. #define SPRN_TBLU 0x3CD /* Time Base Low User-mode */
  264. #define SPRN_TBRL 0x10D /* Time Base Read Lower Register */
  265. #define SPRN_TBRU 0x10C /* Time Base Read Upper Register */
  266. #define SPRN_TBWL 0x11D /* Time Base Write Lower Register */
  267. #define SPRN_TBWU 0x11C /* Time Base Write Upper Register */
  268. #define SPRN_TCR 0x3DA /* Timer Control Register */
  269. #define   TCR_WP(x) (((x)&0x3)<<30) /* WDT Period */
  270. #define     WP_2_17 0 /* 2^17 clocks */
  271. #define     WP_2_21 1 /* 2^21 clocks */
  272. #define     WP_2_25 2 /* 2^25 clocks */
  273. #define     WP_2_29 3 /* 2^29 clocks */
  274. #define   TCR_WRC(x) (((x)&0x3)<<28) /* WDT Reset Control */
  275. #define     WRC_NONE 0 /* No reset will occur */
  276. #define     WRC_CORE 1 /* Core reset will occur */
  277. #define     WRC_CHIP 2 /* Chip reset will occur */
  278. #define     WRC_SYSTEM 3 /* System reset will occur */
  279. #define   TCR_WIE 0x08000000 /* WDT Interrupt Enable */
  280. #define   TCR_PIE 0x04000000 /* PIT Interrupt Enable */
  281. #define   TCR_FP(x) (((x)&0x3)<<24) /* FIT Period */
  282. #define     FP_2_9 0 /* 2^9 clocks */
  283. #define     FP_2_13 1 /* 2^13 clocks */
  284. #define     FP_2_17 2 /* 2^17 clocks */
  285. #define     FP_2_21 3 /* 2^21 clocks */
  286. #define   TCR_FIE 0x00800000 /* FIT Interrupt Enable */
  287. #define   TCR_ARE 0x00400000 /* Auto Reload Enable */
  288. #define SPRN_THRM1 0x3FC /* Thermal Management Register 1 */
  289. #define   THRM1_TIN (1<<0)
  290. #define   THRM1_TIV (1<<1)
  291. #define   THRM1_THRES (0x7f<<2)
  292. #define   THRM1_TID (1<<29)
  293. #define   THRM1_TIE (1<<30)
  294. #define   THRM1_V (1<<31)
  295. #define SPRN_THRM2 0x3FD /* Thermal Management Register 2 */
  296. #define SPRN_THRM3 0x3FE /* Thermal Management Register 3 */
  297. #define   THRM3_E (1<<31)
  298. #define SPRN_TSR 0x3D8 /* Timer Status Register */
  299. #define   TSR_ENW 0x80000000 /* Enable Next Watchdog */
  300. #define   TSR_WIS 0x40000000 /* WDT Interrupt Status */
  301. #define   TSR_WRS(x) (((x)&0x3)<<28) /* WDT Reset Status */
  302. #define     WRS_NONE 0 /* No WDT reset occurred */
  303. #define     WRS_CORE 1 /* WDT forced core reset */
  304. #define     WRS_CHIP 2 /* WDT forced chip reset */
  305. #define     WRS_SYSTEM 3 /* WDT forced system reset */
  306. #define   TSR_PIS 0x08000000 /* PIT Interrupt Status */
  307. #define   TSR_FIS 0x04000000 /* FIT Interrupt Status */
  308. #define SPRN_XER 0x001 /* Fixed Point Exception Register */
  309. #define SPRN_ZPR 0x3B0 /* Zone Protection Register */
  310. /* Short-hand versions for a number of the above SPRNs */
  311. #define CTR SPRN_CTR /* Counter Register */
  312. #define DAR SPRN_DAR /* Data Address Register */
  313. #define DABR SPRN_DABR /* Data Address Breakpoint Register */
  314. #define DBAT0L SPRN_DBAT0L /* Data BAT 0 Lower Register */
  315. #define DBAT0U SPRN_DBAT0U /* Data BAT 0 Upper Register */
  316. #define DBAT1L SPRN_DBAT1L /* Data BAT 1 Lower Register */
  317. #define DBAT1U SPRN_DBAT1U /* Data BAT 1 Upper Register */
  318. #define DBAT2L SPRN_DBAT2L /* Data BAT 2 Lower Register */
  319. #define DBAT2U SPRN_DBAT2U /* Data BAT 2 Upper Register */
  320. #define DBAT3L SPRN_DBAT3L /* Data BAT 3 Lower Register */
  321. #define DBAT3U SPRN_DBAT3U /* Data BAT 3 Upper Register */
  322. #define DCMP SPRN_DCMP       /* Data TLB Compare Register */
  323. #define DEC SPRN_DEC        /* Decrement Register */
  324. #define DMISS SPRN_DMISS      /* Data TLB Miss Register */
  325. #define DSISR SPRN_DSISR /* Data Storage Interrupt Status Register */
  326. #define EAR SPRN_EAR        /* External Address Register */
  327. #define HASH1 SPRN_HASH1 /* Primary Hash Address Register */
  328. #define HASH2 SPRN_HASH2 /* Secondary Hash Address Register */
  329. #define HID0 SPRN_HID0 /* Hardware Implementation Register 0 */
  330. #define MSRDORM SPRN_MSRDORM /* MSR Dormant Register */
  331. #define NIADORM SPRN_NIADORM /* NIA Dormant Register */
  332. #define TSC     SPRN_TSC  /* Thread switch control */
  333. #define TST     SPRN_TST  /* Thread switch timeout */
  334. #define IABR SPRN_IABR       /* Instruction Address Breakpoint Register */
  335. #define IBAT0L SPRN_IBAT0L /* Instruction BAT 0 Lower Register */
  336. #define IBAT0U SPRN_IBAT0U /* Instruction BAT 0 Upper Register */
  337. #define IBAT1L SPRN_IBAT1L /* Instruction BAT 1 Lower Register */
  338. #define IBAT1U SPRN_IBAT1U /* Instruction BAT 1 Upper Register */
  339. #define IBAT2L SPRN_IBAT2L /* Instruction BAT 2 Lower Register */
  340. #define IBAT2U SPRN_IBAT2U /* Instruction BAT 2 Upper Register */
  341. #define IBAT3L SPRN_IBAT3L /* Instruction BAT 3 Lower Register */
  342. #define IBAT3U SPRN_IBAT3U /* Instruction BAT 3 Upper Register */
  343. #define ICMP SPRN_ICMP /* Instruction TLB Compare Register */
  344. #define IMISS SPRN_IMISS /* Instruction TLB Miss Register */
  345. #define IMMR SPRN_IMMR       /* PPC 860/821 Internal Memory Map Register */
  346. #define L2CR SPRN_L2CR     /* PPC 750 L2 control register */
  347. #define LR SPRN_LR
  348. #define PVR SPRN_PVR /* Processor Version */
  349. #define PIR SPRN_PIR /* Processor ID */
  350. #define RPA SPRN_RPA /* Required Physical Address Register */
  351. #define SDR1 SPRN_SDR1       /* MMU hash base register */
  352. #define SPR0 SPRN_SPRG0 /* Supervisor Private Registers */
  353. #define SPR1 SPRN_SPRG1
  354. #define SPR2 SPRN_SPRG2
  355. #define SPR3 SPRN_SPRG3
  356. #define SPRG0   SPRN_SPRG0
  357. #define SPRG1   SPRN_SPRG1
  358. #define SPRG2   SPRN_SPRG2
  359. #define SPRG3   SPRN_SPRG3
  360. #define SRR0 SPRN_SRR0 /* Save and Restore Register 0 */
  361. #define SRR1 SPRN_SRR1 /* Save and Restore Register 1 */
  362. #define TBRL SPRN_TBRL /* Time Base Read Lower Register */
  363. #define TBRU SPRN_TBRU /* Time Base Read Upper Register */
  364. #define TBWL SPRN_TBWL /* Time Base Write Lower Register */
  365. #define TBWU SPRN_TBWU /* Time Base Write Upper Register */
  366. #define ICTC 1019
  367. #define THRM1 SPRN_THRM1 /* Thermal Management Register 1 */
  368. #define THRM2 SPRN_THRM2 /* Thermal Management Register 2 */
  369. #define THRM3 SPRN_THRM3 /* Thermal Management Register 3 */
  370. #define XER SPRN_XER
  371. #define PMC1 0x313
  372. #define PMC2 0x314
  373. #define PMC3 0x315
  374. #define PMC4 0x316
  375. #define PMC5 0x317
  376. #define PMC6 0x318
  377. #define PMC7 0x319
  378. #define PMC8 0x31a
  379. #define MMCR0 0x31b
  380. #define MMCR1 0x31e
  381. #define MMCRA 0x312
  382. #define SIAR 0x30c
  383. #define SDAR 0x30d
  384. /* Device Control Registers */
  385. #define DCRN_BEAR 0x090 /* Bus Error Address Register */
  386. #define DCRN_BESR 0x091 /* Bus Error Syndrome Register */
  387. #define   BESR_DSES     0x80000000 /* Data-Side Error Status */
  388. #define   BESR_DMES 0x40000000 /* DMA Error Status */
  389. #define   BESR_RWS 0x20000000 /* Read/Write Status */
  390. #define   BESR_ETMASK 0x1C000000 /* Error Type */
  391. #define     ET_PROT 0
  392. #define     ET_PARITY 1
  393. #define     ET_NCFG 2
  394. #define     ET_BUSERR 4
  395. #define     ET_BUSTO 6
  396. #define DCRN_DMACC0 0x0C4 /* DMA Chained Count Register 0 */
  397. #define DCRN_DMACC1 0x0CC /* DMA Chained Count Register 1 */
  398. #define DCRN_DMACC2 0x0D4 /* DMA Chained Count Register 2 */
  399. #define DCRN_DMACC3 0x0DC    /* DMA Chained Count Register 3 */
  400. #define DCRN_DMACR0 0x0C0    /* DMA Channel Control Register 0 */
  401. #define DCRN_DMACR1 0x0C8    /* DMA Channel Control Register 1 */
  402. #define DCRN_DMACR2 0x0D0    /* DMA Channel Control Register 2 */
  403. #define DCRN_DMACR3 0x0D8    /* DMA Channel Control Register 3 */
  404. #define DCRN_DMACT0 0x0C1    /* DMA Count Register 0 */
  405. #define DCRN_DMACT1 0x0C9    /* DMA Count Register 1 */
  406. #define DCRN_DMACT2 0x0D1    /* DMA Count Register 2 */
  407. #define DCRN_DMACT3 0x0D9    /* DMA Count Register 3 */
  408. #define DCRN_DMADA0 0x0C2    /* DMA Destination Address Register 0 */
  409. #define DCRN_DMADA1 0x0CA    /* DMA Destination Address Register 1 */
  410. #define DCRN_DMADA2 0x0D2    /* DMA Destination Address Register 2 */
  411. #define DCRN_DMADA3 0x0DA    /* DMA Destination Address Register 3 */
  412. #define DCRN_DMASA0 0x0C3    /* DMA Source Address Register 0 */
  413. #define DCRN_DMASA1 0x0CB    /* DMA Source Address Register 1 */
  414. #define DCRN_DMASA2 0x0D3    /* DMA Source Address Register 2 */
  415. #define DCRN_DMASA3 0x0DB    /* DMA Source Address Register 3 */
  416. #define DCRN_DMASR 0x0E0    /* DMA Status Register */
  417. #define DCRN_EXIER 0x042    /* External Interrupt Enable Register */
  418. #define   EXIER_CIE 0x80000000 /* Critical Interrupt Enable */
  419. #define   EXIER_SRIE 0x08000000 /* Serial Port Rx Int. Enable */
  420. #define   EXIER_STIE 0x04000000 /* Serial Port Tx Int. Enable */
  421. #define   EXIER_JRIE 0x02000000 /* JTAG Serial Port Rx Int. Enable */
  422. #define   EXIER_JTIE 0x01000000 /* JTAG Serial Port Tx Int. Enable */
  423. #define   EXIER_D0IE 0x00800000 /* DMA Channel 0 Interrupt Enable */
  424. #define   EXIER_D1IE 0x00400000 /* DMA Channel 1 Interrupt Enable */
  425. #define   EXIER_D2IE 0x00200000 /* DMA Channel 2 Interrupt Enable */
  426. #define   EXIER_D3IE 0x00100000 /* DMA Channel 3 Interrupt Enable */
  427. #define   EXIER_E0IE 0x00000010 /* External Interrupt 0 Enable */
  428. #define   EXIER_E1IE 0x00000008 /* External Interrupt 1 Enable */
  429. #define   EXIER_E2IE 0x00000004 /* External Interrupt 2 Enable */
  430. #define   EXIER_E3IE 0x00000002 /* External Interrupt 3 Enable */
  431. #define   EXIER_E4IE 0x00000001 /* External Interrupt 4 Enable */
  432. #define DCRN_EXISR 0x040    /* External Interrupt Status Register */
  433. #define DCRN_IOCR 0x0A0    /* Input/Output Configuration Register */
  434. #define   IOCR_E0TE 0x80000000
  435. #define   IOCR_E0LP 0x40000000
  436. #define   IOCR_E1TE 0x20000000
  437. #define   IOCR_E1LP 0x10000000
  438. #define   IOCR_E2TE 0x08000000
  439. #define   IOCR_E2LP 0x04000000
  440. #define   IOCR_E3TE 0x02000000
  441. #define   IOCR_E3LP 0x01000000
  442. #define   IOCR_E4TE 0x00800000
  443. #define   IOCR_E4LP 0x00400000
  444. #define   IOCR_EDT      0x00080000
  445. #define   IOCR_SOR      0x00040000
  446. #define   IOCR_EDO 0x00008000
  447. #define   IOCR_2XC 0x00004000
  448. #define   IOCR_ATC 0x00002000
  449. #define   IOCR_SPD 0x00001000
  450. #define   IOCR_BEM 0x00000800
  451. #define   IOCR_PTD 0x00000400
  452. #define   IOCR_ARE 0x00000080
  453. #define   IOCR_DRC 0x00000020
  454. #define   IOCR_RDM(x) (((x) & 0x3) << 3)
  455. #define   IOCR_TCS 0x00000004
  456. #define   IOCR_SCS 0x00000002
  457. #define   IOCR_SPC 0x00000001
  458. /* Processor Version Register */
  459. /* Processor Version Register (PVR) field extraction */
  460. #define PVR_VER(pvr)  (((pvr) >>  16) & 0xFFFF) /* Version field */
  461. #define PVR_REV(pvr)  (((pvr) >>   0) & 0xFFFF) /* Revison field */
  462. /* Processor Version Numbers */
  463. #define PV_NORTHSTAR 0x0033
  464. #define PV_PULSAR 0x0034
  465. #define PV_POWER4 0x0035
  466. #define PV_ICESTAR 0x0036
  467. #define PV_SSTAR 0x0037
  468. #define PV_POWER4p 0x0038
  469. #define PV_630         0x0040
  470. #define PV_630p         0x0041
  471. /* Platforms supported by PPC64 */
  472. #define PLATFORM_PSERIES      0x0100
  473. #define PLATFORM_PSERIES_LPAR 0x0101
  474. #define PLATFORM_ISERIES_LPAR 0x0201
  475. /*
  476.  * List of interrupt controllers.
  477.  */
  478. #define IC_INVALID    0
  479. #define IC_OPEN_PIC   1
  480. #define IC_PPC_XIC    2
  481. #define XGLUE(a,b) a##b
  482. #define GLUE(a,b) XGLUE(a,b)
  483. /*
  484.  * Begining of traceback info work for asm functions.
  485.  */
  486. #define TB_ASM 0x000C000000000000
  487. #define TB_GLOBALLINK 0x0000800000000000
  488. #define TB_IS_EPROL 0x0000400000000000
  489. #define TB_HAS_TBOFF 0x0000200000000000
  490. #define TB_INT_PROC 0x0000100000000000
  491. #define TB_HAS_CTL 0x0000080000000000
  492. #define TB_TOCLESS 0x0000040000000000
  493. #define TB_FP_PRESENT 0x0000020000000000
  494. #define TB_LOG_ABORT 0x0000010000000000
  495. #define TB_INT_HNDL 0x0000008000000000
  496. #define TB_NAME_PRESENT 0x0000004000000000
  497. #define TB_SAVES_CR 0x0000000200000000
  498. #define TB_SAVES_LR 0x0000000100000000
  499. #define TB_STORES_BC 0x0000000080000000
  500. #define TB_PARMINFO 0x000000000000FFFF
  501. #define TB_DEFAULT TB_ASM | TB_HAS_TBOFF | TB_NAME_PRESENT
  502. #ifdef __ASSEMBLY__
  503. #define _GLOBAL(name) 
  504. .section ".text"; 
  505. .align 2 ; 
  506. .globl name; 
  507. .globl GLUE(.,name); 
  508. .section ".opd","aw"; 
  509. name: 
  510. .quad GLUE(.,name); 
  511. .quad .TOC.@tocbase; 
  512. .quad 0; 
  513. .previous; 
  514. .type GLUE(.,name),@function; 
  515. GLUE(.,name):
  516. #define _STATIC(name) 
  517. .section ".text"; 
  518. .align 2 ; 
  519. .section ".opd","aw"; 
  520. name: 
  521. .quad GLUE(.,name); 
  522. .quad .TOC.@tocbase; 
  523. .quad 0; 
  524. .previous; 
  525. .type GLUE(.,name),@function; 
  526. GLUE(.,name):
  527. #define _TRACEBACK(NAME) 
  528. GLUE(.LT,NAME): ;
  529. .long 0 ;
  530. .llong TB_DEFAULT ;
  531. .long GLUE(.LT,NAME)-GLUE(.,NAME) ;
  532. .short GLUE(GLUE(.LT,NAME),_procname_end)-GLUE(GLUE(.LT,NAME),_procname_start) ;
  533. GLUE(GLUE(.LT,NAME),_procname_start): ;
  534. .ascii __stringify(NAME) ;
  535. GLUE(GLUE(.LT,NAME),_procname_end):
  536. #endif /* __ASSEMBLY__ */
  537. /* Macros for setting and retrieving special purpose registers */
  538. #define mfmsr() ({unsigned long rval; 
  539. asm volatile("mfmsr %0" : "=r" (rval)); rval;})
  540. #define mtmsrd(v) asm volatile("mtmsrd %0" : : "r" (v))
  541. #define mfspr(rn) ({unsigned long rval; 
  542. asm volatile("mfspr %0," __stringify(rn) 
  543.      : "=r" (rval)); rval;})
  544. #define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v))
  545. #define mftb() ({unsigned long rval;
  546. asm volatile("mftb %0" : "=r" (rval)); rval;})
  547. /* iSeries CTRL register (for runlatch) */
  548. #define CTRLT 0x098
  549. #define CTRLF 0x088
  550. #define RUNLATCH 0x0001
  551. #define RUN_FLAG 0x0002
  552. /* Macros for adjusting thread priority (hardware multi-threading) */
  553. #define HMT_low() asm volatile("or 1,1,1")
  554. #define HMT_medium() asm volatile("or 2,2,2")
  555. #define HMT_high() asm volatile("or 3,3,3")
  556. /* Size of an exception stack frame contained in the paca. */
  557. #define EXC_FRAME_SIZE 64
  558. #define mfasr() ({unsigned long rval; 
  559. asm volatile("mfasr %0" : "=r" (rval)); rval;})
  560. #ifndef __ASSEMBLY__
  561. extern int have_of;
  562. struct task_struct;
  563. void start_thread(struct pt_regs *regs, unsigned long fdptr, unsigned long sp);
  564. void release_thread(struct task_struct *);
  565. /*
  566.  * Create a new kernel thread.
  567.  */
  568. extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
  569. /*
  570.  * Bus types
  571.  */
  572. #define EISA_bus 0
  573. #define EISA_bus__is_a_macro /* for versions in ksyms.c */
  574. #define MCA_bus 0
  575. #define MCA_bus__is_a_macro /* for versions in ksyms.c */
  576. /* Lazy FPU handling on uni-processor */
  577. extern struct task_struct *last_task_used_math;
  578. #ifdef __KERNEL__
  579. /* 64-bit user address space is 41-bits (2TBs user VM) */
  580. #define TASK_SIZE_USER64 (0x0000020000000000UL)
  581. /* 
  582.  * 32-bit user address space is 4GB - 1 page 
  583.  * (this 1 page is needed so referencing of 0xFFFFFFFF generates EFAULT
  584.  */
  585. #define TASK_SIZE_USER32 (0x0000000100000000UL - (1*PAGE_SIZE))
  586. #define TASK_SIZE ((current->thread.flags & PPC_FLAG_32BIT) ? 
  587. TASK_SIZE_USER32 : TASK_SIZE_USER64)
  588. #endif /* __KERNEL__ */
  589. /* This decides where the kernel will search for a free chunk of vm
  590.  * space during mmap's.
  591.  */
  592. #define TASK_UNMAPPED_BASE_USER32 (STACK_TOP_USER32 / 4)
  593. #define TASK_UNMAPPED_BASE_USER64 (STACK_TOP_USER64 / 4)
  594. #define TASK_UNMAPPED_BASE (((current->thread.flags & PPC_FLAG_32BIT)||(ppcdebugset(PPCDBG_BINFMT_32ADDR))) ? 
  595. TASK_UNMAPPED_BASE_USER32 : TASK_UNMAPPED_BASE_USER64 )
  596. typedef struct {
  597. unsigned long seg;
  598. } mm_segment_t;
  599. struct thread_struct {
  600. unsigned long ksp; /* Kernel stack pointer */
  601. struct pt_regs *regs; /* Pointer to saved register state */
  602. mm_segment_t fs; /* for get_fs() validation */
  603. void *pgdir; /* root of page-table tree */
  604. signed long     last_syscall;
  605. unsigned long flags;
  606. double fpr[32]; /* Complete floating point set */
  607. unsigned long fpscr_pad; /* fpr ... fpscr must be contiguous */
  608. unsigned long fpscr; /* Floating point status */
  609. };
  610. #define PPC_FLAG_32BIT 0x01
  611. #define PPC_FLAG_RUN_LIGHT RUN_FLAG
  612. #define INIT_SP (sizeof(init_stack) + (unsigned long) &init_stack)
  613. #define INIT_THREAD  { 
  614. INIT_SP, /* ksp */ 
  615. (struct pt_regs *)INIT_SP - 1, /* regs */ 
  616. KERNEL_DS, /*fs*/ 
  617. swapper_pg_dir, /* pgdir */ 
  618. 0, /* last_syscall */ 
  619. PPC_FLAG_RUN_LIGHT, /* flags */ 
  620. {0}, 0, 0 
  621. }
  622. /*
  623.  * Note: the vm_start and vm_end fields here should *not*
  624.  * be in kernel space.  (Could vm_end == vm_start perhaps?)
  625.  */
  626. #define IOREMAP_MMAP { &ioremap_mm, 0, 0x1000, NULL, 
  627.     PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 
  628.     1, NULL, NULL }
  629. extern struct mm_struct ioremap_mm;
  630. /*
  631.  * Return saved PC of a blocked thread. For now, this is the "user" PC
  632.  */
  633. static inline unsigned long thread_saved_pc(struct thread_struct *t)
  634. {
  635. return (t->regs) ? t->regs->nip : 0;
  636. }
  637. #define copy_segments(tsk, mm) do { } while (0)
  638. #define release_segments(mm) do { } while (0)
  639. #define forget_segments() do { } while (0)
  640. unsigned long get_wchan(struct task_struct *p);
  641. #define KSTK_EIP(tsk)  ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0)
  642. #define KSTK_ESP(tsk)  ((tsk)->thread.regs? (tsk)->thread.regs->gpr[1]: 0)
  643. /*
  644.  * NOTE! The task struct and the stack go together
  645.  */
  646. #define THREAD_SIZE (4*PAGE_SIZE)
  647. struct task_struct * alloc_task_struct(void);
  648.         
  649. void free_task_struct(struct task_struct *);
  650. #define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count)
  651. #define init_task (init_task_union.task)
  652. #define init_stack (init_task_union.stack)
  653. #define cpu_relax()     udelay(1)
  654. /*
  655.  * Prefetch macros.
  656.  */
  657. #define ARCH_HAS_PREFETCH
  658. #define ARCH_HAS_PREFETCHW
  659. #define ARCH_HAS_SPINLOCK_PREFETCH
  660. static inline void prefetch(const void *x)
  661. {
  662. __asm__ __volatile__ ("dcbt 0,%0" : : "r" (x));
  663. }
  664. static inline void prefetchw(const void *x)
  665. {
  666. __asm__ __volatile__ ("dcbtst 0,%0" : : "r" (x));
  667. }
  668. #define spin_lock_prefetch(x) prefetchw(x)
  669. #define cpu_has_largepage() (__is_processor(PV_POWER4) || 
  670.  __is_processor(PV_POWER4p))
  671. #define cpu_has_slb() (__is_processor(PV_POWER4) || 
  672.  __is_processor(PV_POWER4p))
  673. #define cpu_has_tlbiel() (__is_processor(PV_POWER4) || 
  674.  __is_processor(PV_POWER4p))
  675. #define cpu_has_noexecute() (__is_processor(PV_POWER4) || 
  676.  __is_processor(PV_POWER4p))
  677. #endif /* ASSEMBLY */
  678. #endif /* __ASM_PPC64_PROCESSOR_H */