Hi Ted, Please see my comments inline below.
Thanks, Chasel > -----Original Message----- > From: Kuo, Ted <ted....@intel.com> > Sent: Monday, April 4, 2022 2:23 PM > To: devel@edk2.groups.io > Cc: Chiu, Chasel <chasel.c...@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desim...@intel.com>; Zeng, Star <star.z...@intel.com>; S, > Ashraf Ali <ashraf.al...@intel.com> > Subject: [edk2-devel][PATCH v2 2/8] IntelFsp2Pkg: Add FSPx_ARCH2_UPD > support for X64 > > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3893 > 1.Added FSPx_ARCH2_UPD structures which support both IA32 and X64. > 2.Added FSPx_UPD_COMMON_FSP24 structures. > > Cc: Chasel Chiu <chasel.c...@intel.com> > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > Cc: Star Zeng <star.z...@intel.com> > Cc: Ashraf Ali S <ashraf.al...@intel.com> > Signed-off-by: Ted Kuo <ted....@intel.com> > --- > IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm | 29 +++++ > IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm | 93 +++++++++++-- > IntelFsp2Pkg/Include/FspEas/FspApi.h | 172 > ++++++++++++++++++++++++- > IntelFsp2Pkg/Tools/GenCfgOpt.py | 2 +- > 4 files changed, 278 insertions(+), 18 deletions(-) > > diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm > b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm > index e7261b41cd..de7f916070 100644 > --- a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm > +++ b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm > @@ -32,6 +32,25 @@ struc FSPM_UPD_COMMON > .size: > endstruc > > +struc FSPM_UPD_COMMON_FSP24 > + ; FSP_UPD_HEADER { > + .FspUpdHeader: resd 8 > + ; } > + ; FSPM_ARCH2_UPD { > + .Revision: resb 1 > + .Reserved: resb 3 > + .Length resd 1 > + .StackBase: resq 1 > + .StackSize: resq 1 > + .BootLoaderTolumSize: resd 1 > + .BootMode: resd 1 > + .FspEventHandler resq 1 > + .EnableMultiPhaseMemoryInit resb 1 > + .Reserved1: resb 23 Please remove EnableMultiPhaseMemoryInit as it is not used. Also the Reserved1 will be 24 bytes instead of 23 > + ; } > + .size: > +endstruc > + > ; > ; Following functions will be provided in C ; @@ -124,12 +143,22 @@ > ASM_PFX(FspApiCommonContinue): > pop eax > > FspStackSetup: > + mov ecx, [edx + FSPM_UPD_COMMON.Revision] > + cmp ecx, 3 > + jae FspmUpdCommon2 > + > ; > ; StackBase = temp memory base, StackSize = temp memory size > ; > mov edi, [edx + FSPM_UPD_COMMON.StackBase] > mov ecx, [edx + FSPM_UPD_COMMON.StackSize] > + jmp ChkFspHeapSize > + > +FspmUpdCommon2: > + mov edi, [edx + FSPM_UPD_COMMON_FSP24.StackBase] > + mov ecx, [edx + FSPM_UPD_COMMON_FSP24.StackSize] > > +ChkFspHeapSize: > ; > ; Keep using bootloader stack if heap size % is 0 > ; > diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm > b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm > index 7fd3d6d843..25ef99b798 100644 > --- a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm > +++ b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm > @@ -84,8 +84,10 @@ struc LoadMicrocodeParamsFsp22 > .FspUpdHeaderRevision: resb 1 > .FspUpdHeaderReserved: resb 23 > ; } > - ; FSPT_ARCH_UPD{ > - .FsptArchUpd: resd 8 > + ; FSPT_ARCH_UPD { > + .FsptArchRevision: resb 1 > + .FsptArchReserved: resb 3 > + .FsptArchUpd: resd 7 > ; } > ; FSPT_CORE_UPD { > .MicrocodeCodeAddr: resd 1 > @@ -96,6 +98,25 @@ struc LoadMicrocodeParamsFsp22 > .size: > endstruc > > +struc LoadMicrocodeParamsFsp24 > + ; FSP_UPD_HEADER { > + .FspUpdHeaderSignature: resd 2 > + .FspUpdHeaderRevision: resb 1 > + .FspUpdHeaderReserved: resb 23 > + ; } > + ; FSPT_ARCH2_UPD { > + .FsptArchRevision: resb 1 > + .FsptArchReserved: resb 3 > + .FsptArchLength: resd 1 > + .FspDebugHandler resq 1 > + .MicrocodeCodeAddr: resq 1 > + .MicrocodeCodeSize: resq 1 > + .CodeRegionBase: resq 1 > + .CodeRegionSize: resq 1 Please remove 4 elements from the ARCH2 structure: .MicrocodeCodeAddr: resq 1 .MicrocodeCodeSize: resq 1 .CodeRegionBase: resq 1 .CodeRegionSize: resq 1 Also the new CORE_UPD structure is still after ARCH2_UPD structure which having 64bits elements. > + ; } > + .size: > +endstruc > + > ; > ; Define SSE macros > ; > @@ -172,9 +193,9 @@ ASM_PFX(LoadMicrocodeDefault): > ; Executed by SBSP and NBSP > ; Beginning of microcode update region starts on paragraph boundary > > - ; > ; > ; Save return address to EBP > + ; > movd ebp, mm7 > > cmp esp, 0 > @@ -188,8 +209,12 @@ ASM_PFX(LoadMicrocodeDefault): > ; and report error if size is less than 2k > ; first check UPD header revision > cmp byte [esp + LoadMicrocodeParamsFsp22.FspUpdHeaderRevision], > 2 > - jae Fsp22UpdHeader > + jb Fsp20UpdHeader > + cmp byte [esp + LoadMicrocodeParamsFsp22.FsptArchRevision], 2 > + je Fsp24UpdHeader > + jmp Fsp22UpdHeader > > +Fsp20UpdHeader: > ; UPD structure is compliant with FSP spec 2.0/2.1 > mov eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeSize] > cmp eax, 0 > @@ -213,6 +238,19 @@ Fsp22UpdHeader: > mov esi, dword [esp + > LoadMicrocodeParamsFsp22.MicrocodeCodeAddr] > cmp esi, 0 > jnz CheckMainHeader > + jmp ParamError > + > +Fsp24UpdHeader: > + ; UPD structure is compliant with FSP spec 2.4 > + mov eax, dword [esp + > LoadMicrocodeParamsFsp24.MicrocodeCodeSize] > + cmp eax, 0 > + jz Exit2 > + cmp eax, 0800h > + jl ParamError > + > + mov esi, dword [esp + > LoadMicrocodeParamsFsp24.MicrocodeCodeAddr] > + cmp esi, 0 > + jnz CheckMainHeader > > ParamError: > mov eax, 080000002h > @@ -308,9 +346,13 @@ AdvanceFixedSize: > > CheckAddress: > ; Check UPD header revision > - cmp byte [esp + LoadMicrocodeParamsFsp22.FspUpdHeaderRevision], > 2 > - jae Fsp22UpdHeader1 > + cmp byte [esp + LoadMicrocodeParamsFsp22.FspUpdHeaderRevision], > 2 > + jb Fsp20UpdHeader1 > + cmp byte [esp + LoadMicrocodeParamsFsp22.FsptArchRevision], 2 > + je Fsp24UpdHeader1; > + jmp Fsp22UpdHeader1 > > +Fsp20UpdHeader1: > ; UPD structure is compliant with FSP spec 2.0/2.1 > ; Is automatic size detection ? > mov eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeSize] > @@ -336,6 +378,19 @@ Fsp22UpdHeader1: > jae Done ;Jif address is outside of microcode region > jmp CheckMainHeader > > +Fsp24UpdHeader1: > + ; UPD structure is compliant with FSP spec 2.4 > + ; Is automatic size detection ? > + mov eax, dword [esp + > LoadMicrocodeParamsFsp24.MicrocodeCodeSize] > + cmp eax, 0ffffffffh > + jz LoadMicrocodeDefault4 > + > + ; Address >= microcode region address + microcode region size? > + add eax, dword [esp + > LoadMicrocodeParamsFsp24.MicrocodeCodeAddr] > + cmp esi, eax > + jae Done ;Jif address is outside of microcode region > + jmp CheckMainHeader > + > LoadMicrocodeDefault4: > ; Is valid Microcode start point ? > cmp dword [esi + MicrocodeHdr.MicrocodeHdrVersion], 0ffffffffh > @@ -351,7 +406,7 @@ LoadCheck: > mov eax, 1 > cpuid > mov ecx, MSR_IA32_BIOS_SIGN_ID > - rdmsr ; Get current microcode signature > + rdmsr ; Get current microcode signature > > ; Verify this microcode update is not already loaded > cmp dword [esi + MicrocodeHdr.MicrocodeHdrRevision], edx > @@ -405,8 +460,12 @@ ASM_PFX(EstablishStackFsp): > > ; check UPD structure revision (edx + 8) > cmp byte [edx + LoadMicrocodeParamsFsp22.FspUpdHeaderRevision], > 2 > - jae Fsp22UpdHeader2 > + jb Fsp20UpdHeader2 > + cmp byte [esp + LoadMicrocodeParamsFsp22.FsptArchRevision], 2 > + je Fsp24UpdHeader2 > + jmp Fsp22UpdHeader2 > > +Fsp20UpdHeader2: > ; UPD structure is compliant with FSP spec 2.0/2.1 > push dword [edx + LoadMicrocodeParams.CodeRegionSize] ; Code > size sizeof(FSPT_UPD_COMMON) + 12 > push dword [edx + LoadMicrocodeParams.CodeRegionBase] ; Code > base sizeof(FSPT_UPD_COMMON) + 8 > @@ -420,6 +479,14 @@ Fsp22UpdHeader2: > push dword [edx + LoadMicrocodeParamsFsp22.CodeRegionBase] ; > Code base sizeof(FSPT_UPD_COMMON) + 8 > push dword [edx + LoadMicrocodeParamsFsp22.MicrocodeCodeSize] ; > Microcode size sizeof(FSPT_UPD_COMMON) + 4 > push dword [edx + LoadMicrocodeParamsFsp22.MicrocodeCodeAddr] ; > Microcode base sizeof(FSPT_UPD_COMMON) + 0 > + jmp ContinueAfterUpdPush > + > +Fsp24UpdHeader2: > + ; UPD structure is compliant with FSP spec 2.4 > + push dword [edx + LoadMicrocodeParamsFsp24.CodeRegionSize] ; > Code size sizeof(FSPT_UPD_COMMON) + 24 > + push dword [edx + LoadMicrocodeParamsFsp24.CodeRegionBase] ; > Code base sizeof(FSPT_UPD_COMMON) + 16 > + push dword [edx + LoadMicrocodeParamsFsp24.MicrocodeCodeSize] ; > Microcode size sizeof(FSPT_UPD_COMMON) + 8 > + push dword [edx + > LoadMicrocodeParamsFsp24.MicrocodeCodeAddr] ; Microcode base > sizeof(FSPT_UPD_COMMON) + 0 > > ContinueAfterUpdPush: > ; > @@ -517,13 +584,13 @@ ASM_PFX(TempRamInitApi): > cmp eax, 0 > jnz TempRamInitExit > > - LXMMN xmm6, eax, 3 ;Restore microcode status if no CAR init error > from ECX-SLOT 3 in xmm6. > + LXMMN xmm6, eax, 3 ;Restore microcode status if no CAR init error > from ECX-SLOT 3 in xmm6. > > TempRamInitExit: > - mov bl, al ; save al data in bl > - mov al, 07Fh ; API exit postcode 7f > - out 080h, al > - mov al, bl ; restore al data from bl > + mov bl, al ; save al data in bl > + mov al, 07Fh ; API exit postcode 7f > + out 080h, al > + mov al, bl ; restore al data from bl > > ; > ; Load EBP, EBX, ESI, EDI & ESP from XMM7 & XMM6 diff --git > a/IntelFsp2Pkg/Include/FspEas/FspApi.h > b/IntelFsp2Pkg/Include/FspEas/FspApi.h > index 794f94dc7a..804218f659 100644 > --- a/IntelFsp2Pkg/Include/FspEas/FspApi.h > +++ b/IntelFsp2Pkg/Include/FspEas/FspApi.h > @@ -112,12 +112,12 @@ typedef struct { > /// > typedef struct { > /// > - /// Revision Revision of the structure is 1 for this version of the > specification. > + /// Revision of the structure is 1 for this version of the specification. > /// > UINT8 Revision; > UINT8 Reserved[3]; > /// > - /// Length Length of the structure in bytes. The current value for this > field > is 32. > + /// Length of the structure in bytes. The current value for this field is > 32. > /// > UINT32 Length; > /// > @@ -128,6 +128,46 @@ typedef struct { > UINT8 Reserved1[20]; > } FSPT_ARCH_UPD; > > +/// > +/// FSPT_ARCH2_UPD Configuration. > +/// > +typedef struct { > + /// > + /// Revision of the structure is 2 for this version of the specification. > + /// > + UINT8 Revision; > + UINT8 Reserved[3]; > + /// > + /// Length of the structure in bytes. The current value for this field is > 64. > + /// > + UINT32 Length; > + /// > + /// FspDebugHandler Optional debug handler for the bootloader to > +receive debug messages > + /// occurring during FSP execution. > + /// > + EFI_PHYSICAL_ADDRESS FspDebugHandler; > + /// > + /// Specifies the base address of the first microcode update in > + /// the bootloader’s microcode region. If more than one microcode > + /// update is present in the microcode region, then these microcode > + /// updates must be packed back-to-back in the microcode region. > + /// > + EFI_PHYSICAL_ADDRESS MicrocodeRegionBase; > + /// > + /// The length of the bootloader’s microcode region in bytes. > + /// > + UINT64 MicrocodeRegionSize; > + /// > + /// Specifies the base address of the cacheable flash region. > + /// > + EFI_PHYSICAL_ADDRESS CodeRegionBase; > + /// > + /// The length of the cacheable flash region in bytes. > + /// > + UINT64 CodeRegionSize; Remove these 4 elements: EFI_PHYSICAL_ADDRESS MicrocodeRegionBase; UINT64 MicrocodeRegionSize; EFI_PHYSICAL_ADDRESS CodeRegionBase; UINT64 CodeRegionSize; > + UINT8 Reserved1[16]; > +} FSPT_ARCH2_UPD; > + > /// > /// FSPM_ARCH_UPD Configuration. > /// > @@ -169,14 +209,65 @@ typedef struct { > UINT8 Reserved1[4]; > } FSPM_ARCH_UPD; > > +/// > +/// FSPM_ARCH2_UPD Configuration. > +/// > typedef struct { > /// > - /// Revision Revision of the structure is 1 for this version of the > specification. > + /// Revision of the structure is 3 for this version of the specification. > /// > UINT8 Revision; > UINT8 Reserved[3]; > /// > - /// Length Length of the structure in bytes. The current value for this > field > is 32. > + /// Lengthe of the structure in bytes. The current value for this field is > 64. > + /// > + UINT32 Length; > + /// > + /// Pointer to the temporary stack base address to be > + /// consumed inside FspMemoryInit() API. > + /// > + EFI_PHYSICAL_ADDRESS StackBase; > + /// > + /// Temporary stack size to be consumed inside > + /// FspMemoryInit() API. > + /// > + UINT64 StackSize; > + /// > + /// Size of memory to be reserved by FSP below "top > + /// of low usable memory" for bootloader usage. > + /// > + UINT32 BootLoaderTolumSize; > + /// > + /// Current boot mode. > + /// > + UINT32 BootMode; > + /// > + /// Optional event handler for the bootloader to be informed of events > occurring during FSP execution. > + /// This value is only valid if Revision is >= 2. > + /// > + EFI_PHYSICAL_ADDRESS FspEventHandler; > + /// > + /// A FSP binary may optionally implement multi-phase memory > +initialization, > + /// This is only supported if the FspMultiPhaseMemInitEntryOffset > +field in FSP_INFO_HEADER > + /// is non-zero. > + /// To enable multi-phase memory initialization, the bootloader must > +set > + /// EnableMultiPhaseMemoryInit to a non-zero value. > + /// > + UINT8 EnableMultiPhaseMemoryInit; > + UINT8 Reserved1[23]; Please remove EnableMultiPhaseMemoryInit and change Reserved1 size to [24] > +} FSPM_ARCH2_UPD; > + > +/// > +/// FSPS_ARCH_UPD Configuration. > +/// > +typedef struct { > + /// > + /// Revision of the structure is 1 for this version of the specification. > + /// > + UINT8 Revision; > + UINT8 Reserved[3]; > + /// > + /// Length of the structure in bytes. The current value for this field is > 32. > /// > UINT32 Length; > /// > @@ -195,6 +286,35 @@ typedef struct { > UINT8 Reserved1[19]; > } FSPS_ARCH_UPD; > > +/// > +/// FSPS_ARCH2_UPD Configuration. > +/// > +typedef struct { > + /// > + /// Revision of the structure is 2 for this version of the specification. > + /// > + UINT8 Revision; > + UINT8 Reserved[3]; > + /// > + /// Length of the structure in bytes. The current value for this field is > 32. > + /// > + UINT32 Length; > + /// > + /// FspEventHandler Optional event handler for the bootloader to be > +informed of events > + /// occurring during FSP execution. > + /// > + EFI_PHYSICAL_ADDRESS FspEventHandler; > + /// > + /// A FSP binary may optionally implement multi-phase silicon > +initialization, > + /// This is only supported if the FspMultiPhaseSiInitEntryOffset > +field in FSP_INFO_HEADER > + /// is non-zero. > + /// To enable multi-phase silicon initialization, the bootloader must > +set > + /// EnableMultiPhaseSiliconInit to a non-zero value. > + /// > + UINT8 EnableMultiPhaseSiliconInit; > + UINT8 Reserved1[15]; > +} FSPS_ARCH2_UPD; > + > /// > /// FSPT_UPD_COMMON Configuration. > /// > @@ -220,6 +340,21 @@ typedef struct { > FSPT_ARCH_UPD FsptArchUpd; > } FSPT_UPD_COMMON_FSP22; > > +/// > +/// FSPT_UPD_COMMON Configuration for FSP spec. 2.4 and above. > +/// > +typedef struct { > + /// > + /// FSP_UPD_HEADER Configuration. > + /// > + FSP_UPD_HEADER FspUpdHeader; > + > + /// > + /// FSPT_ARCH2_UPD Configuration. > + /// > + FSPT_ARCH2_UPD FsptArchUpd; > +} FSPT_UPD_COMMON_FSP24; > + > /// > /// FSPM_UPD_COMMON Configuration. > /// > @@ -234,6 +369,20 @@ typedef struct { > FSPM_ARCH_UPD FspmArchUpd; > } FSPM_UPD_COMMON; > > +/// > +/// FSPM_UPD_COMMON Configuration for FSP spec. 2.4 and above. > +/// > +typedef struct { > + /// > + /// FSP_UPD_HEADER Configuration. > + /// > + FSP_UPD_HEADER FspUpdHeader; > + /// > + /// FSPM_ARCH2_UPD Configuration. > + /// > + FSPM_ARCH2_UPD FspmArchUpd; > +} FSPM_UPD_COMMON_FSP24; > + > /// > /// FSPS_UPD_COMMON Configuration. > /// > @@ -259,6 +408,21 @@ typedef struct { > FSPS_ARCH_UPD FspsArchUpd; > } FSPS_UPD_COMMON_FSP22; > > +/// > +/// FSPS_UPD_COMMON Configuration for FSP spec. 2.4 and above. > +/// > +typedef struct { > + /// > + /// FSP_UPD_HEADER Configuration. > + /// > + FSP_UPD_HEADER FspUpdHeader; > + > + /// > + /// FSPS_ARCH2_UPD Configuration. > + /// > + FSPS_ARCH2_UPD FspsArchUpd; > +} FSPS_UPD_COMMON_FSP24; > + > /// > /// Enumeration of FSP_INIT_PHASE for NOTIFY_PHASE. > /// > diff --git a/IntelFsp2Pkg/Tools/GenCfgOpt.py > b/IntelFsp2Pkg/Tools/GenCfgOpt.py index 714b2d8b1a..733705fe24 > 100644 > --- a/IntelFsp2Pkg/Tools/GenCfgOpt.py > +++ b/IntelFsp2Pkg/Tools/GenCfgOpt.py > @@ -1397,7 +1397,7 @@ EndList > UpdRegionCheck = ['FSPT', 'FSPM', 'FSPS'] # FSPX_UPD_REGION > UpdConfigCheck = ['FSP_T', 'FSP_M', 'FSP_S'] # FSP_X_CONFIG, > FSP_X_TEST_CONFIG, FSP_X_RESTRICTED_CONFIG > UpdSignatureCheck = ['FSPT_UPD_SIGNATURE', > 'FSPM_UPD_SIGNATURE', 'FSPS_UPD_SIGNATURE'] > - ExcludedSpecificUpd = ['FSPT_ARCH_UPD', 'FSPM_ARCH_UPD', > 'FSPS_ARCH_UPD'] > + ExcludedSpecificUpd = ['FSPT_ARCH', 'FSPM_ARCH', 'FSPS_ARCH'] > > IncLines = [] > if InputHeaderFile != '': > -- > 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#88457): https://edk2.groups.io/g/devel/message/88457 Mute This Topic: https://groups.io/mt/90235995/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-