Home | History | Annotate | Download | only in X64
      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 #------------------------------------------------------------------------------
     38 ASM_GLOBAL ASM_PFX(InternalSwitchStack)
     39 ASM_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