]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg/BaseLib: Replaced inline assembly for ARMGCC by GCC assembly source file
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 8 Nov 2011 18:49:22 +0000 (18:49 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 8 Nov 2011 18:49:22 +0000 (18:49 +0000)
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

MdePkg/Library/BaseLib/Arm/GccInline.c [deleted file]
MdePkg/Library/BaseLib/Arm/SwitchStack.S [new file with mode: 0644]
MdePkg/Library/BaseLib/BaseLib.inf

diff --git a/MdePkg/Library/BaseLib/Arm/GccInline.c b/MdePkg/Library/BaseLib/Arm/GccInline.c
deleted file mode 100644 (file)
index 0c6b016..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/** @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
diff --git a/MdePkg/Library/BaseLib/Arm/SwitchStack.S b/MdePkg/Library/BaseLib/Arm/SwitchStack.S
new file mode 100644 (file)
index 0000000..413de99
--- /dev/null
@@ -0,0 +1,68 @@
+//------------------------------------------------------------------------------ \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
index 19d546546ee2eab04f488be7f2578161e9195efa..f54c3bc32b1fd6b6667a9095025ab5388b25f486 100644 (file)
   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