]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Remove assumption on EAX and R10 usage for IA32 compiler and X64 compiler.
authorjyao1 <jyao1@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 22 Nov 2011 08:07:30 +0000 (08:07 +0000)
committerjyao1 <jyao1@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 22 Nov 2011 08:07:30 +0000 (08:07 +0000)
Signed-off-by: jyao1
Reviewed-by: lgao4
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12760 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/EbcDxe/Ia32/EbcLowLevel.S
MdeModulePkg/Universal/EbcDxe/Ia32/EbcLowLevel.asm
MdeModulePkg/Universal/EbcDxe/Ia32/EbcSupport.c
MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.S
MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.asm
MdeModulePkg/Universal/EbcDxe/X64/EbcSupport.c

index 056885678bf345d019483bdea8a62e3901ccb37d..caf8d40ffb93321eab5f06b1113cd174f6970b97 100644 (file)
@@ -14,6 +14,8 @@
 #**/\r
 \r
 ASM_GLOBAL ASM_PFX(CopyMem)\r
+ASM_GLOBAL ASM_PFX(EbcInterpret)\r
+ASM_GLOBAL ASM_PFX(ExecuteEbcImageEntryPoint)\r
 \r
 ASM_GLOBAL ASM_PFX(EbcLLCALLEXNative)\r
 ASM_PFX(EbcLLCALLEXNative):\r
@@ -42,6 +44,40 @@ ASM_PFX(EbcLLCALLEXNative):
          pop    %ebp\r
          ret\r
 \r
-ASM_GLOBAL ASM_PFX(EbcLLGetEbcEntryPoint)\r
-ASM_PFX(EbcLLGetEbcEntryPoint):\r
-        ret\r
+ASM_GLOBAL ASM_PFX(EbcLLEbcInterpret)\r
+ASM_PFX(EbcLLEbcInterpret):\r
+    # Construct new stack\r
+    push %ebp\r
+    mov  %esp, %ebp\r
+    push %esi\r
+    push %edi\r
+    sub  $0x40, %esp\r
+    push %eax\r
+    mov  %ebp, %esi\r
+    add  $0x8, %esi\r
+    mov  %esp, %edi\r
+    add  $0x4, %edi\r
+    mov  $0x10, %ecx\r
+    rep  movsd\r
+    \r
+    # call C-code\r
+    call ASM_PFX(EbcInterpret)\r
+    add  $0x44, %esp\r
+    pop  %edi\r
+    pop  %esi\r
+    pop  %ebp\r
+    ret\r
+\r
+ASM_GLOBAL ASM_PFX(EbcLLExecuteEbcImageEntryPoint)\r
+ASM_PFX(EbcLLExecuteEbcImageEntryPoint):\r
+    # Construct new stack\r
+    mov  %eax, -0xC(%esp)\r
+    mov  0x4(%esp), %eax\r
+    mov  %eax, -0x8(%esp)\r
+    mov  0x8(%esp), %eax\r
+    mov  %eax, -0x4(%esp)\r
+    # call C-code\r
+    sub  $0xC, %esp\r
+    call ASM_PFX(ExecuteEbcImageEntryPoint)\r
+    add  $0xC, %esp\r
+    ret\r
index 73d48e7c7f97eca8443144f490c043efe85b2583..b16fda69fa6701cd40866467583350860b489766 100644 (file)
 ;---------------------------------------------------------------------------\r
 \r
 .686p\r
-.model  flat\r
+.model  flat, C\r
 .code\r
-CopyMem  PROTO  C Destination:PTR DWORD, Source:PTR DWORD, Count:DWORD\r
+CopyMem  PROTO  Destination:PTR DWORD, Source:PTR DWORD, Count:DWORD\r
+EbcInterpret               PROTO\r
+ExecuteEbcImageEntryPoint  PROTO\r
 \r
 ;****************************************************************************\r
 ; EbcLLCALLEXNative\r
@@ -47,7 +49,7 @@ CopyMem  PROTO  C Destination:PTR DWORD, Source:PTR DWORD, Count:DWORD
 ; Destroys no working registers.\r
 ;****************************************************************************\r
 ; INT64 EbcLLCALLEXNative(UINTN FuncAddr, UINTN NewStackPointer, VOID *FramePtr)\r
-_EbcLLCALLEXNative        PROC        PUBLIC\r
+EbcLLCALLEXNative        PROC        PUBLIC\r
       push   ebp\r
       push   ebx\r
       mov    ebp, esp              ; standard function prolog\r
@@ -85,25 +87,121 @@ _EbcLLCALLEXNative        PROC        PUBLIC
       pop      ebx\r
       pop      ebp\r
       ret\r
-_EbcLLCALLEXNative    ENDP\r
+EbcLLCALLEXNative    ENDP\r
 \r
-\r
-; UINTN EbcLLGetEbcEntryPoint(VOID);\r
-; Routine Description:\r
-;   The VM thunk code stuffs an EBC entry point into a processor\r
-;   register. Since we can't use inline assembly to get it from\r
-;   the interpreter C code, stuff it into the return value\r
-;   register and return.\r
-;\r
-; Arguments:\r
-;     None.\r
+;****************************************************************************\r
+; EbcLLEbcInterpret\r
 ;\r
-; Returns:\r
-;     The contents of the register in which the entry point is passed.\r
+; Begin executing an EBC image.\r
+;****************************************************************************\r
+; UINT64 EbcLLEbcInterpret(VOID)\r
+EbcLLEbcInterpret PROC PUBLIC\r
+    ;\r
+    ;; mov eax, 0xca112ebc\r
+    ;; mov eax, EbcEntryPoint\r
+    ;; mov ecx, EbcLLEbcInterpret\r
+    ;; jmp ecx\r
+    ;\r
+    ; Caller uses above instruction to jump here\r
+    ; The stack is below:\r
+    ; +-----------+\r
+    ; |  RetAddr  |\r
+    ; +-----------+\r
+    ; |EntryPoint | (EAX)\r
+    ; +-----------+\r
+    ; |   Arg1    | <- EDI\r
+    ; +-----------+\r
+    ; |   Arg2    |\r
+    ; +-----------+\r
+    ; |   ...     |\r
+    ; +-----------+\r
+    ; |   Arg16   |\r
+    ; +-----------+\r
+    ; |   EDI     |\r
+    ; +-----------+\r
+    ; |   ESI     |\r
+    ; +-----------+\r
+    ; |   EBP     | <- EBP\r
+    ; +-----------+\r
+    ; |  RetAddr  | <- ESP is here\r
+    ; +-----------+\r
+    ; |   Arg1    | <- ESI\r
+    ; +-----------+\r
+    ; |   Arg2    |\r
+    ; +-----------+\r
+    ; |   ...     |\r
+    ; +-----------+\r
+    ; |   Arg16   |\r
+    ; +-----------+\r
+    ; \r
+\r
+    ; Construct new stack\r
+    push ebp\r
+    mov  ebp, esp\r
+    push esi\r
+    push edi\r
+    sub  esp, 40h\r
+    push eax\r
+    mov  esi, ebp\r
+    add  esi, 8\r
+    mov  edi, esp\r
+    add  edi, 4\r
+    mov  ecx, 16\r
+    rep  movsd\r
+    \r
+    ; call C-code\r
+    call EbcInterpret\r
+    add  esp, 44h\r
+    pop  edi\r
+    pop  esi\r
+    pop  ebp\r
+    ret\r
+EbcLLEbcInterpret ENDP\r
+\r
+;****************************************************************************\r
+; EbcLLExecuteEbcImageEntryPoint\r
 ;\r
-_EbcLLGetEbcEntryPoint        PROC        PUBLIC\r
-    ; The EbcEntryPoint is saved to EAX, so just return here.\r
+; Begin executing an EBC image.\r
+;****************************************************************************\r
+; UINT64 EbcLLExecuteEbcImageEntryPoint(VOID)\r
+EbcLLExecuteEbcImageEntryPoint PROC PUBLIC\r
+    ;\r
+    ;; mov eax, 0xca112ebc\r
+    ;; mov eax, EbcEntryPoint\r
+    ;; mov ecx, EbcLLExecuteEbcImageEntryPoint\r
+    ;; jmp ecx\r
+    ;\r
+    ; Caller uses above instruction to jump here\r
+    ; The stack is below:\r
+    ; +-----------+\r
+    ; |  RetAddr  |\r
+    ; +-----------+\r
+    ; |EntryPoint | (EAX)\r
+    ; +-----------+\r
+    ; |ImageHandle|\r
+    ; +-----------+\r
+    ; |SystemTable|\r
+    ; +-----------+\r
+    ; |  RetAddr  | <- ESP is here\r
+    ; +-----------+\r
+    ; |ImageHandle|\r
+    ; +-----------+\r
+    ; |SystemTable|\r
+    ; +-----------+\r
+    ; \r
+    \r
+    ; Construct new stack\r
+    mov  [esp - 0Ch], eax\r
+    mov  eax, [esp + 04h]\r
+    mov  [esp - 08h], eax\r
+    mov  eax, [esp + 08h]\r
+    mov  [esp - 04h], eax\r
+    \r
+    ; call C-code\r
+    sub  esp, 0Ch\r
+    call ExecuteEbcImageEntryPoint\r
+    add  esp, 0Ch\r
     ret\r
-_EbcLLGetEbcEntryPoint    ENDP\r
+EbcLLExecuteEbcImageEntryPoint ENDP\r
 \r
 END\r
index 549b04afd2d26e599bb7ea35222705c6190f14af..da1ad2cd5d8f68b324acb4c17452f3f7da72c615 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
   This function is called to execute an EBC CALLEX instruction.\r
@@ -131,14 +156,13 @@ Action:
 \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
@@ -162,22 +186,23 @@ Action:
 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
@@ -189,9 +214,9 @@ EbcInterpret (
   UINTN       StackIndex;\r
 \r
   //\r
-  // Get the EBC entry point from the processor register.\r
+  // Get the EBC entry point\r
   //\r
-  Addr = EbcLLGetEbcEntryPoint ();\r
+  Addr = EntryPoint;\r
 \r
   //\r
   // Now clear out our context\r
@@ -297,10 +322,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
@@ -311,6 +335,7 @@ EbcInterpret (
 UINT64\r
 EFIAPI\r
 ExecuteEbcImageEntryPoint (\r
+  IN UINTN                EntryPoint,\r
   IN EFI_HANDLE           ImageHandle,\r
   IN EFI_SYSTEM_TABLE     *SystemTable\r
   )\r
@@ -324,15 +349,10 @@ 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
-  //  Print(L"*** Thunked into EBC entry point - ImageHandle = 0x%X\n", (UINTN)ImageHandle);\r
-  //  Print(L"EBC entry point is 0x%X\n", (UINT32)(UINTN)Addr);\r
   //\r
   // Now clear out our context\r
   //\r
@@ -496,9 +516,9 @@ EbcCreateThunks (
   //  mov ecx 12345678h  => 0xB9 0x78 0x56 0x34 0x12\r
   //\r
   if ((Flags & FLAG_THUNK_ENTRY_POINT) != 0) {\r
-    Addr = (UINT32) (UINTN) ExecuteEbcImageEntryPoint;\r
+    Addr = (UINT32) (UINTN) EbcLLExecuteEbcImageEntryPoint;\r
   } else {\r
-    Addr = (UINT32) (UINTN) EbcInterpret;\r
+    Addr = (UINT32) (UINTN) EbcLLEbcInterpret;\r
   }\r
 \r
   //\r
index eb2b9cd085415c1d2b41a3c932a548487361671f..859cbce24cd1e8d3140f8d265974f23d4a58164a 100644 (file)
@@ -19,6 +19,8 @@
 #---------------------------------------------------------------------------\r
 \r
 ASM_GLOBAL ASM_PFX(CopyMem);\r
+ASM_GLOBAL ASM_PFX(EbcInterpret);\r
+ASM_GLOBAL ASM_PFX(ExecuteEbcImageEntryPoint);\r
 \r
 #****************************************************************************\r
 # EbcLLCALLEX\r
@@ -66,21 +68,53 @@ ASM_PFX(EbcLLCALLEXNative):
       pop      %rbp\r
       ret\r
 \r
+ASM_GLOBAL ASM_PFX(EbcLLEbcInterpret);\r
+ASM_PFX(EbcLLEbcInterpret):\r
+    # save old parameter to stack\r
+    mov  %rcx, 0x8(%rsp)\r
+    mov  %rdx, 0x10(%rsp)\r
+    mov  %r8, 0x18(%rsp)\r
+    mov  %r9, 0x20(%rsp)\r
 \r
-# UINTN EbcLLGetEbcEntryPoint(VOID);\r
-# Routine Description:\r
-#   The VM thunk code stuffs an EBC entry point into a processor\r
-#   register. Since we can't use inline assembly to get it from\r
-#   the interpreter C code, stuff it into the return value\r
-#   register and return.\r
-#\r
-# Arguments:\r
-#     None.\r
-#\r
-# Returns:\r
-#     The contents of the register in which the entry point is passed.\r
-#\r
-ASM_GLOBAL ASM_PFX(EbcLLGetEbcEntryPoint);\r
-ASM_PFX(EbcLLGetEbcEntryPoint):\r
-    mov    %r10, %rax\r
+    # Construct new stack\r
+    push %rbp\r
+    mov  %rsp, %rbp\r
+    push %rsi\r
+    push %rdi\r
+    push %rbx\r
+    sub  $0x80, %rsp\r
+    push %r10\r
+    mov  %rbp, %rsi\r
+    add  $0x10, %rsi\r
+    mov  %rsp, %rdi\r
+    add  $0x8, %rdi\r
+    mov  $0x10, %rcx\r
+    rep  movsq\r
+    \r
+    # build new paramater calling convention\r
+    mov  0x18(%rsp), %r9\r
+    mov  0x10(%rsp), %r8\r
+    mov  0x8(%rsp), %rdx\r
+    mov  %r10, %rcx\r
+\r
+    # call C-code\r
+    call ASM_PFX(EbcInterpret)\r
+    add  $0x88, %esp\r
+    pop  %rbx\r
+    pop  %rdi\r
+    pop  %rsi\r
+    pop  %rbp\r
+    ret\r
+\r
+ASM_GLOBAL ASM_PFX(EbcLLExecuteEbcImageEntryPoint);\r
+ASM_PFX(EbcLLExecuteEbcImageEntryPoint):\r
+    # build new paramater calling convention\r
+    mov  %rdx, %r8\r
+    mov  %rcx, %rdx\r
+    mov  %r10, %rcx\r
+\r
+    # call C-code\r
+    sub  $0x28, %rsp\r
+    call ASM_PFX(ExecuteEbcImageEntryPoint)\r
+    add  $0x28, %rsp\r
     ret\r
index 19fc35b0fc403f82901963babbb066d346eef00e..a79fdcabfffcfb4e3112effad111c857e7cc9bcb 100644 (file)
@@ -24,6 +24,8 @@
 .CODE\r
 \r
 CopyMem  PROTO  Destination:PTR DWORD, Source:PTR DWORD, Count:DWORD\r
+EbcInterpret               PROTO\r
+ExecuteEbcImageEntryPoint  PROTO\r
 \r
 ;****************************************************************************\r
 ; EbcLLCALLEX\r
@@ -71,25 +73,146 @@ EbcLLCALLEXNative        PROC    PUBLIC
       ret\r
 EbcLLCALLEXNative    ENDP\r
 \r
-\r
-; UINTN EbcLLGetEbcEntryPoint(VOID);\r
-; Routine Description:\r
-;   The VM thunk code stuffs an EBC entry point into a processor\r
-;   register. Since we can't use inline assembly to get it from\r
-;   the interpreter C code, stuff it into the return value\r
-;   register and return.\r
-;\r
-; Arguments:\r
-;     None.\r
+;****************************************************************************\r
+; EbcLLEbcInterpret\r
 ;\r
-; Returns:\r
-;     The contents of the register in which the entry point is passed.\r
+; Begin executing an EBC image.\r
+;****************************************************************************\r
+; UINT64 EbcLLEbcInterpret(VOID)\r
+EbcLLEbcInterpret PROC PUBLIC\r
+    ;\r
+    ;; mov rax, ca112ebccall2ebch\r
+    ;; mov r10, EbcEntryPoint\r
+    ;; mov r11, EbcLLEbcInterpret\r
+    ;; jmp r11\r
+    ;\r
+    ; Caller uses above instruction to jump here\r
+    ; The stack is below:\r
+    ; +-----------+\r
+    ; |  RetAddr  |\r
+    ; +-----------+\r
+    ; |EntryPoint | (R10)\r
+    ; +-----------+\r
+    ; |   Arg1    | <- RDI\r
+    ; +-----------+\r
+    ; |   Arg2    |\r
+    ; +-----------+\r
+    ; |   ...     |\r
+    ; +-----------+\r
+    ; |   Arg16   |\r
+    ; +-----------+\r
+    ; |   Dummy   |\r
+    ; +-----------+\r
+    ; |   RDI     |\r
+    ; +-----------+\r
+    ; |   RSI     |\r
+    ; +-----------+\r
+    ; |   RBP     | <- RBP\r
+    ; +-----------+\r
+    ; |  RetAddr  | <- RSP is here\r
+    ; +-----------+\r
+    ; |  Scratch1 | (RCX) <- RSI\r
+    ; +-----------+\r
+    ; |  Scratch2 | (RDX)\r
+    ; +-----------+\r
+    ; |  Scratch3 | (R8)\r
+    ; +-----------+\r
+    ; |  Scratch4 | (R9)\r
+    ; +-----------+\r
+    ; |   Arg5    |\r
+    ; +-----------+\r
+    ; |   Arg6    |\r
+    ; +-----------+\r
+    ; |   ...     |\r
+    ; +-----------+\r
+    ; |   Arg16   |\r
+    ; +-----------+\r
+    ;\r
+\r
+    ; save old parameter to stack\r
+    mov  [rsp + 08h], rcx\r
+    mov  [rsp + 10h], rdx\r
+    mov  [rsp + 18h], r8\r
+    mov  [rsp + 20h], r9\r
+\r
+    ; Construct new stack\r
+    push rbp\r
+    mov  rbp, rsp\r
+    push rsi\r
+    push rdi\r
+    push rbx\r
+    sub  rsp, 80h\r
+    push r10\r
+    mov  rsi, rbp\r
+    add  rsi, 10h\r
+    mov  rdi, rsp\r
+    add  rdi, 8\r
+    mov  rcx, 16\r
+    rep  movsq\r
+    \r
+    ; build new paramater calling convention\r
+    mov  r9,  [rsp + 18h]\r
+    mov  r8,  [rsp + 10h]\r
+    mov  rdx, [rsp + 08h]\r
+    mov  rcx, r10\r
+\r
+    ; call C-code\r
+    call EbcInterpret\r
+    add  rsp, 88h\r
+    pop  rbx\r
+    pop  rdi\r
+    pop  rsi\r
+    pop  rbp\r
+    ret\r
+EbcLLEbcInterpret ENDP\r
+\r
+;****************************************************************************\r
+; EbcLLExecuteEbcImageEntryPoint\r
 ;\r
-EbcLLGetEbcEntryPoint        PROC    PUBLIC\r
-    ; The EbcEntryPoint is saved to R10.\r
-    mov  rax, r10\r
+; Begin executing an EBC image.\r
+;****************************************************************************\r
+; UINT64 EbcLLExecuteEbcImageEntryPoint(VOID)\r
+EbcLLExecuteEbcImageEntryPoint PROC PUBLIC\r
+    ;\r
+    ;; mov rax, ca112ebccall2ebch\r
+    ;; mov r10, EbcEntryPoint\r
+    ;; mov r11, EbcLLExecuteEbcImageEntryPoint\r
+    ;; jmp r11\r
+    ;\r
+    ; Caller uses above instruction to jump here\r
+    ; The stack is below:\r
+    ; +-----------+\r
+    ; |  RetAddr  |\r
+    ; +-----------+\r
+    ; |EntryPoint | (R10)\r
+    ; +-----------+\r
+    ; |ImageHandle|\r
+    ; +-----------+\r
+    ; |SystemTable|\r
+    ; +-----------+\r
+    ; |   Dummy   |\r
+    ; +-----------+\r
+    ; |   Dummy   |\r
+    ; +-----------+\r
+    ; |  RetAddr  | <- RSP is here\r
+    ; +-----------+\r
+    ; |ImageHandle| (RCX)\r
+    ; +-----------+\r
+    ; |SystemTable| (RDX)\r
+    ; +-----------+\r
+    ; \r
+\r
+    ; build new paramater calling convention\r
+    mov  r8, rdx\r
+    mov  rdx, rcx\r
+    mov  rcx, r10\r
+\r
+    ; call C-code\r
+    sub  rsp, 28h\r
+    call ExecuteEbcImageEntryPoint\r
+    add  rsp, 28h\r
     ret\r
-EbcLLGetEbcEntryPoint    ENDP\r
+EbcLLExecuteEbcImageEntryPoint ENDP\r
 \r
 END\r
 \r
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