1;------------------------------------------------------------------------------
2;
3; Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
4; Portions copyright (c) 2011, Apple Inc. All rights reserved.<BR>
5; This program and the accompanying materials
6; are licensed and made available under the terms and conditions of the BSD License
7; which accompanies this distribution.  The full text of the license may be found at
8; http://opensource.org/licenses/bsd-license.php.
9;
10; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12;
13; Module Name:
14;
15;   InternalSwitchStack.nasm
16;
17; Abstract:
18;
19;   Implementation of a stack switch on IA-32.
20;
21;------------------------------------------------------------------------------
22
23    SECTION .text
24
25;------------------------------------------------------------------------------
26; VOID
27; EFIAPI
28; InternalSwitchStack (
29;   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
30;   IN      VOID                      *Context1,   OPTIONAL
31;   IN      VOID                      *Context2,   OPTIONAL
32;   IN      VOID                      *NewStack
33;   );
34;------------------------------------------------------------------------------
35global ASM_PFX(InternalSwitchStack)
36ASM_PFX(InternalSwitchStack):
37  push  ebp
38  mov   ebp, esp
39
40  mov   esp, [ebp + 20]    ; switch stack
41  sub   esp, 8
42  mov   eax, [ebp + 16]
43  mov   [esp + 4], eax
44  mov   eax, [ebp + 12]
45  mov   [esp], eax
46  push  0                  ; keeps gdb from unwinding stack
47  jmp   dword [ebp + 8]    ; call and never return
48