]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFsp2Pkg/FspSecCore/SecMain.c
IntelFsp2Pkg: Support FSP Dispatch mode
[mirror_edk2.git] / IntelFsp2Pkg / FspSecCore / SecMain.c
CommitLineData
cf1d4549
JY
1/** @file\r
2\r
e37bb20c 3 Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
cf1d4549
JY
4 This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php.\r
8\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12**/\r
13\r
14#include "SecMain.h"\r
15#include "SecFsp.h"\r
16\r
17EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI gSecTemporaryRamSupportPpi = {\r
18 SecTemporaryRamSupport\r
19};\r
20\r
21EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformationPpi[] = {\r
a2e61f34
CC
22 {\r
23 EFI_PEI_PPI_DESCRIPTOR_PPI,\r
24 &gFspInApiModePpiGuid,\r
25 NULL\r
26 },\r
cf1d4549
JY
27 {\r
28 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
29 &gEfiTemporaryRamSupportPpiGuid,\r
30 &gSecTemporaryRamSupportPpi\r
31 }\r
32};\r
33\r
34//\r
35// These are IDT entries pointing to 08:FFFFFFE4h.\r
36//\r
37UINT64 mIdtEntryTemplate = 0xffff8e000008ffe4ULL;\r
38\r
39/**\r
40\r
41 Entry point to the C language phase of SEC. After the SEC assembly\r
42 code has initialized some temporary memory and set up the stack,\r
43 the control is transferred to this function.\r
44\r
45\r
46 @param[in] SizeOfRam Size of the temporary memory available for use.\r
058dcbf2 47 @param[in] TempRamBase Base address of temporary ram\r
cf1d4549
JY
48 @param[in] BootFirmwareVolume Base address of the Boot Firmware Volume.\r
49 @param[in] PeiCore PeiCore entry point.\r
50 @param[in] BootLoaderStack BootLoader stack.\r
51 @param[in] ApiIdx the index of API.\r
52\r
53 @return This function never returns.\r
54\r
55**/\r
56VOID\r
57EFIAPI\r
58SecStartup (\r
59 IN UINT32 SizeOfRam,\r
60 IN UINT32 TempRamBase,\r
61 IN VOID *BootFirmwareVolume,\r
62 IN PEI_CORE_ENTRY PeiCore,\r
63 IN UINT32 BootLoaderStack,\r
64 IN UINT32 ApiIdx\r
65 )\r
66{\r
67 EFI_SEC_PEI_HAND_OFF SecCoreData;\r
68 IA32_DESCRIPTOR IdtDescriptor;\r
69 SEC_IDT_TABLE IdtTableInStack;\r
70 UINT32 Index;\r
71 FSP_GLOBAL_DATA PeiFspData;\r
72 UINT64 ExceptionHandler;\r
73\r
74 //\r
75 // Process all libraries constructor function linked to SecCore.\r
76 //\r
77 ProcessLibraryConstructorList ();\r
78\r
79 //\r
80 // Initialize floating point operating environment\r
81 // to be compliant with UEFI spec.\r
82 //\r
83 InitializeFloatingPointUnits ();\r
84\r
85\r
86 // |-------------------|---->\r
87 // |Idt Table |\r
88 // |-------------------|\r
89 // |PeiService Pointer | PeiStackSize\r
90 // |-------------------|\r
91 // | |\r
92 // | Stack |\r
93 // |-------------------|---->\r
94 // | |\r
95 // | |\r
96 // | Heap | PeiTemporayRamSize\r
97 // | |\r
98 // | |\r
99 // |-------------------|----> TempRamBase\r
100 IdtTableInStack.PeiService = NULL;\r
101 ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate);\r
102 for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) {\r
103 CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64));\r
104 }\r
105\r
106 IdtDescriptor.Base = (UINTN) &IdtTableInStack.IdtTable;\r
107 IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);\r
108\r
109 AsmWriteIdtr (&IdtDescriptor);\r
110\r
111 //\r
112 // Initialize the global FSP data region\r
113 //\r
114 FspGlobalDataInit (&PeiFspData, BootLoaderStack, (UINT8)ApiIdx);\r
115\r
116 //\r
117 // Update the base address and length of Pei temporary memory\r
118 //\r
119 SecCoreData.DataSize = sizeof (EFI_SEC_PEI_HAND_OFF);\r
120 SecCoreData.BootFirmwareVolumeBase = BootFirmwareVolume;\r
121 SecCoreData.BootFirmwareVolumeSize = (UINT32)((EFI_FIRMWARE_VOLUME_HEADER *)BootFirmwareVolume)->FvLength;\r
122\r
123 SecCoreData.TemporaryRamBase = (VOID*)(UINTN) TempRamBase;\r
124 SecCoreData.TemporaryRamSize = SizeOfRam;\r
125 SecCoreData.PeiTemporaryRamBase = SecCoreData.TemporaryRamBase;\r
126 SecCoreData.PeiTemporaryRamSize = SecCoreData.TemporaryRamSize * PcdGet8 (PcdFspHeapSizePercentage) / 100;\r
127 SecCoreData.StackBase = (VOID*)(UINTN)((UINTN)SecCoreData.TemporaryRamBase + SecCoreData.PeiTemporaryRamSize);\r
128 SecCoreData.StackSize = SecCoreData.TemporaryRamSize - SecCoreData.PeiTemporaryRamSize;\r
129\r
130 DEBUG ((DEBUG_INFO, "Fsp BootFirmwareVolumeBase - 0x%x\n", SecCoreData.BootFirmwareVolumeBase));\r
131 DEBUG ((DEBUG_INFO, "Fsp BootFirmwareVolumeSize - 0x%x\n", SecCoreData.BootFirmwareVolumeSize));\r
132 DEBUG ((DEBUG_INFO, "Fsp TemporaryRamBase - 0x%x\n", SecCoreData.TemporaryRamBase));\r
133 DEBUG ((DEBUG_INFO, "Fsp TemporaryRamSize - 0x%x\n", SecCoreData.TemporaryRamSize));\r
134 DEBUG ((DEBUG_INFO, "Fsp PeiTemporaryRamBase - 0x%x\n", SecCoreData.PeiTemporaryRamBase));\r
135 DEBUG ((DEBUG_INFO, "Fsp PeiTemporaryRamSize - 0x%x\n", SecCoreData.PeiTemporaryRamSize));\r
136 DEBUG ((DEBUG_INFO, "Fsp StackBase - 0x%x\n", SecCoreData.StackBase));\r
137 DEBUG ((DEBUG_INFO, "Fsp StackSize - 0x%x\n", SecCoreData.StackSize));\r
138\r
139 //\r
140 // Call PeiCore Entry\r
e37bb20c 141 //\r
cf1d4549
JY
142 PeiCore (&SecCoreData, mPeiSecPlatformInformationPpi);\r
143\r
144 //\r
145 // Should never be here\r
146 //\r
147 CpuDeadLoop ();\r
148}\r
149\r
150/**\r
151 This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into\r
152 permanent memory.\r
153\r
154 @param[in] PeiServices Pointer to the PEI Services Table.\r
155 @param[in] TemporaryMemoryBase Source Address in temporary memory from which the SEC or PEIM will copy the\r
156 Temporary RAM contents.\r
157 @param[in] PermanentMemoryBase Destination Address in permanent memory into which the SEC or PEIM will copy the\r
158 Temporary RAM contents.\r
159 @param[in] CopySize Amount of memory to migrate from temporary to permanent memory.\r
160\r
161 @retval EFI_SUCCESS The data was successfully returned.\r
162 @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when\r
163 TemporaryMemoryBase > PermanentMemoryBase.\r
164\r
165**/\r
166EFI_STATUS\r
167EFIAPI\r
168SecTemporaryRamSupport (\r
169 IN CONST EFI_PEI_SERVICES **PeiServices,\r
170 IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,\r
171 IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,\r
172 IN UINTN CopySize\r
173 )\r
174{\r
175 IA32_DESCRIPTOR IdtDescriptor;\r
176 VOID* OldHeap;\r
177 VOID* NewHeap;\r
178 VOID* OldStack;\r
179 VOID* NewStack;\r
180 UINTN HeapSize;\r
181 UINTN StackSize;\r
182\r
183 HeapSize = CopySize * PcdGet8 (PcdFspHeapSizePercentage) / 100 ;\r
184 StackSize = CopySize - HeapSize;\r
e37bb20c 185\r
cf1d4549
JY
186 OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;\r
187 NewHeap = (VOID*)((UINTN)PermanentMemoryBase + StackSize);\r
188\r
189 OldStack = (VOID*)((UINTN)TemporaryMemoryBase + HeapSize);\r
190 NewStack = (VOID*)(UINTN)PermanentMemoryBase;\r
191\r
192 //\r
193 // Migrate Heap\r
194 //\r
195 CopyMem (NewHeap, OldHeap, HeapSize);\r
196\r
197 //\r
198 // Migrate Stack\r
199 //\r
200 CopyMem (NewStack, OldStack, StackSize);\r
201\r
202\r
203 //\r
204 // We need *not* fix the return address because currently,\r
205 // The PeiCore is executed in flash.\r
206 //\r
207\r
208 //\r
209 // Rebase IDT table in permanent memory\r
210 //\r
211 AsmReadIdtr (&IdtDescriptor);\r
212 IdtDescriptor.Base = IdtDescriptor.Base - (UINTN)OldStack + (UINTN)NewStack;\r
213\r
214 AsmWriteIdtr (&IdtDescriptor);\r
215\r
216 //\r
217 // Fixed the FSP data pointer\r
218 //\r
219 FspDataPointerFixUp ((UINTN)NewStack - (UINTN)OldStack);\r
220\r
221 //\r
222 // SecSwitchStack function must be invoked after the memory migration\r
058dcbf2
GL
223 // immediately, also we need fixup the stack change caused by new call into\r
224 // permanent memory.\r
cf1d4549
JY
225 //\r
226 SecSwitchStack (\r
227 (UINT32) (UINTN) OldStack,\r
228 (UINT32) (UINTN) NewStack\r
229 );\r
230\r
231 return EFI_SUCCESS;\r
232}\r