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
;
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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.<BR>
This program and the accompanying materials

View File

@ -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.<BR>
This program and the accompanying materials

View File

@ -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.<BR>
Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
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

View File

@ -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.<BR>
This program and the accompanying materials

View File

@ -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.

View File

@ -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.

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
; 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

View File

@ -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