]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - IntelFsp2Pkg/FspSecCore/SecFspApiChk.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / IntelFsp2Pkg / FspSecCore / SecFspApiChk.c
... / ...
CommitLineData
1/** @file\r
2\r
3 Copyright (c) 2016 - 2022, Intel Corporation. All rights reserved.<BR>\r
4 SPDX-License-Identifier: BSD-2-Clause-Patent\r
5\r
6**/\r
7\r
8#include "SecFsp.h"\r
9\r
10/**\r
11 This function check the FSP API calling condition.\r
12\r
13 @param[in] ApiIdx Internal index of the FSP API.\r
14 @param[in] ApiParam Parameter of the FSP API.\r
15\r
16**/\r
17EFI_STATUS\r
18EFIAPI\r
19FspApiCallingCheck (\r
20 IN UINT8 ApiIdx,\r
21 IN VOID *ApiParam\r
22 )\r
23{\r
24 EFI_STATUS Status;\r
25 FSP_GLOBAL_DATA *FspData;\r
26\r
27 Status = EFI_SUCCESS;\r
28 FspData = GetFspGlobalDataPointer ();\r
29\r
30 if (ApiIdx == NotifyPhaseApiIndex) {\r
31 //\r
32 // NotifyPhase check\r
33 //\r
34 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
35 Status = EFI_UNSUPPORTED;\r
36 } else {\r
37 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
38 Status = EFI_UNSUPPORTED;\r
39 }\r
40 }\r
41 } else if (ApiIdx == FspMemoryInitApiIndex) {\r
42 //\r
43 // FspMemoryInit check\r
44 //\r
45 if (((UINTN)FspData != MAX_ADDRESS) && ((UINTN)FspData != MAX_UINT32)) {\r
46 Status = EFI_UNSUPPORTED;\r
47 } else if (ApiParam == NULL) {\r
48 Status = EFI_SUCCESS;\r
49 } else if (EFI_ERROR (FspUpdSignatureCheck (ApiIdx, ApiParam))) {\r
50 Status = EFI_INVALID_PARAMETER;\r
51 }\r
52 } else if (ApiIdx == TempRamExitApiIndex) {\r
53 //\r
54 // TempRamExit check\r
55 //\r
56 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
57 Status = EFI_UNSUPPORTED;\r
58 } else {\r
59 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
60 Status = EFI_UNSUPPORTED;\r
61 }\r
62 }\r
63 } else if ((ApiIdx == FspSiliconInitApiIndex) || (ApiIdx == FspMultiPhaseSiInitApiIndex)) {\r
64 //\r
65 // FspSiliconInit check\r
66 //\r
67 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
68 Status = EFI_UNSUPPORTED;\r
69 } else {\r
70 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
71 Status = EFI_UNSUPPORTED;\r
72 } else if (ApiIdx == FspSiliconInitApiIndex) {\r
73 if (ApiParam == NULL) {\r
74 Status = EFI_SUCCESS;\r
75 } else if (EFI_ERROR (FspUpdSignatureCheck (FspSiliconInitApiIndex, ApiParam))) {\r
76 Status = EFI_INVALID_PARAMETER;\r
77 }\r
78\r
79 //\r
80 // Reset MultiPhase NumberOfPhases to zero\r
81 //\r
82 FspData->NumberOfPhases = 0;\r
83 }\r
84 }\r
85 } else if (ApiIdx == FspMultiPhaseMemInitApiIndex) {\r
86 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
87 Status = EFI_UNSUPPORTED;\r
88 }\r
89 } else if (ApiIdx == FspSmmInitApiIndex) {\r
90 //\r
91 // FspSmmInitApiIndex check\r
92 //\r
93 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
94 Status = EFI_UNSUPPORTED;\r
95 } else {\r
96 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
97 Status = EFI_UNSUPPORTED;\r
98 } else if (ApiParam == NULL) {\r
99 Status = EFI_SUCCESS;\r
100 } else if (EFI_ERROR (FspUpdSignatureCheck (FspSmmInitApiIndex, ApiParam))) {\r
101 Status = EFI_INVALID_PARAMETER;\r
102 }\r
103 }\r
104 } else {\r
105 Status = EFI_UNSUPPORTED;\r
106 }\r
107\r
108 if (!EFI_ERROR (Status)) {\r
109 if ((ApiIdx != FspMemoryInitApiIndex)) {\r
110 //\r
111 // For FspMemoryInit, the global data is not valid yet\r
112 // The API index will be updated by SecCore after the global data\r
113 // is initialized\r
114 //\r
115 SetFspApiCallingIndex (ApiIdx);\r
116 }\r
117 }\r
118\r
119 return Status;\r
120}\r