Home | History | Annotate | Download | only in X64
      1 #------------------------------------------------------------------------------
      2 #
      3 # Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
      4 # Portitions copyright (c) 2011, Apple Inc. All rights reserved.
      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 #------------------------------------------------------------------------------
     14 
     15 
     16 #------------------------------------------------------------------------------
     17 # Routine Description:
     18 #
     19 #   Routine for switching stacks with 2 parameters EFI ABI
     20 #   Convert UNIX to EFI ABI
     21 #
     22 # Arguments:
     23 #
     24 #   (rdi) EntryPoint    - Entry point with new stack.
     25 #   (rsi) Context1      - Parameter1 for entry point. (rcx)
     26 #   (rdx) Context2      - Parameter2 for entry point. (rdx)
     27 #   (rcx) NewStack      - The pointer to new stack.
     28 #
     29 # Returns:
     30 #
     31 #   None
     32 #
     33 #------------------------------------------------------------------------------
     34 ASM_GLOBAL ASM_PFX(PeiSwitchStacks)
     35 ASM_PFX(PeiSwitchStacks):
     36     pushq   $0            // tells gdb to stop unwinding frame
     37     movq    %rsp, %rbp
     38 
     39     movq    %rcx, %rsp    // update stack pointer
     40 
     41     movq    %rdi, %rax    // entry point to %rax
     42     movq    %rsi, %rcx    // Adjust Context1
     43                           // Context2 already in the rigth spot
     44 
     45     #
     46     # Reserve space for register parameters (rcx, rdx, r8 & r9) on the stack,
     47     # in case the callee wishes to spill them.
     48     #
     49     subq    $32, %rsp  // 32-byte shadow space plus alignment pad
     50     call    *%rax
     51 
     52 
     53 
     54