123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- /*++
- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
- Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- --*/
- #include "Host.h"
- /**
- Transfers control to a function starting with a new stack.
- Transfers control to the function specified by EntryPoint using the new stack
- specified by NewStack and passing in the parameters specified by Context1 and
- Context2. Context1 and Context2 are optional and may be NULL. The function
- EntryPoint must never return.
- If EntryPoint is NULL, then ASSERT().
- If NewStack is NULL, then ASSERT().
- @param EntryPoint A pointer to function to call with the new stack.
- @param Context1 A pointer to the context to pass into the EntryPoint
- function.
- @param Context2 A pointer to the context to pass into the EntryPoint
- function.
- @param NewStack A pointer to the new stack to use for the EntryPoint
- function.
- **/
- VOID
- EFIAPI
- PeiSwitchStacks (
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,
- IN VOID *Context1 OPTIONAL,
- IN VOID *Context2 OPTIONAL,
- IN VOID *NewStack
- )
- {
- BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
- ASSERT (EntryPoint != NULL);
- ASSERT (NewStack != NULL);
- //
- // Stack should be aligned with CPU_STACK_ALIGNMENT
- //
- ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
- JumpBuffer.Eip = (UINTN)EntryPoint;
- JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID *);
- JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
- ((VOID **)JumpBuffer.Esp)[1] = Context1;
- ((VOID **)JumpBuffer.Esp)[2] = Context2;
- LongJump (&JumpBuffer, (UINTN)-1);
- //
- // PeiSwitchStacks () will never return
- //
- ASSERT (FALSE);
- }
|