IntelFsp2Pkg: BaseFspSwitchStackLib Support for X64

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3832
Add BaseFspSwitchStackLib Support for X64.

Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
Signed-off-by: Ted Kuo <ted.kuo@intel.com>
Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
This commit is contained in:
Kuo, Ted
2022-03-14 10:48:00 +08:00
committed by mergify[bot]
parent 0531f61376
commit 411b3ff6dd
4 changed files with 147 additions and 5 deletions

View File

@ -15,12 +15,15 @@
VERSION_STRING = 1.0
LIBRARY_CLASS = FspSwitchStackLib
[Sources.IA32]
[Sources]
FspSwitchStackLib.c
[Sources.IA32]
Ia32/Stack.nasm
[Sources.X64]
X64/Stack.nasm
[Packages]
MdePkg/MdePkg.dec
IntelFsp2Pkg/IntelFsp2Pkg.dec

View File

@ -20,16 +20,16 @@
**/
UINT32
UINTN
SwapStack (
IN UINT32 NewStack
IN UINTN NewStack
)
{
FSP_GLOBAL_DATA *FspData;
UINT32 OldStack;
UINTN OldStack;
FspData = GetFspGlobalDataPointer ();
OldStack = FspData->CoreStack;
FspData->CoreStack = NewStack;
FspData->CoreStack = (UINTN) NewStack;
return OldStack;
}

View File

@ -0,0 +1,72 @@
;------------------------------------------------------------------------------
;
; Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
; Abstract:
;
; Switch the stack from temporary memory to permanent memory.
;
;------------------------------------------------------------------------------
SECTION .text
%include "PushPopRegsNasm.inc"
extern ASM_PFX(SwapStack)
;------------------------------------------------------------------------------
; UINT32
; EFIAPI
; Pei2LoaderSwitchStack (
; VOID
; )
;------------------------------------------------------------------------------
global ASM_PFX(Pei2LoaderSwitchStack)
ASM_PFX(Pei2LoaderSwitchStack):
xor rax, rax
jmp ASM_PFX(FspSwitchStack)
;------------------------------------------------------------------------------
; UINT32
; EFIAPI
; Loader2PeiSwitchStack (
; VOID
; )
;------------------------------------------------------------------------------
global ASM_PFX(Loader2PeiSwitchStack)
ASM_PFX(Loader2PeiSwitchStack):
jmp ASM_PFX(FspSwitchStack)
;------------------------------------------------------------------------------
; UINT32
; EFIAPI
; FspSwitchStack (
; VOID
; )
;------------------------------------------------------------------------------
global ASM_PFX(FspSwitchStack)
ASM_PFX(FspSwitchStack):
; Save current contexts
push rdx ; ApiParam2
push rcx ; ApiParam1
push rax ; FspInfoHeader
pushfq
cli
PUSHA_64
sub rsp, 16
sidt [rsp]
; Load new stack
mov rcx, rsp
call ASM_PFX(SwapStack)
mov rsp, rax
; Restore previous contexts
lidt [rsp]
add rsp, 16
POPA_64
popfq
add rsp, 24 ; FspInfoHeader + ApiParam[2]
ret