/** @file

  Copyright (c) 2014 - 2020, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _FSP_SWITCH_STACK_LIB_H_
#define _FSP_SWITCH_STACK_LIB_H_

/**

  This function will switch the current stack to the previous saved stack.
  Before calling the previous stack has to be set in  FSP_GLOBAL_DATA.CoreStack.
                    EIP
                    FLAGS  16 bit  FLAGS  16 bit
                    EDI
                    ESI
                    EBP
                    ESP
                    EBX
                    EDX
                    ECX
                    EAX
                    DWORD     IDT base1
  StackPointer:     DWORD     IDT base2

  @return ReturnKey          After switching to the saved stack,
                             this value will be saved in eax before returning.


**/
UINT32
EFIAPI
Pei2LoaderSwitchStack (
  VOID
  );

/**

  This function is equivalent to Pei2LoaderSwitchStack () but just indicates
  the stack after switched is FSP stack.

  @return ReturnKey          After switching to the saved stack,
                             this value will be saved in eax before returning.


**/
UINT32
EFIAPI
Loader2PeiSwitchStack (
  VOID
  );

#endif
