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