mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-25 14:44:28 +02:00
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:
parent
2bf87d82e9
commit
3b17b24587
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user