xtruntime-core-state.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /* xtruntime-core-state.h - core state save area (used eg. by PSO) */
  2. /* $Id: //depot/rel/Foxhill/dot.9/Xtensa/OS/include/xtensa/xtruntime-core-state.h#1 $ */
  3. /*
  4. * Copyright (c) 2012-2013 Tensilica Inc.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining
  7. * a copy of this software and associated documentation files (the
  8. * "Software"), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish,
  10. * distribute, sublicense, and/or sell copies of the Software, and to
  11. * permit persons to whom the Software is furnished to do so, subject to
  12. * the following conditions:
  13. *
  14. * The above copyright notice and this permission notice shall be included
  15. * in all copies or substantial portions of the Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  20. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  21. * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  22. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  23. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24. */
  25. #ifndef _XTOS_CORE_STATE_H_
  26. #define _XTOS_CORE_STATE_H_
  27. /* Import STRUCT_xxx macros for defining structures: */
  28. #include <xtensa/xtruntime-frames.h>
  29. #include <xtensa/config/core.h>
  30. #include <xtensa/config/tie.h>
  31. #if XCHAL_HAVE_IDMA
  32. #include <xtensa/idma.h>
  33. #endif
  34. //#define XTOS_PSO_TEST 1 // uncommented for internal PSO testing only
  35. #define CORE_STATE_SIGNATURE 0xB1C5AFED // pattern that indicates state was saved
  36. /*
  37. * Save area for saving entire core state, such as across Power Shut-Off (PSO).
  38. */
  39. STRUCT_BEGIN
  40. STRUCT_FIELD (long,4,CS_SA_,signature) // for checking whether state was saved
  41. STRUCT_FIELD (long,4,CS_SA_,restore_label)
  42. STRUCT_FIELD (long,4,CS_SA_,aftersave_label)
  43. STRUCT_AFIELD(long,4,CS_SA_,areg,XCHAL_NUM_AREGS)
  44. #if XCHAL_HAVE_WINDOWED
  45. STRUCT_AFIELD(long,4,CS_SA_,caller_regs,16) // save a max of 16 caller regs
  46. STRUCT_FIELD (long,4,CS_SA_,caller_regs_saved) // flag to show if caller regs saved
  47. #endif
  48. #if XCHAL_HAVE_PSO_CDM
  49. STRUCT_FIELD (long,4,CS_SA_,pwrctl)
  50. #endif
  51. #if XCHAL_HAVE_WINDOWED
  52. STRUCT_FIELD (long,4,CS_SA_,windowbase)
  53. STRUCT_FIELD (long,4,CS_SA_,windowstart)
  54. #endif
  55. STRUCT_FIELD (long,4,CS_SA_,sar)
  56. #if XCHAL_HAVE_EXCEPTIONS
  57. STRUCT_FIELD (long,4,CS_SA_,epc1)
  58. STRUCT_FIELD (long,4,CS_SA_,ps)
  59. STRUCT_FIELD (long,4,CS_SA_,excsave1)
  60. # ifdef XCHAL_DOUBLEEXC_VECTOR_VADDR
  61. STRUCT_FIELD (long,4,CS_SA_,depc)
  62. # endif
  63. #endif
  64. #if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 2
  65. STRUCT_AFIELD(long,4,CS_SA_,epc, XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1)
  66. STRUCT_AFIELD(long,4,CS_SA_,eps, XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1)
  67. STRUCT_AFIELD(long,4,CS_SA_,excsave,XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1)
  68. #endif
  69. #if XCHAL_HAVE_LOOPS
  70. STRUCT_FIELD (long,4,CS_SA_,lcount)
  71. STRUCT_FIELD (long,4,CS_SA_,lbeg)
  72. STRUCT_FIELD (long,4,CS_SA_,lend)
  73. #endif
  74. #if XCHAL_HAVE_ABSOLUTE_LITERALS
  75. STRUCT_FIELD (long,4,CS_SA_,litbase)
  76. #endif
  77. #if XCHAL_HAVE_VECBASE
  78. STRUCT_FIELD (long,4,CS_SA_,vecbase)
  79. #endif
  80. #if XCHAL_HAVE_S32C1I && (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0) /* have ATOMCTL ? */
  81. STRUCT_FIELD (long,4,CS_SA_,atomctl)
  82. #endif
  83. #if XCHAL_HAVE_PREFETCH
  84. STRUCT_FIELD (long,4,CS_SA_,prefctl)
  85. #endif
  86. #if XCHAL_USE_MEMCTL
  87. STRUCT_FIELD (long,4,CS_SA_,memctl)
  88. #endif
  89. #if XCHAL_HAVE_CCOUNT
  90. STRUCT_FIELD (long,4,CS_SA_,ccount)
  91. STRUCT_AFIELD(long,4,CS_SA_,ccompare, XCHAL_NUM_TIMERS)
  92. #endif
  93. #if XCHAL_HAVE_INTERRUPTS
  94. STRUCT_FIELD (long,4,CS_SA_,intenable)
  95. STRUCT_FIELD (long,4,CS_SA_,interrupt)
  96. #endif
  97. #if XCHAL_HAVE_DEBUG
  98. STRUCT_FIELD (long,4,CS_SA_,icount)
  99. STRUCT_FIELD (long,4,CS_SA_,icountlevel)
  100. STRUCT_FIELD (long,4,CS_SA_,debugcause)
  101. // DDR not saved
  102. # if XCHAL_NUM_DBREAK
  103. STRUCT_AFIELD(long,4,CS_SA_,dbreakc, XCHAL_NUM_DBREAK)
  104. STRUCT_AFIELD(long,4,CS_SA_,dbreaka, XCHAL_NUM_DBREAK)
  105. # endif
  106. # if XCHAL_NUM_IBREAK
  107. STRUCT_AFIELD(long,4,CS_SA_,ibreaka, XCHAL_NUM_IBREAK)
  108. STRUCT_FIELD (long,4,CS_SA_,ibreakenable)
  109. # endif
  110. #endif
  111. #if XCHAL_NUM_MISC_REGS
  112. STRUCT_AFIELD(long,4,CS_SA_,misc,XCHAL_NUM_MISC_REGS)
  113. #endif
  114. #if XCHAL_HAVE_MEM_ECC_PARITY
  115. STRUCT_FIELD (long,4,CS_SA_,mepc)
  116. STRUCT_FIELD (long,4,CS_SA_,meps)
  117. STRUCT_FIELD (long,4,CS_SA_,mesave)
  118. STRUCT_FIELD (long,4,CS_SA_,mesr)
  119. STRUCT_FIELD (long,4,CS_SA_,mecr)
  120. STRUCT_FIELD (long,4,CS_SA_,mevaddr)
  121. #endif
  122. /* We put this ahead of TLB and other TIE state,
  123. to keep it within S32I/L32I offset range. */
  124. #if XCHAL_HAVE_CP
  125. STRUCT_FIELD (long,4,CS_SA_,cpenable)
  126. #endif
  127. /* TLB state */
  128. #if XCHAL_HAVE_MIMIC_CACHEATTR || XCHAL_HAVE_XLT_CACHEATTR
  129. STRUCT_AFIELD(long,4,CS_SA_,tlbs,8*2)
  130. #endif
  131. #if XCHAL_HAVE_PTP_MMU
  132. /* Compute number of auto-refill (ARF) entries as max of I and D,
  133. to simplify TLB save logic. On the unusual configs with
  134. ITLB ARF != DTLB ARF entries, we'll just end up
  135. saving/restoring some extra entries redundantly. */
  136. # if XCHAL_DTLB_ARF_ENTRIES_LOG2 + XCHAL_ITLB_ARF_ENTRIES_LOG2 > 4
  137. # define ARF_ENTRIES 8
  138. # else
  139. # define ARF_ENTRIES 4
  140. # endif
  141. STRUCT_FIELD (long,4,CS_SA_,ptevaddr)
  142. STRUCT_FIELD (long,4,CS_SA_,rasid)
  143. STRUCT_FIELD (long,4,CS_SA_,dtlbcfg)
  144. STRUCT_FIELD (long,4,CS_SA_,itlbcfg)
  145. /*** WARNING: past this point, field offsets may be larger than S32I/L32I range ***/
  146. STRUCT_AFIELD(long,4,CS_SA_,tlbs,((4*ARF_ENTRIES+4)*2+3)*2)
  147. # if XCHAL_HAVE_SPANNING_WAY /* MMU v3 */
  148. STRUCT_AFIELD(long,4,CS_SA_,tlbs_ways56,(4+8)*2*2)
  149. # endif
  150. #endif
  151. /* MPU state */
  152. #if XCHAL_HAVE_MPU
  153. STRUCT_AFIELD(long,4,CS_SA_,mpuentry,8*XCHAL_MPU_ENTRIES)
  154. STRUCT_FIELD (long,4,CS_SA_,cacheadrdis)
  155. #endif
  156. #if XCHAL_HAVE_IDMA
  157. STRUCT_AFIELD(long,4,CS_SA_,idmaregs, IDMA_PSO_SAVE_SIZE)
  158. #endif
  159. /* TIE state */
  160. /* NOTE: NCP area is aligned to XCHAL_TOTAL_SA_ALIGN not XCHAL_NCP_SA_ALIGN,
  161. because the offsets of all subsequent coprocessor save areas are relative
  162. to the NCP save area. */
  163. STRUCT_AFIELD_A(char,1,XCHAL_TOTAL_SA_ALIGN,CS_SA_,ncp,XCHAL_NCP_SA_SIZE)
  164. #if XCHAL_HAVE_CP
  165. #if XCHAL_CP0_SA_SIZE > 0
  166. STRUCT_AFIELD_A(char,1,XCHAL_CP0_SA_ALIGN,CS_SA_,cp0,XCHAL_CP0_SA_SIZE)
  167. #endif
  168. #if XCHAL_CP1_SA_SIZE > 0
  169. STRUCT_AFIELD_A(char,1,XCHAL_CP1_SA_ALIGN,CS_SA_,cp1,XCHAL_CP1_SA_SIZE)
  170. #endif
  171. #if XCHAL_CP2_SA_SIZE > 0
  172. STRUCT_AFIELD_A(char,1,XCHAL_CP2_SA_ALIGN,CS_SA_,cp2,XCHAL_CP2_SA_SIZE)
  173. #endif
  174. #if XCHAL_CP3_SA_SIZE > 0
  175. STRUCT_AFIELD_A(char,1,XCHAL_CP3_SA_ALIGN,CS_SA_,cp3,XCHAL_CP3_SA_SIZE)
  176. #endif
  177. #if XCHAL_CP4_SA_SIZE > 0
  178. STRUCT_AFIELD_A(char,1,XCHAL_CP4_SA_ALIGN,CS_SA_,cp4,XCHAL_CP4_SA_SIZE)
  179. #endif
  180. #if XCHAL_CP5_SA_SIZE > 0
  181. STRUCT_AFIELD_A(char,1,XCHAL_CP5_SA_ALIGN,CS_SA_,cp5,XCHAL_CP5_SA_SIZE)
  182. #endif
  183. #if XCHAL_CP6_SA_SIZE > 0
  184. STRUCT_AFIELD_A(char,1,XCHAL_CP6_SA_ALIGN,CS_SA_,cp6,XCHAL_CP6_SA_SIZE)
  185. #endif
  186. #if XCHAL_CP7_SA_SIZE > 0
  187. STRUCT_AFIELD_A(char,1,XCHAL_CP7_SA_ALIGN,CS_SA_,cp7,XCHAL_CP7_SA_SIZE)
  188. #endif
  189. //STRUCT_AFIELD_A(char,1,XCHAL_CP8_SA_ALIGN,CS_SA_,cp8,XCHAL_CP8_SA_SIZE)
  190. //STRUCT_AFIELD_A(char,1,XCHAL_CP9_SA_ALIGN,CS_SA_,cp9,XCHAL_CP9_SA_SIZE)
  191. //STRUCT_AFIELD_A(char,1,XCHAL_CP10_SA_ALIGN,CS_SA_,cp10,XCHAL_CP10_SA_SIZE)
  192. //STRUCT_AFIELD_A(char,1,XCHAL_CP11_SA_ALIGN,CS_SA_,cp11,XCHAL_CP11_SA_SIZE)
  193. //STRUCT_AFIELD_A(char,1,XCHAL_CP12_SA_ALIGN,CS_SA_,cp12,XCHAL_CP12_SA_SIZE)
  194. //STRUCT_AFIELD_A(char,1,XCHAL_CP13_SA_ALIGN,CS_SA_,cp13,XCHAL_CP13_SA_SIZE)
  195. //STRUCT_AFIELD_A(char,1,XCHAL_CP14_SA_ALIGN,CS_SA_,cp14,XCHAL_CP14_SA_SIZE)
  196. //STRUCT_AFIELD_A(char,1,XCHAL_CP15_SA_ALIGN,CS_SA_,cp15,XCHAL_CP15_SA_SIZE)
  197. #endif
  198. STRUCT_END(XtosCoreState)
  199. // These are part of non-coprocessor state (ncp):
  200. #if XCHAL_HAVE_MAC16
  201. //STRUCT_FIELD (long,4,CS_SA_,acclo)
  202. //STRUCT_FIELD (long,4,CS_SA_,acchi)
  203. //STRUCT_AFIELD(long,4,CS_SA_,mr, 4)
  204. #endif
  205. #if XCHAL_HAVE_THREADPTR
  206. //STRUCT_FIELD (long,4,CS_SA_,threadptr)
  207. #endif
  208. #if XCHAL_HAVE_S32C1I
  209. //STRUCT_FIELD (long,4,CS_SA_,scompare1)
  210. #endif
  211. #if XCHAL_HAVE_BOOLEANS
  212. //STRUCT_FIELD (long,4,CS_SA_,br)
  213. #endif
  214. // Not saved:
  215. // EXCCAUSE ??
  216. // DEBUGCAUSE ??
  217. // EXCVADDR ??
  218. // DDR
  219. // INTERRUPT
  220. // ... locked cache lines ...
  221. #endif /* _XTOS_CORE_STATE_H_ */