xtruntime-core-state.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /* xtruntime-core-state.h - core state save area (used eg. by PSO) */
  2. /* $Id: //depot/rel/Eaglenest/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. //#define XTOS_PSO_TEST 1 // uncommented for internal PSO testing only
  32. #define CORE_STATE_SIGNATURE 0xB1C5AFED // pattern that indicates state was saved
  33. /*
  34. * Save area for saving entire core state, such as across Power Shut-Off (PSO).
  35. */
  36. STRUCT_BEGIN
  37. STRUCT_FIELD (long,4,CS_SA_,signature) // for checking whether state was saved
  38. STRUCT_FIELD (long,4,CS_SA_,restore_label)
  39. STRUCT_FIELD (long,4,CS_SA_,aftersave_label)
  40. STRUCT_AFIELD(long,4,CS_SA_,areg,XCHAL_NUM_AREGS)
  41. #if XCHAL_HAVE_WINDOWED
  42. STRUCT_AFIELD(long,4,CS_SA_,caller_regs,16) // save a max of 16 caller regs
  43. STRUCT_FIELD (long,4,CS_SA_,caller_regs_saved) // flag to show if caller regs saved
  44. #endif
  45. #if XCHAL_HAVE_PSO_CDM
  46. STRUCT_FIELD (long,4,CS_SA_,pwrctl)
  47. #endif
  48. #if XCHAL_HAVE_WINDOWED
  49. STRUCT_FIELD (long,4,CS_SA_,windowbase)
  50. STRUCT_FIELD (long,4,CS_SA_,windowstart)
  51. #endif
  52. STRUCT_FIELD (long,4,CS_SA_,sar)
  53. #if XCHAL_HAVE_EXCEPTIONS
  54. STRUCT_FIELD (long,4,CS_SA_,epc1)
  55. STRUCT_FIELD (long,4,CS_SA_,ps)
  56. STRUCT_FIELD (long,4,CS_SA_,excsave1)
  57. # ifdef XCHAL_DOUBLEEXC_VECTOR_VADDR
  58. STRUCT_FIELD (long,4,CS_SA_,depc)
  59. # endif
  60. #endif
  61. #if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 2
  62. STRUCT_AFIELD(long,4,CS_SA_,epc, XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1)
  63. STRUCT_AFIELD(long,4,CS_SA_,eps, XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1)
  64. STRUCT_AFIELD(long,4,CS_SA_,excsave,XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI - 1)
  65. #endif
  66. #if XCHAL_HAVE_LOOPS
  67. STRUCT_FIELD (long,4,CS_SA_,lcount)
  68. STRUCT_FIELD (long,4,CS_SA_,lbeg)
  69. STRUCT_FIELD (long,4,CS_SA_,lend)
  70. #endif
  71. #if XCHAL_HAVE_ABSOLUTE_LITERALS
  72. STRUCT_FIELD (long,4,CS_SA_,litbase)
  73. #endif
  74. #if XCHAL_HAVE_VECBASE
  75. STRUCT_FIELD (long,4,CS_SA_,vecbase)
  76. #endif
  77. #if XCHAL_HAVE_S32C1I && (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0) /* have ATOMCTL ? */
  78. STRUCT_FIELD (long,4,CS_SA_,atomctl)
  79. #endif
  80. #if XCHAL_HAVE_PREFETCH
  81. STRUCT_FIELD (long,4,CS_SA_,prefctl)
  82. #endif
  83. #if XCHAL_USE_MEMCTL
  84. STRUCT_FIELD (long,4,CS_SA_,memctl)
  85. #endif
  86. #if XCHAL_HAVE_CCOUNT
  87. STRUCT_FIELD (long,4,CS_SA_,ccount)
  88. STRUCT_AFIELD(long,4,CS_SA_,ccompare, XCHAL_NUM_TIMERS)
  89. #endif
  90. #if XCHAL_HAVE_INTERRUPTS
  91. STRUCT_FIELD (long,4,CS_SA_,intenable)
  92. STRUCT_FIELD (long,4,CS_SA_,interrupt)
  93. #endif
  94. #if XCHAL_HAVE_DEBUG
  95. STRUCT_FIELD (long,4,CS_SA_,icount)
  96. STRUCT_FIELD (long,4,CS_SA_,icountlevel)
  97. STRUCT_FIELD (long,4,CS_SA_,debugcause)
  98. // DDR not saved
  99. # if XCHAL_NUM_DBREAK
  100. STRUCT_AFIELD(long,4,CS_SA_,dbreakc, XCHAL_NUM_DBREAK)
  101. STRUCT_AFIELD(long,4,CS_SA_,dbreaka, XCHAL_NUM_DBREAK)
  102. # endif
  103. # if XCHAL_NUM_IBREAK
  104. STRUCT_AFIELD(long,4,CS_SA_,ibreaka, XCHAL_NUM_IBREAK)
  105. STRUCT_FIELD (long,4,CS_SA_,ibreakenable)
  106. # endif
  107. #endif
  108. #if XCHAL_NUM_MISC_REGS
  109. STRUCT_AFIELD(long,4,CS_SA_,misc,XCHAL_NUM_MISC_REGS)
  110. #endif
  111. #if XCHAL_HAVE_MEM_ECC_PARITY
  112. STRUCT_FIELD (long,4,CS_SA_,mepc)
  113. STRUCT_FIELD (long,4,CS_SA_,meps)
  114. STRUCT_FIELD (long,4,CS_SA_,mesave)
  115. STRUCT_FIELD (long,4,CS_SA_,mesr)
  116. STRUCT_FIELD (long,4,CS_SA_,mecr)
  117. STRUCT_FIELD (long,4,CS_SA_,mevaddr)
  118. #endif
  119. /* We put this ahead of TLB and other TIE state,
  120. to keep it within S32I/L32I offset range. */
  121. #if XCHAL_HAVE_CP
  122. STRUCT_FIELD (long,4,CS_SA_,cpenable)
  123. #endif
  124. /* TLB state */
  125. #if XCHAL_HAVE_MIMIC_CACHEATTR || XCHAL_HAVE_XLT_CACHEATTR
  126. STRUCT_AFIELD(long,4,CS_SA_,tlbs,8*2)
  127. #endif
  128. #if XCHAL_HAVE_PTP_MMU
  129. /* Compute number of auto-refill (ARF) entries as max of I and D,
  130. to simplify TLB save logic. On the unusual configs with
  131. ITLB ARF != DTLB ARF entries, we'll just end up
  132. saving/restoring some extra entries redundantly. */
  133. # if XCHAL_DTLB_ARF_ENTRIES_LOG2 + XCHAL_ITLB_ARF_ENTRIES_LOG2 > 4
  134. # define ARF_ENTRIES 8
  135. # else
  136. # define ARF_ENTRIES 4
  137. # endif
  138. STRUCT_FIELD (long,4,CS_SA_,ptevaddr)
  139. STRUCT_FIELD (long,4,CS_SA_,rasid)
  140. STRUCT_FIELD (long,4,CS_SA_,dtlbcfg)
  141. STRUCT_FIELD (long,4,CS_SA_,itlbcfg)
  142. /*** WARNING: past this point, field offsets may be larger than S32I/L32I range ***/
  143. STRUCT_AFIELD(long,4,CS_SA_,tlbs,((4*ARF_ENTRIES+4)*2+3)*2)
  144. # if XCHAL_HAVE_SPANNING_WAY /* MMU v3 */
  145. STRUCT_AFIELD(long,4,CS_SA_,tlbs_ways56,(4+8)*2*2)
  146. # endif
  147. #endif
  148. /* TIE state */
  149. /* NOTE: NCP area is aligned to XCHAL_TOTAL_SA_ALIGN not XCHAL_NCP_SA_ALIGN,
  150. because the offsets of all subsequent coprocessor save areas are relative
  151. to the NCP save area. */
  152. STRUCT_AFIELD_A(char,1,XCHAL_TOTAL_SA_ALIGN,CS_SA_,ncp,XCHAL_NCP_SA_SIZE)
  153. #if XCHAL_HAVE_CP
  154. STRUCT_AFIELD_A(char,1,XCHAL_CP0_SA_ALIGN,CS_SA_,cp0,XCHAL_CP0_SA_SIZE)
  155. STRUCT_AFIELD_A(char,1,XCHAL_CP1_SA_ALIGN,CS_SA_,cp1,XCHAL_CP1_SA_SIZE)
  156. STRUCT_AFIELD_A(char,1,XCHAL_CP2_SA_ALIGN,CS_SA_,cp2,XCHAL_CP2_SA_SIZE)
  157. STRUCT_AFIELD_A(char,1,XCHAL_CP3_SA_ALIGN,CS_SA_,cp3,XCHAL_CP3_SA_SIZE)
  158. STRUCT_AFIELD_A(char,1,XCHAL_CP4_SA_ALIGN,CS_SA_,cp4,XCHAL_CP4_SA_SIZE)
  159. STRUCT_AFIELD_A(char,1,XCHAL_CP5_SA_ALIGN,CS_SA_,cp5,XCHAL_CP5_SA_SIZE)
  160. STRUCT_AFIELD_A(char,1,XCHAL_CP6_SA_ALIGN,CS_SA_,cp6,XCHAL_CP6_SA_SIZE)
  161. STRUCT_AFIELD_A(char,1,XCHAL_CP7_SA_ALIGN,CS_SA_,cp7,XCHAL_CP7_SA_SIZE)
  162. //STRUCT_AFIELD_A(char,1,XCHAL_CP8_SA_ALIGN,CS_SA_,cp8,XCHAL_CP8_SA_SIZE)
  163. //STRUCT_AFIELD_A(char,1,XCHAL_CP9_SA_ALIGN,CS_SA_,cp9,XCHAL_CP9_SA_SIZE)
  164. //STRUCT_AFIELD_A(char,1,XCHAL_CP10_SA_ALIGN,CS_SA_,cp10,XCHAL_CP10_SA_SIZE)
  165. //STRUCT_AFIELD_A(char,1,XCHAL_CP11_SA_ALIGN,CS_SA_,cp11,XCHAL_CP11_SA_SIZE)
  166. //STRUCT_AFIELD_A(char,1,XCHAL_CP12_SA_ALIGN,CS_SA_,cp12,XCHAL_CP12_SA_SIZE)
  167. //STRUCT_AFIELD_A(char,1,XCHAL_CP13_SA_ALIGN,CS_SA_,cp13,XCHAL_CP13_SA_SIZE)
  168. //STRUCT_AFIELD_A(char,1,XCHAL_CP14_SA_ALIGN,CS_SA_,cp14,XCHAL_CP14_SA_SIZE)
  169. //STRUCT_AFIELD_A(char,1,XCHAL_CP15_SA_ALIGN,CS_SA_,cp15,XCHAL_CP15_SA_SIZE)
  170. #endif
  171. STRUCT_END(XtosCoreState)
  172. // These are part of non-coprocessor state (ncp):
  173. #if XCHAL_HAVE_MAC16
  174. //STRUCT_FIELD (long,4,CS_SA_,acclo)
  175. //STRUCT_FIELD (long,4,CS_SA_,acchi)
  176. //STRUCT_AFIELD(long,4,CS_SA_,mr, 4)
  177. #endif
  178. #if XCHAL_HAVE_THREADPTR
  179. //STRUCT_FIELD (long,4,CS_SA_,threadptr)
  180. #endif
  181. #if XCHAL_HAVE_S32C1I
  182. //STRUCT_FIELD (long,4,CS_SA_,scompare1)
  183. #endif
  184. #if XCHAL_HAVE_BOOLEANS
  185. //STRUCT_FIELD (long,4,CS_SA_,br)
  186. #endif
  187. // Not saved:
  188. // EXCCAUSE ??
  189. // DEBUGCAUSE ??
  190. // EXCVADDR ??
  191. // DDR
  192. // INTERRUPT
  193. // ... locked cache lines ...
  194. #endif /* _XTOS_CORE_STATE_H_ */