1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2006 - 2008, 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.S
16#
17# Abstract:
18#
19#   Implementation of a stack switch on IA-32.
20#
21#------------------------------------------------------------------------------
22
23ASM_GLOBAL ASM_PFX(InternalSwitchStack)
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#------------------------------------------------------------------------------
35ASM_PFX(InternalSwitchStack):
36  pushl %ebp
37	movl	%esp, %ebp
38
39	movl	20(%ebp), %esp      # switch stack
40	subl	$8, %esp
41
42	movl	16(%ebp), %eax
43	movl	%eax, 4(%esp)
44	movl	12(%ebp), %eax
45	movl	%eax, (%esp)
46	pushl $0                  # keeps gdb from unwinding stack
47	jmp   *8(%ebp)            # call and never return
48
49