From: Ma, Maurice Date: Wed, 29 Apr 2015 03:10:24 +0000 (+0000) Subject: Add dual FSP binaries support. X-Git-Tag: edk2-stable201903~9979 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=3b17b2458726bf7e2cf640d29ebe14f8af587905 Add dual FSP binaries support. There are two FSP images at different locations in a flash (one factory version is read only and other in updatable version) TempRamInit, FspMemoryInit and TempRamExit are executed from factory version and FspSiliconInit/NotifyPhase will be executed from updatable version. Also update FSP specification version to v1.1. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: "Ma, Maurice" Reviewed-by: "Yao, Jiewen" git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17248 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm index 01b0bfab31..d736f80358 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm +++ b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm @@ -38,8 +38,9 @@ EXTERN FspApiCallingCheck:PROC ; Following functions will be provided in PlatformSecLib ; EXTERN GetFspBaseAddress:PROC +EXTERN GetFspInfoHdr:PROC EXTERN GetBootFirmwareVolumeOffset:PROC -EXTERN Pei2LoaderSwitchStack:PROC +EXTERN Loader2PeiSwitchStack:PROC EXTERN LoadMicrocode(LoadMicrocodeDefault):PROC EXTERN SecPlatformInit(SecPlatformInitDefault):PROC EXTERN SecCarInit:PROC @@ -370,8 +371,7 @@ TempRamInitApi PROC NEAR PUBLIC jz NemInitExit ; - ; CPUID/DeviceID check - ; and Sec Platform Init + ; Sec Platform Init ; CALL_MMX SecPlatformInit cmp eax, 0 @@ -505,7 +505,9 @@ FspApiCommon PROC C PUBLIC jz @F cmp eax, 3 ; FspMemoryInit API jz @F - jmp Pei2LoaderSwitchStack + + call GetFspInfoHdr + jmp Loader2PeiSwitchStack @@: ; @@ -513,9 +515,17 @@ FspApiCommon PROC C PUBLIC ; ; - ; Store the address in FSP which will return control to the BL + ; Place holder to store the FspInfoHeader pointer ; - push offset exit + push eax + + ; + ; Update the FspInfoHeader pointer + ; + push eax + call GetFspInfoHdr + mov [esp + 4], eax + pop eax ; ; Create a Task Frame in the stack for the Boot Loader @@ -582,7 +592,7 @@ FspApiCommon PROC C PUBLIC ; Pass Control into the PEI Core ; call SecStartup - + add esp, 4 exit: ret diff --git a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s index 1d8fe0bcd2..d0f5b20b96 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s +++ b/IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s @@ -215,8 +215,10 @@ ASM_GLOBAL ASM_PFX(FspApiCallingCheck) # # Following functions will be provided in PlatformSecLib # +ASM_GLOBAL ASM_PFX(GetFspBaseAddress) +ASM_GLOBAL ASM_PFX(GetFspInfoHdr) ASM_GLOBAL ASM_PFX(GetBootFirmwareVolumeOffset) -ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack) +ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack) # @@ -561,8 +563,7 @@ ASM_PFX(TempRamInitApi): jz NemInitExit # - # CPUID/DeviceID check - # and Sec Platform Init + # Sec Platform Init # movl $TempRamInitApiL1, %esi #CALL_MMX SecPlatformInit movd %esi, %mm7 @@ -717,7 +718,8 @@ FspApiCommonL1: jz FspApiCommonL2 cmpl $0x03, %eax # FspMemoryInit API jz FspApiCommonL2 - jmp Pei2LoaderSwitchStack + call ASM_PFX(GetFspInfoHdr) + jmp Loader2PeiSwitchStack FspApiCommonL2: # @@ -725,9 +727,17 @@ FspApiCommonL2: # # - # Store the address in FSP which will return control to the BL + # Place holder to store the FspInfoHeader pointer # - pushl $FspApiCommonExit + pushl %eax + + # + # Update the FspInfoHeader pointer + # + pushl %eax + call ASM_PFX(GetFspInfoHdr) + movl %eax, 4(%esp) + popl %eax # # Create a Task Frame in the stack for the Boot Loader @@ -796,7 +806,7 @@ FspApiCommonL2: # Pass Control into the PEI Core # call ASM_PFX(SecStartup) - + addl $4, %esp FspApiCommonExit: ret diff --git a/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm b/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm index 51fd365c95..655481c14f 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm +++ b/IntelFspPkg/FspSecCore/Ia32/FspHelper.asm @@ -15,7 +15,7 @@ .model flat,C .code -FspInfoHeaderRelativeOff PROC NEAR PRIVATE +FspInfoHeaderRelativeOff PROC NEAR PUBLIC ; ; This value will be pached by the build script ; @@ -30,4 +30,10 @@ GetFspBaseAddress PROC NEAR PUBLIC ret GetFspBaseAddress ENDP +GetFspInfoHdr PROC NEAR PUBLIC + mov eax, GetFspBaseAddress + sub eax, dword ptr [FspInfoHeaderRelativeOff] + ret +GetFspInfoHdr ENDP + END \ No newline at end of file diff --git a/IntelFspPkg/FspSecCore/Ia32/FspHelper.s b/IntelFspPkg/FspSecCore/Ia32/FspHelper.s index 40b822ac87..5d1bf74c30 100644 --- a/IntelFspPkg/FspSecCore/Ia32/FspHelper.s +++ b/IntelFspPkg/FspSecCore/Ia32/FspHelper.s @@ -31,3 +31,8 @@ ASM_PFX(GetFspBaseAddress): mov (%eax), %eax ret +ASM_GLOBAL ASM_PFX(GetFspInfoHdr) +ASM_PFX(GetFspInfoHdr): + mov $GetFspBaseAddress, %eax + sub $FspInfoHeaderRelativeOff, %eax + ret diff --git a/IntelFspPkg/Include/FspApi.h b/IntelFspPkg/Include/FspApi.h index 8fd73fb44e..5404a84a2c 100644 --- a/IntelFspPkg/Include/FspApi.h +++ b/IntelFspPkg/Include/FspApi.h @@ -1,6 +1,6 @@ /** @file Intel FSP API definition from Intel Firmware Support Package External - Architecture Specification, April 2014, revision 001. + Architecture Specification v1.1, April 2015, revision 001. Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.
This program and the accompanying materials diff --git a/IntelFspPkg/Include/FspInfoHeader.h b/IntelFspPkg/Include/FspInfoHeader.h index f68cdfbd5a..079ec98f96 100644 --- a/IntelFspPkg/Include/FspInfoHeader.h +++ b/IntelFspPkg/Include/FspInfoHeader.h @@ -1,6 +1,6 @@ /** @file Intel FSP Info Header definition from Intel Firmware Support Package External - Architecture Specification, April 2014, revision 001. + Architecture Specification v1.1, April 2015, revision 001. Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.
This program and the accompanying materials diff --git a/IntelFspPkg/Include/Guid/FspHeaderFile.h b/IntelFspPkg/Include/Guid/FspHeaderFile.h index 9902395935..b2d527fff0 100644 --- a/IntelFspPkg/Include/Guid/FspHeaderFile.h +++ b/IntelFspPkg/Include/Guid/FspHeaderFile.h @@ -1,8 +1,8 @@ /** @file Intel FSP Header File Guid definition from Intel Firmware Support Package External - Architecture Specification, April 2014, revision 001. + Architecture Specification v1.1, April 2015, revision 001. - Copyright (c) 2014, Intel Corporation. All rights reserved.
+ Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at diff --git a/IntelFspPkg/Include/Guid/GuidHobFspEas.h b/IntelFspPkg/Include/Guid/GuidHobFspEas.h index 4e723af2f4..5821ba39e0 100644 --- a/IntelFspPkg/Include/Guid/GuidHobFspEas.h +++ b/IntelFspPkg/Include/Guid/GuidHobFspEas.h @@ -1,6 +1,6 @@ /** @file Intel FSP Hob Guid definition from Intel Firmware Support Package External - Architecture Specification, April 2014, revision 001. + Architecture Specification v1.1, April 2015, revision 001. Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.
This program and the accompanying materials diff --git a/IntelFspPkg/Include/Library/FspCommonLib.h b/IntelFspPkg/Include/Library/FspCommonLib.h index 22db27708d..eddebba1ea 100644 --- a/IntelFspPkg/Include/Library/FspCommonLib.h +++ b/IntelFspPkg/Include/Library/FspCommonLib.h @@ -181,6 +181,17 @@ GetFspInfoHeader ( VOID ); +/** + This function gets the FSP info header pointer from the API context. + + @retval FspInfoHeader FSP info header pointer +**/ +FSP_INFO_HEADER * +EFIAPI +GetFspInfoHeaderFromApiContext ( + VOID + ); + /** This function gets the VPD data pointer. diff --git a/IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c b/IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c index f80dff1a56..7de84a0a7e 100644 --- a/IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c +++ b/IntelFspPkg/Library/BaseFspCommonLib/FspCommonLib.c @@ -27,7 +27,7 @@ // API Parameter +0x34 // API return address +0x30 // -// push offset exit +0x2C +// push FspInfoHeader +0x2C // pushfd +0x28 // cli // pushad +0x24 @@ -47,7 +47,7 @@ typedef struct { UINT32 Ecx; UINT32 Eax; UINT16 Flags[2]; - UINT32 ExitOff; + UINT32 FspInfoHeader; UINT32 ApiRet; UINT32 ApiParam; } CONTEXT_STACK; @@ -331,6 +331,23 @@ GetFspInfoHeader ( return GetFspGlobalDataPointer()->FspInfoHeader; } +/** + This function gets the FSP info header pointer using the API stack context. + + @retval FspInfoHeader FSP info header pointer using the API stack context +**/ +FSP_INFO_HEADER * +EFIAPI +GetFspInfoHeaderFromApiContext ( + VOID + ) +{ + FSP_GLOBAL_DATA *FspData; + + FspData = GetFspGlobalDataPointer (); + return (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader))); +} + /** This function gets the VPD data pointer. diff --git a/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm b/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm index d04f229a6b..1efab52059 100644 --- a/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm +++ b/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm @@ -1,6 +1,6 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2014, Intel Corporation. All rights reserved.
+; Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.
; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at @@ -28,7 +28,8 @@ ;------------------------------------------------------------------------------ EXTERNDEF C MeasurePoint:PROC Pei2LoaderSwitchStack PROC C PUBLIC - jmp Loader2PeiSwitchStack + xor eax, eax + jmp FspSwitchStack Pei2LoaderSwitchStack ENDP ;------------------------------------------------------------------------------ @@ -38,10 +39,21 @@ Pei2LoaderSwitchStack ENDP ; VOID ; ) ;------------------------------------------------------------------------------ -EXTERNDEF C SwapStack:PROC Loader2PeiSwitchStack PROC C PUBLIC + jmp FspSwitchStack +Loader2PeiSwitchStack ENDP + +;------------------------------------------------------------------------------ +; UINT32 +; EFIAPI +; FspSwitchStack ( +; VOID +; ) +;------------------------------------------------------------------------------ +EXTERNDEF C SwapStack:PROC +FspSwitchStack PROC C PUBLIC ; Save current contexts - push offset exit + push eax pushfd cli pushad @@ -58,8 +70,8 @@ Loader2PeiSwitchStack PROC C PUBLIC add esp, 8 popad popfd -exit: + add esp, 4 ret -Loader2PeiSwitchStack ENDP +FspSwitchStack ENDP END diff --git a/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s b/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s index 4773fe94c2..a21a5b6c61 100644 --- a/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s +++ b/IntelFspPkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s @@ -25,20 +25,33 @@ #------------------------------------------------------------------------------ ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack) ASM_PFX(Pei2LoaderSwitchStack): - jmp ASM_PFX(Loader2PeiSwitchStack) + xorl %eax, %eax + jmp ASM_PFX(FspSwitchStack) #------------------------------------------------------------------------------ # UINT32 # EFIAPI # Loader2PeiSwitchStack ( +# VOID # ) #------------------------------------------------------------------------------ ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack) ASM_PFX(Loader2PeiSwitchStack): + jmp ASM_PFX(FspSwitchStack) + +#------------------------------------------------------------------------------ +# UINT32 +# EFIAPI +# FspSwitchStack ( +# VOID +# ) +#------------------------------------------------------------------------------ +ASM_GLOBAL ASM_PFX(FspSwitchStack) +ASM_PFX(FspSwitchStack): # #Save current contexts # - push $exit + push %eax pushf cli pusha @@ -59,7 +72,7 @@ ASM_PFX(Loader2PeiSwitchStack): add $0x08,%esp popa popf -exit: + add $0x04,%esp ret