• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
4# This program and the accompanying materials
5# are licensed and made available under the terms and conditions of the BSD License
6# which accompanies this distribution.  The full text of the license may be found at
7# http://opensource.org/licenses/bsd-license.php.
8#
9# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11#
12# Module Name:
13#
14#   SwitchStack.S
15#
16# Abstract:
17#
18#------------------------------------------------------------------------------
19
20
21#------------------------------------------------------------------------------
22# Routine Description:
23#
24#   Routine for switching stacks with 2 parameters
25#
26# Arguments:
27#
28#   (rcx) EntryPoint    - Entry point with new stack.
29#   (rdx) Context1      - Parameter1 for entry point.
30#   (r8)  Context2      - Parameter2 for entry point.
31#   (r9)  NewStack      - The pointer to new stack.
32#
33# Returns:
34#
35#   None
36#
37#------------------------------------------------------------------------------
38ASM_GLOBAL ASM_PFX(InternalSwitchStack)
39ASM_PFX(InternalSwitchStack):
40	  pushq   %rbp
41  	movq    %rsp, %rbp
42
43    mov     %rcx, %rax  // Shift registers for new call
44    mov     %rdx, %rcx
45    mov     %r8, %rdx
46    #
47    # Reserve space for register parameters (rcx, rdx, r8 & r9) on the stack,
48    # in case the callee wishes to spill them.
49    #
50    lea     -0x20(%r9), %rsp
51    pushq   $0        // stop gdb stack unwind
52    jmp     *%rax     // call EntryPoint ()
53