Reviewed-by: Nate DeSimone <nathaniel.l.desim...@intel.com> > -----Original Message----- > From: Chiu, Chasel <chasel.c...@intel.com> > Sent: Tuesday, August 9, 2022 5:48 PM > To: devel@edk2.groups.io > Cc: Chiu, Chasel <chasel.c...@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desim...@intel.com>; Zeng, Star <star.z...@intel.com> > Subject: [PATCH v2 3/4] IntelFsp2Pkg: Adopt FSP 2.4 MultiPhase functions. > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3916 > > Adopt MultiPhase functions for both FspSecCoreS and FspSecCoreM. > For backward compatibility, new INF are created for new modules. > > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > Cc: Star Zeng <star.z...@intel.com> > Signed-off-by: Chasel Chiu <chasel.c...@intel.com> > --- > IntelFsp2Pkg/FspSecCore/SecFsp.c | 4 ++++ > IntelFsp2Pkg/FspSecCore/SecFspApiChk.c | 9 +++++++++ > IntelFsp2Pkg/FspSecCore/Fsp24SecCoreM.inf | 75 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++ > IntelFsp2Pkg/FspSecCore/Fsp24SecCoreS.inf | 59 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > + > IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryM.nasm | 304 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++ > IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryS.nasm | 101 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++ > IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm | 3 +++ > IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm | 303 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++ > IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryS.nasm | 108 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++ > IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm | 3 +++ > 10 files changed, 969 insertions(+) > > diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.c > b/IntelFsp2Pkg/FspSecCore/SecFsp.c > index d9085ef51f..11be1f97ca 100644 > --- a/IntelFsp2Pkg/FspSecCore/SecFsp.c > +++ b/IntelFsp2Pkg/FspSecCore/SecFsp.c > @@ -135,6 +135,10 @@ FspGlobalDataInit ( > PeiFspData->CoreStack = BootLoaderStack; > > PeiFspData->PerfIdx = 2; > > PeiFspData->PerfSig = FSP_PERFORMANCE_DATA_SIGNATURE; > > + // > > + // Cache FspHobList pointer passed by bootloader via ApiParameter2 > > + // > > + PeiFspData->FspHobListPtr = (VOID **)GetFspApiParameter2 (); > > > > SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_ENTRY); > > > > diff --git a/IntelFsp2Pkg/FspSecCore/SecFspApiChk.c > b/IntelFsp2Pkg/FspSecCore/SecFspApiChk.c > index 35d223a404..a44fbf2a50 100644 > --- a/IntelFsp2Pkg/FspSecCore/SecFspApiChk.c > +++ b/IntelFsp2Pkg/FspSecCore/SecFspApiChk.c > @@ -69,8 +69,17 @@ FspApiCallingCheck ( > Status = EFI_UNSUPPORTED; > > } else if (EFI_ERROR (FspUpdSignatureCheck (FspSiliconInitApiIndex, > ApiParam))) { > > Status = EFI_INVALID_PARAMETER; > > + } else if (ApiIdx == FspSiliconInitApiIndex) { > > + // > > + // Reset MultiPhase NumberOfPhases to zero > > + // > > + FspData->NumberOfPhases = 0; > > } > > } > > + } else if (ApiIdx == FspMultiPhaseMemInitApiIndex) { > > + if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || > ((UINTN)FspData == MAX_UINT32)) { > > + Status = EFI_UNSUPPORTED; > > + } > > } else if (ApiIdx == FspSmmInitApiIndex) { > > // > > // FspSmmInitApiIndex check > > diff --git a/IntelFsp2Pkg/FspSecCore/Fsp24SecCoreM.inf > b/IntelFsp2Pkg/FspSecCore/Fsp24SecCoreM.inf > new file mode 100644 > index 0000000000..e93e176f15 > --- /dev/null > +++ b/IntelFsp2Pkg/FspSecCore/Fsp24SecCoreM.inf > @@ -0,0 +1,75 @@ > +## @file > > +# Sec Core for FSP to support MultiPhase (SeparatePhase) > MemInitialization. > > +# > > +# Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> > > +# > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > +# > > +## > > + > > +[Defines] > > + INF_VERSION = 0x00010005 > > + BASE_NAME = Fsp24SecCoreM > > + FILE_GUID = C5BC0719-4A23-4F6E-94DA-05FB6A0DFA9C > > + MODULE_TYPE = SEC > > + VERSION_STRING = 1.0 > > + > > +# > > +# The following information is for reference only and not required by the > build tools. > > +# > > +# VALID_ARCHITECTURES = IA32 X64 > > +# > > + > > +[Sources] > > + SecMain.c > > + SecMain.h > > + SecFsp.c > > + SecFsp.h > > + SecFspApiChk.c > > + > > +[Sources.IA32] > > + Ia32/Stack.nasm > > + Ia32/Fsp24ApiEntryM.nasm > > + Ia32/FspApiEntryCommon.nasm > > + Ia32/FspHelper.nasm > > + Ia32/ReadEsp.nasm > > + > > +[Sources.X64] > > + X64/Stack.nasm > > + X64/Fsp24ApiEntryM.nasm > > + X64/FspApiEntryCommon.nasm > > + X64/FspHelper.nasm > > + X64/ReadRsp.nasm > > + > > +[Binaries.Ia32] > > + RAW|Vtf0/Bin/ResetVec.ia32.raw |GCC > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + IntelFsp2Pkg/IntelFsp2Pkg.dec > > + UefiCpuPkg/UefiCpuPkg.dec > > + > > +[LibraryClasses] > > + BaseMemoryLib > > + DebugLib > > + BaseLib > > + PciCf8Lib > > + SerialPortLib > > + FspSwitchStackLib > > + FspCommonLib > > + FspSecPlatformLib > > + CpuLib > > + UefiCpuLib > > + FspMultiPhaseLib > > + > > +[Pcd] > > + gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase ## > CONSUMES > > + gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize ## > CONSUMES > > + gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize ## > CONSUMES > > + gIntelFsp2PkgTokenSpaceGuid.PcdFspHeapSizePercentage ## > CONSUMES > > + gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxInterruptSupported ## > CONSUMES > > + gIntelFsp2PkgTokenSpaceGuid.PcdFspPrivateTemporaryRamSize ## > CONSUMES > > + > > +[Ppis] > > + gEfiTemporaryRamSupportPpiGuid ## PRODUCES > > + gFspInApiModePpiGuid ## PRODUCES > > diff --git a/IntelFsp2Pkg/FspSecCore/Fsp24SecCoreS.inf > b/IntelFsp2Pkg/FspSecCore/Fsp24SecCoreS.inf > new file mode 100644 > index 0000000000..1d44fb67b5 > --- /dev/null > +++ b/IntelFsp2Pkg/FspSecCore/Fsp24SecCoreS.inf > @@ -0,0 +1,59 @@ > +## @file > > +# Sec Core for FSP to support MultiPhase (SeparatePhase) SiInitialization. > > +# > > +# Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> > > +# > > +# SPDX-License-Identifier: BSD-2-Clause-Patent > > +# > > +## > > + > > +[Defines] > > + INF_VERSION = 0x00010005 > > + BASE_NAME = Fsp24SecCoreS > > + FILE_GUID = E039988B-0F21-4D95-AE34-C469B10E13F8 > > + MODULE_TYPE = SEC > > + VERSION_STRING = 1.0 > > + > > +# > > +# The following information is for reference only and not required by the > build tools. > > +# > > +# VALID_ARCHITECTURES = IA32 X64 > > +# > > + > > +[Sources] > > + SecFspApiChk.c > > + SecFsp.h > > + > > +[Sources.IA32] > > + Ia32/Stack.nasm > > + Ia32/Fsp24ApiEntryS.nasm > > + Ia32/FspApiEntryCommon.nasm > > + Ia32/FspHelper.nasm > > + > > +[Sources.X64] > > + X64/Stack.nasm > > + X64/Fsp24ApiEntryS.nasm > > + X64/FspApiEntryCommon.nasm > > + X64/FspHelper.nasm > > + > > +[Binaries.Ia32] > > + RAW|Vtf0/Bin/ResetVec.ia32.raw |GCC > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + IntelFsp2Pkg/IntelFsp2Pkg.dec > > + > > +[LibraryClasses] > > + BaseMemoryLib > > + DebugLib > > + BaseLib > > + PciCf8Lib > > + SerialPortLib > > + FspSwitchStackLib > > + FspCommonLib > > + FspSecPlatformLib > > + FspMultiPhaseLib > > + > > +[Ppis] > > + gEfiTemporaryRamSupportPpiGuid ## PRODUCES > > + > > diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryM.nasm > b/IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryM.nasm > new file mode 100644 > index 0000000000..997b9c0bff > --- /dev/null > +++ b/IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryM.nasm > @@ -0,0 +1,304 @@ > +;; @file > > +; Provide FSP API entry points. > > +; > > +; Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +;; > > + > > + SECTION .text > > + > > +; > > +; Following are fixed PCDs > > +; > > +extern ASM_PFX(PcdGet32(PcdTemporaryRamBase)) > > +extern ASM_PFX(PcdGet32(PcdTemporaryRamSize)) > > +extern ASM_PFX(PcdGet32(PcdFspTemporaryRamSize)) > > +extern ASM_PFX(PcdGet8 (PcdFspHeapSizePercentage)) > > + > > +struc FSPM_UPD_COMMON > > + ; FSP_UPD_HEADER { > > + .FspUpdHeader: resd 8 > > + ; } > > + ; FSPM_ARCH_UPD { > > + .Revision: resb 1 > > + .Reserved: resb 3 > > + .NvsBufferPtr: resd 1 > > + .StackBase: resd 1 > > + .StackSize: resd 1 > > + .BootLoaderTolumSize: resd 1 > > + .BootMode: resd 1 > > + .Reserved1: resb 8 > > + ; } > > + .size: > > +endstruc > > + > > +struc FSPM_UPD_COMMON_FSP24 > > + ; FSP_UPD_HEADER { > > + .FspUpdHeader: resd 8 > > + ; } > > + ; FSPM_ARCH2_UPD { > > + .Revision: resb 1 > > + .Reserved: resb 3 > > + .Length resd 1 > > + .StackBase: resq 1 > > + .StackSize: resq 1 > > + .BootLoaderTolumSize: resd 1 > > + .BootMode: resd 1 > > + .FspEventHandler resq 1 > > + .Reserved1: resb 24 > > + ; } > > + .size: > > +endstruc > > + > > +; > > +; Following functions will be provided in C > > +; > > +extern ASM_PFX(SecStartup) > > +extern ASM_PFX(FspApiCommon) > > + > > +; > > +; Following functions will be provided in PlatformSecLib > > +; > > +extern ASM_PFX(AsmGetFspBaseAddress) > > +extern ASM_PFX(AsmGetFspInfoHeader) > > +extern ASM_PFX(FspMultiPhaseMemInitApiHandler) > > + > > +STACK_SAVED_EAX_OFFSET EQU 4 * 7 ; size of a general purpose > register * eax index > > +API_PARAM1_OFFSET EQU 34h ; ApiParam1 [ sub esp,8 + pushad + > pushfd + push eax + call] > > +FSP_HEADER_IMGBASE_OFFSET EQU 1Ch > > +FSP_HEADER_CFGREG_OFFSET EQU 24h > > + > > +;---------------------------------------------------------------------------- > > +; FspMemoryInit API > > +; > > +; This FSP API is called after TempRamInit and initializes the memory. > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspMemoryInitApi) > > +ASM_PFX(FspMemoryInitApi): > > + mov eax, 3 ; FSP_API_INDEX.FspMemoryInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspMultiPhaseMemoryInitApi API > > +; > > +; This FSP API provides multi-phase Memory initialization, which brings > greater > > +; modularity beyond the existing FspMemoryInit() API. > > +; Increased modularity is achieved by adding an extra API to FSP-M. > > +; This allows the bootloader to add board specific initialization steps > throughout > > +; the MemoryInit flow as needed. > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspMultiPhaseMemoryInitApi) > > +ASM_PFX(FspMultiPhaseMemoryInitApi): > > + mov eax, 8 ; FSP_API_INDEX.FspMultiPhaseMemInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > +;---------------------------------------------------------------------------- > > +; TempRamExitApi API > > +; > > +; This API tears down temporary RAM > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(TempRamExitApi) > > +ASM_PFX(TempRamExitApi): > > + mov eax, 4 ; FSP_API_INDEX.TempRamExitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspApiCommonContinue API > > +; > > +; This is the FSP API common entry point to resume the FSP execution > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspApiCommonContinue) > > +ASM_PFX(FspApiCommonContinue): > > + ; > > + ; Handle FspMultiPhaseMemInitApiIndex API > > + ; > > + cmp eax, 8 ; FspMultiPhaseMemInitApiIndex > > + jnz NotMultiPhaseMemoryInitApi > > + > > + pushad > > + push DWORD [esp + (4 * 8 + 4)] ; push ApiParam > > + push eax ; push ApiIdx > > + call ASM_PFX(FspMultiPhaseMemInitApiHandler) > > + add esp, 8 > > + mov dword [esp + STACK_SAVED_EAX_OFFSET], eax > > + popad > > + ret > > + > > +NotMultiPhaseMemoryInitApi: > > + > > + ; > > + ; FspMemoryInit API setup the initial stack frame > > + ; > > + > > + ; > > + ; Place holder to store the FspInfoHeader pointer > > + ; > > + push eax > > + > > + ; > > + ; Update the FspInfoHeader pointer > > + ; > > + push eax > > + call ASM_PFX(AsmGetFspInfoHeader) > > + mov [esp + 4], eax > > + pop eax > > + > > + ; > > + ; Create a Task Frame in the stack for the Boot Loader > > + ; > > + pushfd ; 2 pushf for 4 byte alignment > > + cli > > + pushad > > + > > + ; Reserve 8 bytes for IDT save/restore > > + sub esp, 8 > > + sidt [esp] > > + > > + > > + ; Get Stackbase and StackSize from FSPM_UPD Param > > + mov edx, [esp + API_PARAM1_OFFSET] > > + cmp edx, 0 > > + jnz FspStackSetup > > + > > + ; Get UPD default values if FspmUpdDataPtr (ApiParam1) is null > > + push eax > > + call ASM_PFX(AsmGetFspInfoHeader) > > + mov edx, [eax + FSP_HEADER_IMGBASE_OFFSET] > > + add edx, [eax + FSP_HEADER_CFGREG_OFFSET] > > + pop eax > > + > > +FspStackSetup: > > + mov ecx, [edx + FSPM_UPD_COMMON.Revision] > > + cmp ecx, 3 > > + jae FspmUpdCommon2 > > + > > + ; > > + ; StackBase = temp memory base, StackSize = temp memory size > > + ; > > + mov edi, [edx + FSPM_UPD_COMMON.StackBase] > > + mov ecx, [edx + FSPM_UPD_COMMON.StackSize] > > + jmp ChkFspHeapSize > > + > > +FspmUpdCommon2: > > + mov edi, [edx + FSPM_UPD_COMMON_FSP24.StackBase] > > + mov ecx, [edx + FSPM_UPD_COMMON_FSP24.StackSize] > > + > > +ChkFspHeapSize: > > + ; > > + ; Keep using bootloader stack if heap size % is 0 > > + ; > > + mov bl, BYTE [ASM_PFX(PcdGet8 (PcdFspHeapSizePercentage))] > > + cmp bl, 0 > > + jz SkipStackSwitch > > + > > + ; > > + ; Set up a dedicated temp ram stack for FSP if FSP heap size % doesn't > equal 0 > > + ; > > + add edi, ecx > > + ; > > + ; Switch to new FSP stack > > + ; > > + xchg edi, esp ; Exchange edi and esp, edi > will be assigned > to the current esp pointer and esp will be Stack base + Stack size > > + > > +SkipStackSwitch: > > + ; > > + ; If heap size % is 0: > > + ; EDI is FSPM_UPD_COMMON.StackBase and will hold ESP later (boot > loader stack pointer) > > + ; ECX is FSPM_UPD_COMMON.StackSize > > + ; ESP is boot loader stack pointer (no stack switch) > > + ; BL is 0 to indicate no stack switch (EBX will hold > FSPM_UPD_COMMON.StackBase later) > > + ; > > + ; If heap size % is not 0 > > + ; EDI is boot loader stack pointer > > + ; ECX is FSPM_UPD_COMMON.StackSize > > + ; ESP is new stack (FSPM_UPD_COMMON.StackBase + > FSPM_UPD_COMMON.StackSize) > > + ; BL is NOT 0 to indicate stack has switched > > + ; > > + cmp bl, 0 > > + jnz StackHasBeenSwitched > > + > > + mov ebx, edi ; Put > FSPM_UPD_COMMON.StackBase to > ebx as temp memory base > > + mov edi, esp ; Put boot loader stack > pointer to edi > > + jmp StackSetupDone > > + > > +StackHasBeenSwitched: > > + mov ebx, esp ; Put Stack base + Stack > size in ebx > > + sub ebx, ecx ; Stack base + Stack size - > Stack size as temp > memory base > > + > > +StackSetupDone: > > + > > + ; > > + ; Pass the API Idx to SecStartup > > + ; > > + push eax > > + > > + ; > > + ; Pass the BootLoader stack to SecStartup > > + ; > > + push edi > > + > > + ; > > + ; Pass entry point of the PEI core > > + ; > > + call ASM_PFX(AsmGetFspBaseAddress) > > + mov edi, eax > > + call ASM_PFX(AsmGetPeiCoreOffset) > > + add edi, eax > > + push edi > > + > > + ; > > + ; Pass BFV into the PEI Core > > + ; It uses relative address to calculate the actual boot FV base > > + ; For FSP implementation with single FV, PcdFspBootFirmwareVolumeBase > and > > + ; PcdFspAreaBaseAddress are the same. For FSP with multiple FVs, > > + ; they are different. The code below can handle both cases. > > + ; > > + call ASM_PFX(AsmGetFspBaseAddress) > > + push eax > > + > > + ; > > + ; Pass stack base and size into the PEI Core > > + ; > > + push ebx > > + push ecx > > + > > + ; > > + ; Pass Control into the PEI Core > > + ; > > + call ASM_PFX(SecStartup) > > + add esp, 4 > > +exit: > > + ret > > + > > +global ASM_PFX(FspPeiCoreEntryOff) > > +ASM_PFX(FspPeiCoreEntryOff): > > + ; > > + ; This value will be patched by the build script > > + ; > > + DD 0x12345678 > > + > > +global ASM_PFX(AsmGetPeiCoreOffset) > > +ASM_PFX(AsmGetPeiCoreOffset): > > + mov eax, dword [ASM_PFX(FspPeiCoreEntryOff)] > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; TempRamInit API > > +; > > +; Empty function for WHOLEARCHIVE build option > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(TempRamInitApi) > > +ASM_PFX(TempRamInitApi): > > + jmp $ > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; Module Entrypoint API > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(_ModuleEntryPoint) > > +ASM_PFX(_ModuleEntryPoint): > > + jmp $ > > diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryS.nasm > b/IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryS.nasm > new file mode 100644 > index 0000000000..bda99cdd80 > --- /dev/null > +++ b/IntelFsp2Pkg/FspSecCore/Ia32/Fsp24ApiEntryS.nasm > @@ -0,0 +1,101 @@ > +;; @file > > +; Provide FSP API entry points. > > +; > > +; Copyright (c) 2020, Intel Corporation. All rights reserved.<BR> > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +;; > > + > > + SECTION .text > > + > > +; > > +; Following functions will be provided in C > > +; > > +extern ASM_PFX(FspApiCommon) > > +extern ASM_PFX(FspMultiPhaseSiInitApiHandlerV2) > > + > > +STACK_SAVED_EAX_OFFSET EQU 4 * 7 ; size of a general purpose > register * eax index > > + > > +;---------------------------------------------------------------------------- > > +; NotifyPhase API > > +; > > +; This FSP API will notify the FSP about the different phases in the boot > > +; process > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(NotifyPhaseApi) > > +ASM_PFX(NotifyPhaseApi): > > + mov eax, 2 ; FSP_API_INDEX.NotifyPhaseApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspSiliconInit API > > +; > > +; This FSP API initializes the CPU and the chipset including the IO > > +; controllers in the chipset to enable normal operation of these devices. > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspSiliconInitApi) > > +ASM_PFX(FspSiliconInitApi): > > + mov eax, 5 ; FSP_API_INDEX.FspSiliconInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspMultiPhaseSiInitApi API > > +; > > +; This FSP API provides multi-phase silicon initialization, which brings > greater > > +; modularity beyond the existing FspSiliconInit() API. > > +; Increased modularity is achieved by adding an extra API to FSP-S. > > +; This allows the bootloader to add board specific initialization steps > throughout > > +; the SiliconInit flow as needed. > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspMultiPhaseSiInitApi) > > +ASM_PFX(FspMultiPhaseSiInitApi): > > + mov eax, 6 ; FSP_API_INDEX.FspMultiPhaseSiInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspApiCommonContinue API > > +; > > +; This is the FSP API common entry point to resume the FSP execution > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspApiCommonContinue) > > +ASM_PFX(FspApiCommonContinue): > > + ; > > + ; Handle FspMultiPhaseSiInitApiIndex API > > + ; > > + cmp eax, 6 ; FspMultiPhaseSiInitApiIndex > > + jnz NotMultiPhaseSiInitApi > > + > > + pushad > > + push DWORD [esp + (4 * 8 + 4)] ; push ApiParam > > + push eax ; push ApiIdx > > + call ASM_PFX(FspMultiPhaseSiInitApiHandlerV2) > > + add esp, 8 > > + mov dword [esp + STACK_SAVED_EAX_OFFSET], eax > > + popad > > + ret > > + > > +NotMultiPhaseSiInitApi: > > + jmp $ > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; TempRamInit API > > +; > > +; Empty function for WHOLEARCHIVE build option > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(TempRamInitApi) > > +ASM_PFX(TempRamInitApi): > > + jmp $ > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; Module Entrypoint API > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(_ModuleEntryPoint) > > +ASM_PFX(_ModuleEntryPoint): > > + jmp $ > > + > > diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm > b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm > index 8d8deba28a..87446be779 100644 > --- a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm > +++ b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm > @@ -67,6 +67,9 @@ FspApiCommon2: > cmp eax, 6 ; FspMultiPhaseSiInitApiIndex API > > jz FspApiCommon3 > > > > + cmp eax, 8 ; FspMultiPhaseMemInitApiIndex API > > + jz FspApiCommon3 > > + > > call ASM_PFX(AsmGetFspInfoHeader) > > jmp ASM_PFX(Loader2PeiSwitchStack) > > > > diff --git a/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm > b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm > new file mode 100644 > index 0000000000..8880721f29 > --- /dev/null > +++ b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm > @@ -0,0 +1,303 @@ > +;; @file > > +; Provide FSP API entry points. > > +; > > +; Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +;; > > + > > + SECTION .text > > + > > +%include "PushPopRegsNasm.inc" > > + > > +; > > +; Following are fixed PCDs > > +; > > +extern ASM_PFX(PcdGet8 (PcdFspHeapSizePercentage)) > > + > > +struc FSPM_UPD_COMMON_FSP24 > > + ; FSP_UPD_HEADER { > > + .FspUpdHeader: resd 8 > > + ; } > > + ; FSPM_ARCH2_UPD { > > + .Revision: resb 1 > > + .Reserved: resb 3 > > + .Length resd 1 > > + .StackBase: resq 1 > > + .StackSize: resq 1 > > + .BootLoaderTolumSize: resd 1 > > + .BootMode: resd 1 > > + .FspEventHandler resq 1 > > + .Reserved1: resb 24 > > + ; } > > + .size: > > +endstruc > > + > > +; > > +; Following functions will be provided in C > > +; > > +extern ASM_PFX(SecStartup) > > +extern ASM_PFX(FspApiCommon) > > + > > +; > > +; Following functions will be provided in PlatformSecLib > > +; > > +extern ASM_PFX(AsmGetFspBaseAddress) > > +extern ASM_PFX(AsmGetFspInfoHeader) > > +extern ASM_PFX(FspMultiPhaseMemInitApiHandler) > > + > > +STACK_SAVED_RAX_OFFSET EQU 8 * 7 ; size of a general purpose > register * rax index > > +FSP_HEADER_IMGBASE_OFFSET EQU 1Ch > > +FSP_HEADER_CFGREG_OFFSET EQU 24h > > + > > +;---------------------------------------------------------------------------- > > +; FspMemoryInit API > > +; > > +; This FSP API is called after TempRamInit and initializes the memory. > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspMemoryInitApi) > > +ASM_PFX(FspMemoryInitApi): > > + mov rax, 3 ; FSP_API_INDEX.FspMemoryInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspMultiPhaseMemoryInitApi API > > +; > > +; This FSP API provides multi-phase Memory initialization, which brings > greater > > +; modularity beyond the existing FspMemoryInit() API. > > +; Increased modularity is achieved by adding an extra API to FSP-M. > > +; This allows the bootloader to add board specific initialization steps > throughout > > +; the MemoryInit flow as needed. > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspMultiPhaseMemoryInitApi) > > +ASM_PFX(FspMultiPhaseMemoryInitApi): > > + mov rax, 8 ; FSP_API_INDEX.FspMultiPhaseMemInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > +;---------------------------------------------------------------------------- > > +; TempRamExitApi API > > +; > > +; This API tears down temporary RAM > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(TempRamExitApi) > > +ASM_PFX(TempRamExitApi): > > + mov rax, 4 ; FSP_API_INDEX.TempRamExitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspApiCommonContinue API > > +; > > +; This is the FSP API common entry point to resume the FSP execution > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspApiCommonContinue) > > +ASM_PFX(FspApiCommonContinue): > > + ; > > + ; Handle FspMultiPhaseMemoInitApiIndex API > > + ; > > + push rdx ; Push a QWORD data for stack alignment > > + > > + cmp rax, 8 ; FspMultiPhaseMemInitApiIndex > > + jnz NotMultiPhaseMemoryInitApi > > + > > + PUSHA_64 > > + mov rdx, rcx ; move ApiParam to rdx > > + mov rcx, rax ; move ApiIdx to rcx > > + sub rsp, 0x20 ; calling C function may need shadow space > > + call ASM_PFX(FspMultiPhaseMemInitApiHandler) > > + add rsp, 0x20 ; restore shadow space > > + mov qword [rsp + STACK_SAVED_RAX_OFFSET], rax > > + POPA_64 > > + add rsp, 0x08 > > + ret > > + > > +NotMultiPhaseMemoryInitApi: > > + ; Push RDX and RCX to form CONTEXT_STACK_64 > > + push rdx ; Push API Parameter2 on stack > > + push rcx ; Push API Parameter1 on stack > > + > > + ; > > + ; FspMemoryInit API setup the initial stack frame > > + ; > > + > > + ; > > + ; Place holder to store the FspInfoHeader pointer > > + ; > > + push rax > > + > > + ; > > + ; Update the FspInfoHeader pointer > > + ; > > + push rax > > + call ASM_PFX(AsmGetFspInfoHeader) > > + mov [rsp + 8], rax > > + pop rax > > + > > + ; > > + ; Create a Task Frame in the stack for the Boot Loader > > + ; > > + pushfq > > + cli > > + PUSHA_64 > > + > > + ; Reserve 16 bytes for IDT save/restore > > + sub rsp, 16 > > + sidt [rsp] > > + > > + ; Get Stackbase and StackSize from FSPM_UPD Param > > + mov rdx, rcx ; Put FSPM_UPD Param to rdx > > + cmp rdx, 0 > > + jnz FspStackSetup > > + > > + ; Get UPD default values if FspmUpdDataPtr (ApiParam1) is null > > + xchg rbx, rax > > + call ASM_PFX(AsmGetFspInfoHeader) > > + mov edx, [rax + FSP_HEADER_IMGBASE_OFFSET] > > + add edx, [rax + FSP_HEADER_CFGREG_OFFSET] > > + xchg rbx, rax > > + > > +FspStackSetup: > > + mov cl, [rdx + FSPM_UPD_COMMON_FSP24.Revision] > > + cmp cl, 3 > > + jae FspmUpdCommonFsp24 > > + > > + mov rax, 08000000000000002h ; RETURN_INVALID_PARAMETER > > + sub rsp, 0b8h > > + ret > > + > > +FspmUpdCommonFsp24: > > + ; > > + ; StackBase = temp memory base, StackSize = temp memory size > > + ; > > + mov rdi, [rdx + FSPM_UPD_COMMON_FSP24.StackBase] > > + mov ecx, [rdx + FSPM_UPD_COMMON_FSP24.StackSize] > > + > > + ; > > + ; Keep using bootloader stack if heap size % is 0 > > + ; > > + mov rbx, ASM_PFX(PcdGet8 (PcdFspHeapSizePercentage)) > > + mov bl, BYTE [rbx] > > + cmp bl, 0 > > + jz SkipStackSwitch > > + > > + ; > > + ; Set up a dedicated temp ram stack for FSP if FSP heap size % doesn't > equal 0 > > + ; > > + add rdi, rcx > > + ; > > + ; Switch to new FSP stack > > + ; > > + xchg rdi, rsp ; Exchange rdi and rsp, rdi > will be assigned to > the current rsp pointer and rsp will be Stack base + Stack size > > + > > +SkipStackSwitch: > > + ; > > + ; If heap size % is 0: > > + ; EDI is FSPM_UPD_COMMON_FSP24.StackBase and will hold ESP later > (boot loader stack pointer) > > + ; ECX is FSPM_UPD_COMMON_FSP24.StackSize > > + ; ESP is boot loader stack pointer (no stack switch) > > + ; BL is 0 to indicate no stack switch (EBX will hold > FSPM_UPD_COMMON_FSP24.StackBase later) > > + ; > > + ; If heap size % is not 0 > > + ; EDI is boot loader stack pointer > > + ; ECX is FSPM_UPD_COMMON_FSP24.StackSize > > + ; ESP is new stack (FSPM_UPD_COMMON_FSP24.StackBase + > FSPM_UPD_COMMON_FSP24.StackSize) > > + ; BL is NOT 0 to indicate stack has switched > > + ; > > + cmp bl, 0 > > + jnz StackHasBeenSwitched > > + > > + mov rbx, rdi ; Put > FSPM_UPD_COMMON_FSP24.StackBase to rbx as temp memory base > > + mov rdi, rsp ; Put boot loader stack > pointer to rdi > > + jmp StackSetupDone > > + > > +StackHasBeenSwitched: > > + mov rbx, rsp ; Put Stack base + Stack > size in ebx > > + sub rbx, rcx ; Stack base + Stack size - > Stack size as temp > memory base > > + > > +StackSetupDone: > > + > > + ; > > + ; Per X64 calling convention, make sure RSP is 16-byte aligned. > > + ; > > + mov rdx, rsp > > + and rdx, 0fh > > + sub rsp, rdx > > + > > + ; > > + ; Pass the API Idx to SecStartup > > + ; > > + push rax > > + > > + ; > > + ; Pass the BootLoader stack to SecStartup > > + ; > > + push rdi > > + > > + ; > > + ; Pass BFV into the PEI Core > > + ; It uses relative address to calculate the actual boot FV base > > + ; For FSP implementation with single FV, PcdFspBootFirmwareVolumeBase > and > > + ; PcdFspAreaBaseAddress are the same. For FSP with multiple FVs, > > + ; they are different. The code below can handle both cases. > > + ; > > + call ASM_PFX(AsmGetFspBaseAddress) > > + mov r8, rax > > + > > + ; > > + ; Pass entry point of the PEI core > > + ; > > + call ASM_PFX(AsmGetPeiCoreOffset) > > + lea r9, [r8 + rax] > > + > > + ; > > + ; Pass stack base and size into the PEI Core > > + ; > > + mov rcx, rcx > > + mov rdx, rbx > > + > > + ; > > + ; Pass Control into the PEI Core > > + ; RCX = SizeOfRam, RDX = TempRamBase, R8 = BFV, R9 = PeiCoreEntry, Last > 1 Stack = BL stack, Last 2 Stack = API index > > + ; According to X64 calling convention, caller has to allocate 32 bytes as a > shadow store on call stack right before > > + ; calling the function. > > + ; > > + sub rsp, 20h > > + call ASM_PFX(SecStartup) > > + add rsp, 20h > > +exit: > > + ret > > + > > +global ASM_PFX(FspPeiCoreEntryOff) > > +ASM_PFX(FspPeiCoreEntryOff): > > + ; > > + ; This value will be patched by the build script > > + ; > > + DD 0x12345678 > > + > > +global ASM_PFX(AsmGetPeiCoreOffset) > > +ASM_PFX(AsmGetPeiCoreOffset): > > + push rbx > > + mov rbx, ASM_PFX(FspPeiCoreEntryOff) > > + mov eax, dword[ebx] > > + pop rbx > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; TempRamInit API > > +; > > +; Empty function for WHOLEARCHIVE build option > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(TempRamInitApi) > > +ASM_PFX(TempRamInitApi): > > + jmp $ > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; Module Entrypoint API > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(_ModuleEntryPoint) > > +ASM_PFX(_ModuleEntryPoint): > > + jmp $ > > + > > diff --git a/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryS.nasm > b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryS.nasm > new file mode 100644 > index 0000000000..5bbbc5d1d0 > --- /dev/null > +++ b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryS.nasm > @@ -0,0 +1,108 @@ > +;; @file > > +; Provide FSP API entry points. > > +; > > +; Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> > > +; SPDX-License-Identifier: BSD-2-Clause-Patent > > +;; > > + > > + SECTION .text > > + > > +; > > +; Following functions will be provided in C > > +; > > +extern ASM_PFX(FspApiCommon) > > +extern ASM_PFX(FspMultiPhaseSiInitApiHandlerV2) > > + > > +STACK_SAVED_RAX_OFFSET EQU 8 * 7 ; size of a general purpose > register * rax index > > + > > +;---------------------------------------------------------------------------- > > +; NotifyPhase API > > +; > > +; This FSP API will notify the FSP about the different phases in the boot > > +; process > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(NotifyPhaseApi) > > +ASM_PFX(NotifyPhaseApi): > > + mov rax, 2 ; FSP_API_INDEX.NotifyPhaseApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspSiliconInit API > > +; > > +; This FSP API initializes the CPU and the chipset including the IO > > +; controllers in the chipset to enable normal operation of these devices. > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspSiliconInitApi) > > +ASM_PFX(FspSiliconInitApi): > > + mov rax, 5 ; FSP_API_INDEX.FspSiliconInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspMultiPhaseSiInitApi API > > +; > > +; This FSP API provides multi-phase silicon initialization, which brings > greater > > +; modularity beyond the existing FspSiliconInit() API. > > +; Increased modularity is achieved by adding an extra API to FSP-S. > > +; This allows the bootloader to add board specific initialization steps > throughout > > +; the SiliconInit flow as needed. > > +; > > +;---------------------------------------------------------------------------- > > + > > +%include "PushPopRegsNasm.inc" > > + > > +global ASM_PFX(FspMultiPhaseSiInitApi) > > +ASM_PFX(FspMultiPhaseSiInitApi): > > + mov rax, 6 ; FSP_API_INDEX.FspMultiPhaseSiInitApiIndex > > + jmp ASM_PFX(FspApiCommon) > > + > > +;---------------------------------------------------------------------------- > > +; FspApiCommonContinue API > > +; > > +; This is the FSP API common entry point to resume the FSP execution > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(FspApiCommonContinue) > > +ASM_PFX(FspApiCommonContinue): > > + ; > > + ; Handle FspMultiPhaseSiInitApiIndex API > > + ; > > + push rdx ; Push a QWORD data for stack alignment > > + > > + cmp rax, 6 ; FSP_API_INDEX.FspMultiPhaseSiInitApiIndex > > + jnz NotMultiPhaseSiInitApi > > + > > + PUSHA_64 > > + mov rdx, rcx ; move ApiParam to rdx > > + mov rcx, rax ; move ApiIdx to rcx > > + sub rsp, 0x20 ; calling C function may need shadow space > > + call ASM_PFX(FspMultiPhaseSiInitApiHandlerV2) > > + add rsp, 0x20 ; restore shadow space > > + mov qword [rsp + STACK_SAVED_RAX_OFFSET], rax > > + POPA_64 > > + add rsp, 0x08 > > + ret > > + > > +NotMultiPhaseSiInitApi: > > + jmp $ > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; TempRamInit API > > +; > > +; Empty function for WHOLEARCHIVE build option > > +; > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(TempRamInitApi) > > +ASM_PFX(TempRamInitApi): > > + jmp $ > > + ret > > + > > +;---------------------------------------------------------------------------- > > +; Module Entrypoint API > > +;---------------------------------------------------------------------------- > > +global ASM_PFX(_ModuleEntryPoint) > > +ASM_PFX(_ModuleEntryPoint): > > + jmp $ > > + > > diff --git a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm > b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm > index 718e672e02..dc6b8c99a1 100644 > --- a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm > +++ b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm > @@ -68,6 +68,9 @@ FspApiCommon2: > cmp rax, 6 ; FspMultiPhaseSiInitApiIndex API > > jz FspApiCommon3 > > > > + cmp rax, 8 ; FspMultiPhaseMemInitApiIndex API > > + jz FspApiCommon3 > > + > > call ASM_PFX(AsmGetFspInfoHeader) > > jmp ASM_PFX(Loader2PeiSwitchStack) > > > > -- > 2.35.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#92991): https://edk2.groups.io/g/devel/message/92991 Mute This Topic: https://groups.io/mt/92928035/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-