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