/** @file | |
GCC inline implementation of BaseLib processor specific functions. | |
Copyright (c) 2006 - 2010, Intel Corporation<BR> | |
Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR> | |
All rights reserved. This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include "BaseLibInternals.h" | |
/** | |
Requests CPU to pause for a short period of time. | |
Requests CPU to pause for a short period of time. Typically used in MP | |
systems to prevent memory starvation while waiting for a spin lock. | |
**/ | |
VOID | |
EFIAPI | |
CpuPause ( | |
VOID | |
) | |
{ | |
__asm__ __volatile__ ( | |
"nop\n\t" | |
"nop\n\t" | |
"nop\n\t" | |
"nop\n\t" | |
"nop\n\t" | |
); | |
} | |
/** | |
Transfers control to a function starting with a new stack. | |
This internal worker function transfers control to the function | |
specified by EntryPoint using the new stack specified by NewStack | |
and passing in the parameters specified by Context1 and Context2. | |
Context1 and Context2 are optional and may be NULL. | |
The function EntryPoint must never return. | |
@param EntryPoint The pointer to the function to enter. | |
@param Context1 The first parameter to pass in. | |
@param Context2 The second Parameter to pass in | |
@param NewStack The new Location of the stack | |
**/ | |
VOID | |
EFIAPI | |
InternalSwitchStackAsm ( | |
SWITCH_STACK_ENTRY_POINT EntryPoint, | |
VOID *Context1, | |
VOID *Context2, | |
VOID *NewStack | |
) | |
{ | |
__asm__ __volatile__ ( | |
"mov lr, %0\n\t" | |
"mov sp, %3\n\t" | |
"mov %r0, %1\n\t" | |
"mov %r1, %2\n\t" | |
"bx lr\n\t" | |
: /* no output operand */ | |
: "r" (EntryPoint), | |
"r" (Context1), | |
"r" (Context2), | |
"r" (NewStack) | |
); | |
} |