]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/EbcDxe/X64/EbcSupport.c
Remove assumption on EAX and R10 usage for IA32 compiler and X64 compiler.
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / X64 / EbcSupport.c
index 184c672f16e09db75ea618220887d601323f84e0..a31422b62acdb39182cbfec25fe7600f0d1f9449 100644 (file)
@@ -27,6 +27,31 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #define STACK_REMAIN_SIZE (1024 * 4)\r
 \r
+/**\r
+  Begin executing an EBC image.\r
+  This is used for Ebc Thunk call.\r
+\r
+  @return The value returned by the EBC application we're going to run.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+EbcLLEbcInterpret (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Begin executing an EBC image.\r
+  This is used for Ebc image entrypoint.\r
+\r
+  @return The value returned by the EBC application we're going to run.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+EbcLLExecuteEbcImageEntryPoint (\r
+  VOID\r
+  );\r
 \r
 /**\r
   Pushes a 64 bit unsigned value to the VM stack.\r
@@ -52,14 +77,13 @@ PushU64 (
 \r
 \r
 /**\r
-  Begin executing an EBC image. The address of the entry point is passed\r
-  in via a processor register, so we'll need to make a call to get the\r
-  value.\r
+  Begin executing an EBC image.\r
 \r
   This is a thunk function. Microsoft x64 compiler only provide fast_call\r
   calling convention, so the first four arguments are passed by rcx, rdx,\r
   r8, and r9, while other arguments are passed in stack.\r
 \r
+  @param  EntryPoint            The entrypoint of EBC code.\r
   @param  Arg1                  The 1st argument.\r
   @param  Arg2                  The 2nd argument.\r
   @param  Arg3                  The 3rd argument.\r
@@ -83,22 +107,23 @@ PushU64 (
 UINT64\r
 EFIAPI\r
 EbcInterpret (\r
-  IN OUT UINTN      Arg1,\r
-  IN OUT UINTN      Arg2,\r
-  IN OUT UINTN      Arg3,\r
-  IN OUT UINTN      Arg4,\r
-  IN OUT UINTN      Arg5,\r
-  IN OUT UINTN      Arg6,\r
-  IN OUT UINTN      Arg7,\r
-  IN OUT UINTN      Arg8,\r
-  IN OUT UINTN      Arg9,\r
-  IN OUT UINTN      Arg10,\r
-  IN OUT UINTN      Arg11,\r
-  IN OUT UINTN      Arg12,\r
-  IN OUT UINTN      Arg13,\r
-  IN OUT UINTN      Arg14,\r
-  IN OUT UINTN      Arg15,\r
-  IN OUT UINTN      Arg16\r
+  IN UINTN      EntryPoint,\r
+  IN UINTN      Arg1,\r
+  IN UINTN      Arg2,\r
+  IN UINTN      Arg3,\r
+  IN UINTN      Arg4,\r
+  IN UINTN      Arg5,\r
+  IN UINTN      Arg6,\r
+  IN UINTN      Arg7,\r
+  IN UINTN      Arg8,\r
+  IN UINTN      Arg9,\r
+  IN UINTN      Arg10,\r
+  IN UINTN      Arg11,\r
+  IN UINTN      Arg12,\r
+  IN UINTN      Arg13,\r
+  IN UINTN      Arg14,\r
+  IN UINTN      Arg15,\r
+  IN UINTN      Arg16\r
   )\r
 {\r
   //\r
@@ -110,11 +135,9 @@ EbcInterpret (
   UINTN       StackIndex;\r
 \r
   //\r
-  // Get the EBC entry point from the processor register.\r
-  // Don't call any function before getting the EBC entry\r
-  // point because this will collab the return register.\r
+  // Get the EBC entry point\r
   //\r
-  Addr = EbcLLGetEbcEntryPoint ();\r
+  Addr = EntryPoint;\r
 \r
   //\r
   // Now clear out our context\r
@@ -221,10 +244,9 @@ EbcInterpret (
 \r
 \r
 /**\r
-  Begin executing an EBC image. The address of the entry point is passed\r
-  in via a processor register, so we'll need to make a call to get the\r
-  value.\r
+  Begin executing an EBC image.\r
 \r
+  @param  EntryPoint       The entrypoint of EBC code.\r
   @param  ImageHandle      image handle for the EBC application we're executing\r
   @param  SystemTable      standard system table passed into an driver's entry\r
                            point\r
@@ -235,6 +257,7 @@ EbcInterpret (
 UINT64\r
 EFIAPI\r
 ExecuteEbcImageEntryPoint (\r
+  IN UINTN                EntryPoint,\r
   IN EFI_HANDLE           ImageHandle,\r
   IN EFI_SYSTEM_TABLE     *SystemTable\r
   )\r
@@ -248,11 +271,9 @@ ExecuteEbcImageEntryPoint (
   UINTN       StackIndex;\r
 \r
   //\r
-  // Get the EBC entry point from the processor register. Make sure you don't\r
-  // call any functions before this or you could mess up the register the\r
-  // entry point is passed in.\r
+  // Get the EBC entry point\r
   //\r
-  Addr = EbcLLGetEbcEntryPoint ();\r
+  Addr = EntryPoint;\r
 \r
   //\r
   // Now clear out our context\r
@@ -437,9 +458,9 @@ EbcCreateThunks (
   // mov r11 123456789abcdef0h  => 49 BB F0 DE BC 9A 78 56 34 12\r
   //\r
   if ((Flags & FLAG_THUNK_ENTRY_POINT) != 0) {\r
-    Addr = (UINTN) ExecuteEbcImageEntryPoint;\r
+    Addr = (UINTN) EbcLLExecuteEbcImageEntryPoint;\r
   } else {\r
-    Addr = (UINTN) EbcInterpret;\r
+    Addr = (UINTN) EbcLLEbcInterpret;\r
   }\r
 \r
   //\r