The registers used to passed arguments to the DxeCore entrypoint in the inline
assembly function InternalSwitchStackAsm() where switched at compilation time.
This change replaces the inline assembly by a pure assembly source file to
avoid this kind of optimization.
Note: Inline assembly is generally not recommanded in system programming.
Reviewed-by: lgao4
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12674
6f19259b-4bc3-4df7-8a09-
765794883524
+++ /dev/null
-/** @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
--- /dev/null
+//------------------------------------------------------------------------------ \r
+//\r
+// Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>\r
+// Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
+// Portions copyright (c) 2011, ARM Limited. All rights reserved.\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
+.text\r
+.align 5\r
+\r
+GCC_ASM_EXPORT(InternalSwitchStackAsm)\r
+GCC_ASM_EXPORT(CpuPause) \r
+ \r
+/**\r
+//\r
+// This allows the caller to switch the stack and goes to the new entry point\r
+//\r
+// @param EntryPoint The pointer to the location to enter\r
+// @param Context Parameter to pass in\r
+// @param Context2 Parameter2 to pass in\r
+// @param NewStack New Location of the stack\r
+//\r
+// @return Nothing. Goes to the Entry Point passing in the new parameters\r
+//\r
+VOID\r
+EFIAPI\r
+InternalSwitchStackAsm (\r
+ SWITCH_STACK_ENTRY_POINT EntryPoint,\r
+ VOID *Context,\r
+ VOID *Context2,\r
+ VOID *NewStack\r
+ );\r
+**/\r
+ASM_PFX(InternalSwitchStackAsm):\r
+ MOV LR, R0\r
+ MOV SP, R3\r
+ MOV R0, R1\r
+ MOV R1, R2\r
+ BX LR\r
+\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
+VOID\r
+EFIAPI\r
+CpuPause (\r
+ VOID\r
+ )\r
+**/\r
+ASM_PFX(CpuPause):\r
+ nop\r
+ nop\r
+ nop\r
+ nop\r
+ nop\r
+ BX LR\r
Arm/CpuBreakpoint.asm | RVCT\r
\r
Arm/Math64.S | GCC\r
- Arm/GccInline.c | GCC\r
+ Arm/SwitchStack.S | GCC\r
Arm/EnableInterrupts.S | GCC\r
Arm/DisableInterrupts.S | GCC\r
Arm/GetInterruptsState.S | GCC\r