From 3b17b2458726bf7e2cf640d29ebe14f8af587905 Mon Sep 17 00:00:00 2001 From: "Ma, Maurice" Date: Wed, 29 Apr 2015 03:10:24 +0000 Subject: 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 --- IntelFspPkg/FspSecCore/Ia32/FspApiEntry.asm | 24 +++++++++++++++++------- IntelFspPkg/FspSecCore/Ia32/FspApiEntry.s | 24 +++++++++++++++++------- IntelFspPkg/FspSecCore/Ia32/FspHelper.asm | 8 +++++++- IntelFspPkg/FspSecCore/Ia32/FspHelper.s | 5 +++++ 4 files changed, 46 insertions(+), 15 deletions(-) (limited to 'IntelFspPkg/FspSecCore') 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 -- cgit v1.2.3