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" <maurice.ma@intel.com>
Reviewed-by: "Yao, Jiewen" <Jiewen.Yao@intel.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17248 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Ma, Maurice 2015-04-29 03:10:24 +00:00 committed by jyao1
parent 2bf87d82e9
commit 3b17b24587
12 changed files with 115 additions and 31 deletions

View File

@ -38,8 +38,9 @@ EXTERN FspApiCallingCheck:PROC
; Following functions will be provided in PlatformSecLib ; Following functions will be provided in PlatformSecLib
; ;
EXTERN GetFspBaseAddress:PROC EXTERN GetFspBaseAddress:PROC
EXTERN GetFspInfoHdr:PROC
EXTERN GetBootFirmwareVolumeOffset:PROC EXTERN GetBootFirmwareVolumeOffset:PROC
EXTERN Pei2LoaderSwitchStack:PROC EXTERN Loader2PeiSwitchStack:PROC
EXTERN LoadMicrocode(LoadMicrocodeDefault):PROC EXTERN LoadMicrocode(LoadMicrocodeDefault):PROC
EXTERN SecPlatformInit(SecPlatformInitDefault):PROC EXTERN SecPlatformInit(SecPlatformInitDefault):PROC
EXTERN SecCarInit:PROC EXTERN SecCarInit:PROC
@ -370,8 +371,7 @@ TempRamInitApi PROC NEAR PUBLIC
jz NemInitExit jz NemInitExit
; ;
; CPUID/DeviceID check ; Sec Platform Init
; and Sec Platform Init
; ;
CALL_MMX SecPlatformInit CALL_MMX SecPlatformInit
cmp eax, 0 cmp eax, 0
@ -505,7 +505,9 @@ FspApiCommon PROC C PUBLIC
jz @F jz @F
cmp eax, 3 ; FspMemoryInit API cmp eax, 3 ; FspMemoryInit API
jz @F 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 ; 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 ; Pass Control into the PEI Core
; ;
call SecStartup call SecStartup
add esp, 4
exit: exit:
ret ret

View File

@ -215,8 +215,10 @@ ASM_GLOBAL ASM_PFX(FspApiCallingCheck)
# #
# Following functions will be provided in PlatformSecLib # 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(GetBootFirmwareVolumeOffset)
ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack) ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack)
# #
@ -561,8 +563,7 @@ ASM_PFX(TempRamInitApi):
jz NemInitExit jz NemInitExit
# #
# CPUID/DeviceID check # Sec Platform Init
# and Sec Platform Init
# #
movl $TempRamInitApiL1, %esi #CALL_MMX SecPlatformInit movl $TempRamInitApiL1, %esi #CALL_MMX SecPlatformInit
movd %esi, %mm7 movd %esi, %mm7
@ -717,7 +718,8 @@ FspApiCommonL1:
jz FspApiCommonL2 jz FspApiCommonL2
cmpl $0x03, %eax # FspMemoryInit API cmpl $0x03, %eax # FspMemoryInit API
jz FspApiCommonL2 jz FspApiCommonL2
jmp Pei2LoaderSwitchStack call ASM_PFX(GetFspInfoHdr)
jmp Loader2PeiSwitchStack
FspApiCommonL2: 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 # Create a Task Frame in the stack for the Boot Loader
@ -796,7 +806,7 @@ FspApiCommonL2:
# Pass Control into the PEI Core # Pass Control into the PEI Core
# #
call ASM_PFX(SecStartup) call ASM_PFX(SecStartup)
addl $4, %esp
FspApiCommonExit: FspApiCommonExit:
ret ret

View File

@ -15,7 +15,7 @@
.model flat,C .model flat,C
.code .code
FspInfoHeaderRelativeOff PROC NEAR PRIVATE FspInfoHeaderRelativeOff PROC NEAR PUBLIC
; ;
; This value will be pached by the build script ; This value will be pached by the build script
; ;
@ -30,4 +30,10 @@ GetFspBaseAddress PROC NEAR PUBLIC
ret ret
GetFspBaseAddress ENDP GetFspBaseAddress ENDP
GetFspInfoHdr PROC NEAR PUBLIC
mov eax, GetFspBaseAddress
sub eax, dword ptr [FspInfoHeaderRelativeOff]
ret
GetFspInfoHdr ENDP
END END

View File

@ -31,3 +31,8 @@ ASM_PFX(GetFspBaseAddress):
mov (%eax), %eax mov (%eax), %eax
ret ret
ASM_GLOBAL ASM_PFX(GetFspInfoHdr)
ASM_PFX(GetFspInfoHdr):
mov $GetFspBaseAddress, %eax
sub $FspInfoHeaderRelativeOff, %eax
ret

View File

@ -1,6 +1,6 @@
/** @file /** @file
Intel FSP API definition from Intel Firmware Support Package External 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.<BR> Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials

View File

@ -1,6 +1,6 @@
/** @file /** @file
Intel FSP Info Header definition from Intel Firmware Support Package External 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.<BR> Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials

View File

@ -1,8 +1,8 @@
/** @file /** @file
Intel FSP Header File Guid definition from Intel Firmware Support Package External 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.<BR> Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at

View File

@ -1,6 +1,6 @@
/** @file /** @file
Intel FSP Hob Guid definition from Intel Firmware Support Package External 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.<BR> Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials

View File

@ -181,6 +181,17 @@ GetFspInfoHeader (
VOID 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. This function gets the VPD data pointer.

View File

@ -27,7 +27,7 @@
// API Parameter +0x34 // API Parameter +0x34
// API return address +0x30 // API return address +0x30
// //
// push offset exit +0x2C // push FspInfoHeader +0x2C
// pushfd +0x28 // pushfd +0x28
// cli // cli
// pushad +0x24 // pushad +0x24
@ -47,7 +47,7 @@ typedef struct {
UINT32 Ecx; UINT32 Ecx;
UINT32 Eax; UINT32 Eax;
UINT16 Flags[2]; UINT16 Flags[2];
UINT32 ExitOff; UINT32 FspInfoHeader;
UINT32 ApiRet; UINT32 ApiRet;
UINT32 ApiParam; UINT32 ApiParam;
} CONTEXT_STACK; } CONTEXT_STACK;
@ -331,6 +331,23 @@ GetFspInfoHeader (
return GetFspGlobalDataPointer()->FspInfoHeader; 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. This function gets the VPD data pointer.

View File

@ -1,6 +1,6 @@
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; ;
; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> ; Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
; This program and the accompanying materials ; This program and the accompanying materials
; are licensed and made available under the terms and conditions of the BSD License ; 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 ; which accompanies this distribution. The full text of the license may be found at
@ -28,7 +28,8 @@
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
EXTERNDEF C MeasurePoint:PROC EXTERNDEF C MeasurePoint:PROC
Pei2LoaderSwitchStack PROC C PUBLIC Pei2LoaderSwitchStack PROC C PUBLIC
jmp Loader2PeiSwitchStack xor eax, eax
jmp FspSwitchStack
Pei2LoaderSwitchStack ENDP Pei2LoaderSwitchStack ENDP
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@ -38,10 +39,21 @@ Pei2LoaderSwitchStack ENDP
; VOID ; VOID
; ) ; )
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
EXTERNDEF C SwapStack:PROC
Loader2PeiSwitchStack PROC C PUBLIC Loader2PeiSwitchStack PROC C PUBLIC
jmp FspSwitchStack
Loader2PeiSwitchStack ENDP
;------------------------------------------------------------------------------
; UINT32
; EFIAPI
; FspSwitchStack (
; VOID
; )
;------------------------------------------------------------------------------
EXTERNDEF C SwapStack:PROC
FspSwitchStack PROC C PUBLIC
; Save current contexts ; Save current contexts
push offset exit push eax
pushfd pushfd
cli cli
pushad pushad
@ -58,8 +70,8 @@ Loader2PeiSwitchStack PROC C PUBLIC
add esp, 8 add esp, 8
popad popad
popfd popfd
exit: add esp, 4
ret ret
Loader2PeiSwitchStack ENDP FspSwitchStack ENDP
END END

View File

@ -25,20 +25,33 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack) ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack)
ASM_PFX(Pei2LoaderSwitchStack): ASM_PFX(Pei2LoaderSwitchStack):
jmp ASM_PFX(Loader2PeiSwitchStack) xorl %eax, %eax
jmp ASM_PFX(FspSwitchStack)
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# UINT32 # UINT32
# EFIAPI # EFIAPI
# Loader2PeiSwitchStack ( # Loader2PeiSwitchStack (
# VOID
# ) # )
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack) ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack)
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 #Save current contexts
# #
push $exit push %eax
pushf pushf
cli cli
pusha pusha
@ -59,7 +72,7 @@ ASM_PFX(Loader2PeiSwitchStack):
add $0x08,%esp add $0x08,%esp
popa popa
popf popf
exit: add $0x04,%esp
ret ret