FspCommonLib.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. /** @file
  2. Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. **/
  5. #include <PiPei.h>
  6. #include <Library/BaseLib.h>
  7. #include <Library/DebugLib.h>
  8. #include <Library/PcdLib.h>
  9. #include <FspGlobalData.h>
  10. #include <FspApi.h>
  11. #pragma pack(1)
  12. //
  13. // Cont Func Parameter 2 +0x3C
  14. // Cont Func Parameter 1 +0x38
  15. //
  16. // API Parameter +0x34
  17. // API return address +0x30
  18. //
  19. // push FspInfoHeader +0x2C
  20. // pushfd +0x28
  21. // cli
  22. // pushad +0x24
  23. // sub esp, 8 +0x00
  24. // sidt fword ptr [esp]
  25. //
  26. typedef struct {
  27. UINT16 IdtrLimit;
  28. UINT32 IdtrBase;
  29. UINT16 Reserved;
  30. UINT32 Edi;
  31. UINT32 Esi;
  32. UINT32 Ebp;
  33. UINT32 Esp;
  34. UINT32 Ebx;
  35. UINT32 Edx;
  36. UINT32 Ecx;
  37. UINT32 Eax;
  38. UINT16 Flags[2];
  39. UINT32 FspInfoHeader;
  40. UINT32 ApiRet;
  41. UINT32 ApiParam;
  42. } CONTEXT_STACK;
  43. #define CONTEXT_STACK_OFFSET(x) (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x
  44. #pragma pack()
  45. /**
  46. This function sets the FSP global data pointer.
  47. @param[in] FspData Fsp global data pointer.
  48. **/
  49. VOID
  50. EFIAPI
  51. SetFspGlobalDataPointer (
  52. IN FSP_GLOBAL_DATA *FspData
  53. )
  54. {
  55. ASSERT (FspData != NULL);
  56. *((volatile UINT32 *)(UINTN)PcdGet32(PcdGlobalDataPointerAddress)) = (UINT32)(UINTN)FspData;
  57. }
  58. /**
  59. This function gets the FSP global data pointer.
  60. **/
  61. FSP_GLOBAL_DATA *
  62. EFIAPI
  63. GetFspGlobalDataPointer (
  64. VOID
  65. )
  66. {
  67. FSP_GLOBAL_DATA *FspData;
  68. FspData = *(FSP_GLOBAL_DATA **)(UINTN)PcdGet32(PcdGlobalDataPointerAddress);
  69. return FspData;
  70. }
  71. /**
  72. This function gets back the FSP API parameter passed by the bootlaoder.
  73. @retval ApiParameter FSP API parameter passed by the bootlaoder.
  74. **/
  75. UINT32
  76. EFIAPI
  77. GetFspApiParameter (
  78. VOID
  79. )
  80. {
  81. FSP_GLOBAL_DATA *FspData;
  82. FspData = GetFspGlobalDataPointer ();
  83. return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam));
  84. }
  85. /**
  86. This function sets the FSP API parameter in the stack.
  87. @param[in] Value New parameter value.
  88. **/
  89. VOID
  90. EFIAPI
  91. SetFspApiParameter (
  92. IN UINT32 Value
  93. )
  94. {
  95. FSP_GLOBAL_DATA *FspData;
  96. FspData = GetFspGlobalDataPointer ();
  97. *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)) = Value;
  98. }
  99. /**
  100. This function sets the FSP continuation function parameters in the stack.
  101. @param[in] Value New parameter value to set.
  102. @param[in] Index Parameter index.
  103. **/
  104. VOID
  105. EFIAPI
  106. SetFspContinuationFuncParameter (
  107. IN UINT32 Value,
  108. IN UINT32 Index
  109. )
  110. {
  111. FSP_GLOBAL_DATA *FspData;
  112. FspData = GetFspGlobalDataPointer ();
  113. *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam) + (Index + 1) * sizeof(UINT32)) = Value;
  114. }
  115. /**
  116. This function changes the BootLoader return address in stack.
  117. @param[in] ReturnAddress Address to return.
  118. **/
  119. VOID
  120. EFIAPI
  121. SetFspApiReturnAddress (
  122. IN UINT32 ReturnAddress
  123. )
  124. {
  125. FSP_GLOBAL_DATA *FspData;
  126. FspData = GetFspGlobalDataPointer ();
  127. *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiRet)) = ReturnAddress;
  128. }
  129. /**
  130. This function set the API status code returned to the BootLoader.
  131. @param[in] ReturnStatus Status code to return.
  132. **/
  133. VOID
  134. EFIAPI
  135. SetFspApiReturnStatus (
  136. IN UINT32 ReturnStatus
  137. )
  138. {
  139. FSP_GLOBAL_DATA *FspData;
  140. FspData = GetFspGlobalDataPointer ();
  141. *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(Eax)) = ReturnStatus;
  142. }
  143. /**
  144. This function sets the context switching stack to a new stack frame.
  145. @param[in] NewStackTop New core stack to be set.
  146. **/
  147. VOID
  148. EFIAPI
  149. SetFspCoreStackPointer (
  150. IN VOID *NewStackTop
  151. )
  152. {
  153. FSP_GLOBAL_DATA *FspData;
  154. UINT32 *OldStack;
  155. UINT32 *NewStack;
  156. UINT32 StackContextLen;
  157. FspData = GetFspGlobalDataPointer ();
  158. StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINT32);
  159. //
  160. // Reserve space for the ContinuationFunc two parameters
  161. //
  162. OldStack = (UINT32 *)FspData->CoreStack;
  163. NewStack = (UINT32 *)NewStackTop - StackContextLen - 2;
  164. FspData->CoreStack = (UINT32)NewStack;
  165. while (StackContextLen-- != 0) {
  166. *NewStack++ = *OldStack++;
  167. }
  168. }
  169. /**
  170. This function sets the platform specific data pointer.
  171. @param[in] PlatformData Fsp platform specific data pointer.
  172. **/
  173. VOID
  174. EFIAPI
  175. SetFspPlatformDataPointer (
  176. IN VOID *PlatformData
  177. )
  178. {
  179. FSP_GLOBAL_DATA *FspData;
  180. FspData = GetFspGlobalDataPointer ();
  181. FspData->PlatformData.DataPtr = PlatformData;
  182. }
  183. /**
  184. This function gets the platform specific data pointer.
  185. @param[in] PlatformData Fsp platform specific data pointer.
  186. **/
  187. VOID *
  188. EFIAPI
  189. GetFspPlatformDataPointer (
  190. VOID
  191. )
  192. {
  193. FSP_GLOBAL_DATA *FspData;
  194. FspData = GetFspGlobalDataPointer ();
  195. return FspData->PlatformData.DataPtr;
  196. }
  197. /**
  198. This function sets the UPD data pointer.
  199. @param[in] UpdDataRgnPtr UPD data pointer.
  200. **/
  201. VOID
  202. EFIAPI
  203. SetFspUpdDataPointer (
  204. IN VOID *UpdDataRgnPtr
  205. )
  206. {
  207. FSP_GLOBAL_DATA *FspData;
  208. //
  209. // Get the Fsp Global Data Pointer
  210. //
  211. FspData = GetFspGlobalDataPointer ();
  212. //
  213. // Set the UPD pointer.
  214. //
  215. FspData->UpdDataRgnPtr = UpdDataRgnPtr;
  216. }
  217. /**
  218. This function gets the UPD data pointer.
  219. @return UpdDataRgnPtr UPD data pointer.
  220. **/
  221. VOID *
  222. EFIAPI
  223. GetFspUpdDataPointer (
  224. VOID
  225. )
  226. {
  227. FSP_GLOBAL_DATA *FspData;
  228. FspData = GetFspGlobalDataPointer ();
  229. return FspData->UpdDataRgnPtr;
  230. }
  231. /**
  232. This function sets the memory init UPD data pointer.
  233. @param[in] MemoryInitUpdPtr memory init UPD data pointer.
  234. **/
  235. VOID
  236. EFIAPI
  237. SetFspMemoryInitUpdDataPointer (
  238. IN VOID *MemoryInitUpdPtr
  239. )
  240. {
  241. FSP_GLOBAL_DATA *FspData;
  242. //
  243. // Get the Fsp Global Data Pointer
  244. //
  245. FspData = GetFspGlobalDataPointer ();
  246. //
  247. // Set the memory init UPD pointer.
  248. //
  249. FspData->MemoryInitUpdPtr = MemoryInitUpdPtr;
  250. }
  251. /**
  252. This function gets the memory init UPD data pointer.
  253. @return memory init UPD data pointer.
  254. **/
  255. VOID *
  256. EFIAPI
  257. GetFspMemoryInitUpdDataPointer (
  258. VOID
  259. )
  260. {
  261. FSP_GLOBAL_DATA *FspData;
  262. FspData = GetFspGlobalDataPointer ();
  263. return FspData->MemoryInitUpdPtr;
  264. }
  265. /**
  266. This function sets the silicon init UPD data pointer.
  267. @param[in] SiliconInitUpdPtr silicon init UPD data pointer.
  268. **/
  269. VOID
  270. EFIAPI
  271. SetFspSiliconInitUpdDataPointer (
  272. IN VOID *SiliconInitUpdPtr
  273. )
  274. {
  275. FSP_GLOBAL_DATA *FspData;
  276. //
  277. // Get the Fsp Global Data Pointer
  278. //
  279. FspData = GetFspGlobalDataPointer ();
  280. //
  281. // Set the silicon init UPD data pointer.
  282. //
  283. FspData->SiliconInitUpdPtr = SiliconInitUpdPtr;
  284. }
  285. /**
  286. This function gets the silicon init UPD data pointer.
  287. @return silicon init UPD data pointer.
  288. **/
  289. VOID *
  290. EFIAPI
  291. GetFspSiliconInitUpdDataPointer (
  292. VOID
  293. )
  294. {
  295. FSP_GLOBAL_DATA *FspData;
  296. FspData = GetFspGlobalDataPointer ();
  297. return FspData->SiliconInitUpdPtr;
  298. }
  299. /**
  300. Set FSP measurement point timestamp.
  301. @param[in] Id Measurement point ID.
  302. @return performance timestamp.
  303. **/
  304. UINT64
  305. EFIAPI
  306. SetFspMeasurePoint (
  307. IN UINT8 Id
  308. )
  309. {
  310. FSP_GLOBAL_DATA *FspData;
  311. //
  312. // Bit [55: 0] will be the timestamp
  313. // Bit [63:56] will be the ID
  314. //
  315. FspData = GetFspGlobalDataPointer ();
  316. if (FspData->PerfIdx < sizeof(FspData->PerfData) / sizeof(FspData->PerfData[0])) {
  317. FspData->PerfData[FspData->PerfIdx] = AsmReadTsc ();
  318. ((UINT8 *)(&FspData->PerfData[FspData->PerfIdx]))[7] = Id;
  319. }
  320. return FspData->PerfData[(FspData->PerfIdx)++];
  321. }
  322. /**
  323. This function gets the FSP info header pointer.
  324. @retval FspInfoHeader FSP info header pointer
  325. **/
  326. FSP_INFO_HEADER *
  327. EFIAPI
  328. GetFspInfoHeader (
  329. VOID
  330. )
  331. {
  332. return GetFspGlobalDataPointer()->FspInfoHeader;
  333. }
  334. /**
  335. This function gets the FSP info header pointer using the API stack context.
  336. @retval FspInfoHeader FSP info header pointer using the API stack context
  337. **/
  338. FSP_INFO_HEADER *
  339. EFIAPI
  340. GetFspInfoHeaderFromApiContext (
  341. VOID
  342. )
  343. {
  344. FSP_GLOBAL_DATA *FspData;
  345. FspData = GetFspGlobalDataPointer ();
  346. return (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader)));
  347. }
  348. /**
  349. This function gets the VPD data pointer.
  350. @return VpdDataRgnPtr VPD data pointer.
  351. **/
  352. VOID *
  353. EFIAPI
  354. GetFspVpdDataPointer (
  355. VOID
  356. )
  357. {
  358. FSP_INFO_HEADER *FspInfoHeader;
  359. FspInfoHeader = GetFspInfoHeader ();
  360. return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);
  361. }
  362. /**
  363. This function gets FSP API calling mode.
  364. @retval API calling mode
  365. **/
  366. UINT8
  367. EFIAPI
  368. GetFspApiCallingMode (
  369. VOID
  370. )
  371. {
  372. return GetFspGlobalDataPointer()->ApiMode;
  373. }
  374. /**
  375. This function sets FSP API calling mode.
  376. @param[in] Mode API calling mode
  377. **/
  378. VOID
  379. EFIAPI
  380. SetFspApiCallingMode (
  381. UINT8 Mode
  382. )
  383. {
  384. FSP_GLOBAL_DATA *FspData;
  385. FspData = GetFspGlobalDataPointer ();
  386. FspData->ApiMode = Mode;
  387. }