3 Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php.
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI gSecTemporaryRamSupportPpi
= {
18 SecTemporaryRamSupport
21 EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformationPpi
[] = {
23 EFI_PEI_PPI_DESCRIPTOR_PPI
,
24 &gFspInApiModePpiGuid
,
28 (EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
29 &gEfiTemporaryRamSupportPpiGuid
,
30 &gSecTemporaryRamSupportPpi
35 // These are IDT entries pointing to 08:FFFFFFE4h.
37 UINT64 mIdtEntryTemplate
= 0xffff8e000008ffe4ULL
;
41 Entry point to the C language phase of SEC. After the SEC assembly
42 code has initialized some temporary memory and set up the stack,
43 the control is transferred to this function.
46 @param[in] SizeOfRam Size of the temporary memory available for use.
47 @param[in] TempRamBase Base address of temporary ram
48 @param[in] BootFirmwareVolume Base address of the Boot Firmware Volume.
49 @param[in] PeiCore PeiCore entry point.
50 @param[in] BootLoaderStack BootLoader stack.
51 @param[in] ApiIdx the index of API.
53 @return This function never returns.
60 IN UINT32 TempRamBase
,
61 IN VOID
*BootFirmwareVolume
,
62 IN PEI_CORE_ENTRY PeiCore
,
63 IN UINT32 BootLoaderStack
,
67 EFI_SEC_PEI_HAND_OFF SecCoreData
;
68 IA32_DESCRIPTOR IdtDescriptor
;
69 SEC_IDT_TABLE IdtTableInStack
;
71 FSP_GLOBAL_DATA PeiFspData
;
72 UINT64 ExceptionHandler
;
76 // Process all libraries constructor function linked to SecCore.
78 ProcessLibraryConstructorList ();
81 // Initialize floating point operating environment
82 // to be compliant with UEFI spec.
84 InitializeFloatingPointUnits ();
87 // |-------------------|---->
89 // |-------------------|
90 // |PeiService Pointer | PeiStackSize
91 // |-------------------|
94 // |-------------------|---->
97 // | Heap | PeiTemporayRamSize
100 // |-------------------|----> TempRamBase
101 IdtTableInStack
.PeiService
= NULL
;
102 AsmReadIdtr (&IdtDescriptor
);
103 if ((IdtDescriptor
.Base
== 0) && (IdtDescriptor
.Limit
== 0xFFFF)) {
104 ExceptionHandler
= FspGetExceptionHandler(mIdtEntryTemplate
);
105 for (Index
= 0; Index
< FixedPcdGet8(PcdFspMaxInterruptSupported
); Index
++) {
106 CopyMem ((VOID
*)&IdtTableInStack
.IdtTable
[Index
], (VOID
*)&ExceptionHandler
, sizeof (UINT64
));
108 IdtSize
= sizeof (IdtTableInStack
.IdtTable
);
110 if (IdtDescriptor
.Limit
+ 1 > sizeof (IdtTableInStack
.IdtTable
)) {
112 // ERROR: IDT table size from boot loader is larger than FSP can support, DeadLoop here!
116 IdtSize
= IdtDescriptor
.Limit
+ 1;
118 CopyMem ((VOID
*) (UINTN
) &IdtTableInStack
.IdtTable
, (VOID
*) IdtDescriptor
.Base
, IdtSize
);
120 IdtDescriptor
.Base
= (UINTN
) &IdtTableInStack
.IdtTable
;
121 IdtDescriptor
.Limit
= (UINT16
)(IdtSize
- 1);
123 AsmWriteIdtr (&IdtDescriptor
);
126 // Initialize the global FSP data region
128 FspGlobalDataInit (&PeiFspData
, BootLoaderStack
, (UINT8
)ApiIdx
);
131 // Update the base address and length of Pei temporary memory
133 SecCoreData
.DataSize
= sizeof (EFI_SEC_PEI_HAND_OFF
);
134 SecCoreData
.BootFirmwareVolumeBase
= BootFirmwareVolume
;
135 SecCoreData
.BootFirmwareVolumeSize
= (UINT32
)((EFI_FIRMWARE_VOLUME_HEADER
*)BootFirmwareVolume
)->FvLength
;
137 SecCoreData
.TemporaryRamBase
= (VOID
*)(UINTN
) TempRamBase
;
138 SecCoreData
.TemporaryRamSize
= SizeOfRam
;
139 SecCoreData
.PeiTemporaryRamBase
= SecCoreData
.TemporaryRamBase
;
140 SecCoreData
.PeiTemporaryRamSize
= SecCoreData
.TemporaryRamSize
* PcdGet8 (PcdFspHeapSizePercentage
) / 100;
141 SecCoreData
.StackBase
= (VOID
*)(UINTN
)((UINTN
)SecCoreData
.TemporaryRamBase
+ SecCoreData
.PeiTemporaryRamSize
);
142 SecCoreData
.StackSize
= SecCoreData
.TemporaryRamSize
- SecCoreData
.PeiTemporaryRamSize
;
144 DEBUG ((DEBUG_INFO
, "Fsp BootFirmwareVolumeBase - 0x%x\n", SecCoreData
.BootFirmwareVolumeBase
));
145 DEBUG ((DEBUG_INFO
, "Fsp BootFirmwareVolumeSize - 0x%x\n", SecCoreData
.BootFirmwareVolumeSize
));
146 DEBUG ((DEBUG_INFO
, "Fsp TemporaryRamBase - 0x%x\n", SecCoreData
.TemporaryRamBase
));
147 DEBUG ((DEBUG_INFO
, "Fsp TemporaryRamSize - 0x%x\n", SecCoreData
.TemporaryRamSize
));
148 DEBUG ((DEBUG_INFO
, "Fsp PeiTemporaryRamBase - 0x%x\n", SecCoreData
.PeiTemporaryRamBase
));
149 DEBUG ((DEBUG_INFO
, "Fsp PeiTemporaryRamSize - 0x%x\n", SecCoreData
.PeiTemporaryRamSize
));
150 DEBUG ((DEBUG_INFO
, "Fsp StackBase - 0x%x\n", SecCoreData
.StackBase
));
151 DEBUG ((DEBUG_INFO
, "Fsp StackSize - 0x%x\n", SecCoreData
.StackSize
));
154 // Call PeiCore Entry
156 PeiCore (&SecCoreData
, mPeiSecPlatformInformationPpi
);
159 // Should never be here
165 This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into
168 @param[in] PeiServices Pointer to the PEI Services Table.
169 @param[in] TemporaryMemoryBase Source Address in temporary memory from which the SEC or PEIM will copy the
170 Temporary RAM contents.
171 @param[in] PermanentMemoryBase Destination Address in permanent memory into which the SEC or PEIM will copy the
172 Temporary RAM contents.
173 @param[in] CopySize Amount of memory to migrate from temporary to permanent memory.
175 @retval EFI_SUCCESS The data was successfully returned.
176 @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when
177 TemporaryMemoryBase > PermanentMemoryBase.
182 SecTemporaryRamSupport (
183 IN CONST EFI_PEI_SERVICES
**PeiServices
,
184 IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase
,
185 IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase
,
189 IA32_DESCRIPTOR IdtDescriptor
;
197 HeapSize
= CopySize
* PcdGet8 (PcdFspHeapSizePercentage
) / 100 ;
198 StackSize
= CopySize
- HeapSize
;
200 OldHeap
= (VOID
*)(UINTN
)TemporaryMemoryBase
;
201 NewHeap
= (VOID
*)((UINTN
)PermanentMemoryBase
+ StackSize
);
203 OldStack
= (VOID
*)((UINTN
)TemporaryMemoryBase
+ HeapSize
);
204 NewStack
= (VOID
*)(UINTN
)PermanentMemoryBase
;
209 CopyMem (NewHeap
, OldHeap
, HeapSize
);
214 CopyMem (NewStack
, OldStack
, StackSize
);
218 // We need *not* fix the return address because currently,
219 // The PeiCore is executed in flash.
223 // Rebase IDT table in permanent memory
225 AsmReadIdtr (&IdtDescriptor
);
226 IdtDescriptor
.Base
= IdtDescriptor
.Base
- (UINTN
)OldStack
+ (UINTN
)NewStack
;
228 AsmWriteIdtr (&IdtDescriptor
);
231 // Fixed the FSP data pointer
233 FspDataPointerFixUp ((UINTN
)NewStack
- (UINTN
)OldStack
);
236 // SecSwitchStack function must be invoked after the memory migration
237 // immediately, also we need fixup the stack change caused by new call into
241 (UINT32
) (UINTN
) OldStack
,
242 (UINT32
) (UINTN
) NewStack