[edk2,v3,4/4] MdeModulePkg/EbcDxe AARCH64: simplify interpreter entry point thunks

Message ID 1471445945-19239-5-git-send-email-ard.biesheuvel@linaro.org
State New
Headers show

Commit Message

Ard Biesheuvel Aug. 17, 2016, 2:59 p.m.
The prototypes of EbcInterpret() and ExecuteEbcImageEntryPoint() are
private to the AARCH64 implementation of EbcDxe, so we can shuffle
the arguments around a bit and make the assembler thunking clue a lot
simpler.

For ExecuteEbcImageEntryPoint(), this involves passing the EntryPoint
argument as the third parameter, rather than the first, which allows
us to do a tail call. For EbcInterpret(), instead of copying each
argument beyond #8 from one native stack frame to the next (before
another copy is made into the VM stack), pass a pointer to the
argument stack.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---
 MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S | 57 +++++---------------
 MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c  | 44 ++++++---------
 2 files changed, 27 insertions(+), 74 deletions(-)

-- 
2.7.4

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Comments

Leif Lindholm Aug. 26, 2016, 12:56 p.m. | #1
On Wed, Aug 17, 2016 at 04:59:05PM +0200, Ard Biesheuvel wrote:
> The prototypes of EbcInterpret() and ExecuteEbcImageEntryPoint() are

> private to the AARCH64 implementation of EbcDxe, so we can shuffle

> the arguments around a bit and make the assembler thunking clue a lot

> simpler.

> 

> For ExecuteEbcImageEntryPoint(), this involves passing the EntryPoint

> argument as the third parameter, rather than the first, which allows

> us to do a tail call. For EbcInterpret(), instead of copying each

> argument beyond #8 from one native stack frame to the next (before

> another copy is made into the VM stack), pass a pointer to the

> argument stack.

> 

> Contributed-under: TianoCore Contribution Agreement 1.0

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---

>  MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S | 57 +++++---------------

>  MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c  | 44 ++++++---------

>  2 files changed, 27 insertions(+), 74 deletions(-)

> 

> diff --git a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S

> index d95713e82b0f..f90cd711ec90 100644

> --- a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S

> +++ b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S

> @@ -107,45 +107,18 @@ ASM_PFX(EbcLLCALLEXNative):

>  //

>  //****************************************************************************

>  ASM_PFX(EbcLLEbcInterpret):

> -    stp  x29, x30, [sp, #-16]!

> -

> -    // copy the current arguments 9-16 from old location and add arg 7 to stack

> -    // keeping 16 byte stack alignment

> -    sub sp, sp, #80

> -    str x7, [sp]

> -    ldr x11, [sp, #96]

> -    str x11, [sp, #8]

> -    ldr x11, [sp, #104]

> -    str x11, [sp, #16]

> -    ldr x11, [sp, #112]

> -    str x11, [sp, #24]

> -    ldr x11, [sp, #120]

> -    str x11, [sp, #32]

> -    ldr x11, [sp, #128]

> -    str x11, [sp, #40]

> -    ldr x11, [sp, #136]

> -    str x11, [sp, #48]

> -    ldr x11, [sp, #144]

> -    str x11, [sp, #56]

> -    ldr x11, [sp, #152]

> -    str x11, [sp, #64]

> -

> -    // Shift arguments and add entry point and as argument 1

> -    mov x7, x6

> -    mov x6, x5

> -    mov x5, x4

> -    mov x4, x3

> -    mov x3, x2

> -    mov x2, x1

> -    mov x1, x0

> -    mov x0, x16

> +    stp     x29, x30, [sp, #-16]!

> +    mov     x29, sp

>  

> -    // call C-code

> -    bl ASM_PFX(EbcInterpret)

> -    add sp, sp, #80

> +    // push the entry point and the address of args #9 - #16 onto the stack

> +    add     x17, sp, #16

> +    stp     x16, x17, [sp, #-16]!

>  

> -    ldp  x29, x30, [sp], #16

> +    // call C-code

> +    bl      ASM_PFX(EbcInterpret)

>  

> +    add     sp, sp, #16

> +    ldp     x29, x30, [sp], #16

>      ret

>  

>  //****************************************************************************

> @@ -157,16 +130,10 @@ ASM_PFX(EbcLLEbcInterpret):

>  //

>  //****************************************************************************

>  ASM_PFX(EbcLLExecuteEbcImageEntryPoint):

> -    stp  x29, x30, [sp, #-16]!

> -    // build new paramater calling convention

> -    mov  x2, x1

> -    mov  x1, x0

> -    mov  x0, x16

> +    mov     x2, x16

>  

> -    // call C-code

> -    bl ASM_PFX(ExecuteEbcImageEntryPoint)

> -    ldp  x29, x30, [sp], #16

> -    ret

> +    // tail call to C code

> +    b       ASM_PFX(ExecuteEbcImageEntryPoint)

>  

>  //****************************************************************************

>  // mEbcInstructionBufferTemplate

> diff --git a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c

> index a5f21f400274..f059b0e7e102 100644

> --- a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c

> +++ b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c

> @@ -89,7 +89,6 @@ PushU64 (

>  

>    This is a thunk function.

>  

> -  @param  EntryPoint            The entrypoint of EBC code.

>    @param  Arg1                  The 1st argument.

>    @param  Arg2                  The 2nd argument.

>    @param  Arg3                  The 3rd argument.

> @@ -98,14 +97,8 @@ PushU64 (

>    @param  Arg6                  The 6th argument.

>    @param  Arg7                  The 7th argument.

>    @param  Arg8                  The 8th argument.

> -  @param  Arg9                  The 9th argument.

> -  @param  Arg10                 The 10th argument.

> -  @param  Arg11                 The 11th argument.

> -  @param  Arg12                 The 12th argument.

> -  @param  Arg13                 The 13th argument.

> -  @param  Arg14                 The 14th argument.

> -  @param  Arg15                 The 15th argument.

> -  @param  Arg16                 The 16th argument.

> +  @param  EntryPoint            The entrypoint of EBC code.

> +  @param  Args9_16[]            Array containing arguments #9 to #16.

>  

>    @return The value returned by the EBC application we're going to run.

>  

> @@ -113,7 +106,6 @@ PushU64 (

>  UINT64

>  EFIAPI

>  EbcInterpret (

> -  IN UINTN      EntryPoint,

>    IN UINTN      Arg1,

>    IN UINTN      Arg2,

>    IN UINTN      Arg3,

> @@ -122,14 +114,8 @@ EbcInterpret (

>    IN UINTN      Arg6,

>    IN UINTN      Arg7,

>    IN UINTN      Arg8,

> -  IN UINTN      Arg9,

> -  IN UINTN      Arg10,

> -  IN UINTN      Arg11,

> -  IN UINTN      Arg12,

> -  IN UINTN      Arg13,

> -  IN UINTN      Arg14,

> -  IN UINTN      Arg15,

> -  IN UINTN      Arg16

> +  IN UINTN      EntryPoint,

> +  IN UINTN      Args9_16[]

>    )

>  {

>    //

> @@ -193,14 +179,14 @@ EbcInterpret (

>    // For the worst case, assume there are 4 arguments passed in registers, store

>    // them to VM's stack.

>    //

> -  PushU64 (&VmContext, (UINT64) Arg16);

> -  PushU64 (&VmContext, (UINT64) Arg15);

> -  PushU64 (&VmContext, (UINT64) Arg14);

> -  PushU64 (&VmContext, (UINT64) Arg13);

> -  PushU64 (&VmContext, (UINT64) Arg12);

> -  PushU64 (&VmContext, (UINT64) Arg11);

> -  PushU64 (&VmContext, (UINT64) Arg10);

> -  PushU64 (&VmContext, (UINT64) Arg9);

> +  PushU64 (&VmContext, (UINT64) Args9_16[7]);

> +  PushU64 (&VmContext, (UINT64) Args9_16[6]);

> +  PushU64 (&VmContext, (UINT64) Args9_16[5]);

> +  PushU64 (&VmContext, (UINT64) Args9_16[4]);

> +  PushU64 (&VmContext, (UINT64) Args9_16[3]);

> +  PushU64 (&VmContext, (UINT64) Args9_16[2]);

> +  PushU64 (&VmContext, (UINT64) Args9_16[1]);

> +  PushU64 (&VmContext, (UINT64) Args9_16[0]);

>    PushU64 (&VmContext, (UINT64) Arg8);

>    PushU64 (&VmContext, (UINT64) Arg7);

>    PushU64 (&VmContext, (UINT64) Arg6);

> @@ -252,10 +238,10 @@ EbcInterpret (

>  /**

>    Begin executing an EBC image.

>  

> -  @param  EntryPoint       The entrypoint of EBC code.

>    @param  ImageHandle      image handle for the EBC application we're executing

>    @param  SystemTable      standard system table passed into an driver's entry

>                             point

> +  @param  EntryPoint       The entrypoint of EBC code.

>  

>    @return The value returned by the EBC application we're going to run.

>  

> @@ -263,9 +249,9 @@ EbcInterpret (

>  UINT64

>  EFIAPI

>  ExecuteEbcImageEntryPoint (

> -  IN UINTN                EntryPoint,

>    IN EFI_HANDLE           ImageHandle,

> -  IN EFI_SYSTEM_TABLE     *SystemTable

> +  IN EFI_SYSTEM_TABLE     *SystemTable,

> +  IN UINTN                EntryPoint

>    )

>  {

>    //

> -- 

> 2.7.4


Neat!
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Patch

diff --git a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S
index d95713e82b0f..f90cd711ec90 100644
--- a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S
+++ b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcLowLevel.S
@@ -107,45 +107,18 @@  ASM_PFX(EbcLLCALLEXNative):
 //
 //****************************************************************************
 ASM_PFX(EbcLLEbcInterpret):
-    stp  x29, x30, [sp, #-16]!
-
-    // copy the current arguments 9-16 from old location and add arg 7 to stack
-    // keeping 16 byte stack alignment
-    sub sp, sp, #80
-    str x7, [sp]
-    ldr x11, [sp, #96]
-    str x11, [sp, #8]
-    ldr x11, [sp, #104]
-    str x11, [sp, #16]
-    ldr x11, [sp, #112]
-    str x11, [sp, #24]
-    ldr x11, [sp, #120]
-    str x11, [sp, #32]
-    ldr x11, [sp, #128]
-    str x11, [sp, #40]
-    ldr x11, [sp, #136]
-    str x11, [sp, #48]
-    ldr x11, [sp, #144]
-    str x11, [sp, #56]
-    ldr x11, [sp, #152]
-    str x11, [sp, #64]
-
-    // Shift arguments and add entry point and as argument 1
-    mov x7, x6
-    mov x6, x5
-    mov x5, x4
-    mov x4, x3
-    mov x3, x2
-    mov x2, x1
-    mov x1, x0
-    mov x0, x16
+    stp     x29, x30, [sp, #-16]!
+    mov     x29, sp
 
-    // call C-code
-    bl ASM_PFX(EbcInterpret)
-    add sp, sp, #80
+    // push the entry point and the address of args #9 - #16 onto the stack
+    add     x17, sp, #16
+    stp     x16, x17, [sp, #-16]!
 
-    ldp  x29, x30, [sp], #16
+    // call C-code
+    bl      ASM_PFX(EbcInterpret)
 
+    add     sp, sp, #16
+    ldp     x29, x30, [sp], #16
     ret
 
 //****************************************************************************
@@ -157,16 +130,10 @@  ASM_PFX(EbcLLEbcInterpret):
 //
 //****************************************************************************
 ASM_PFX(EbcLLExecuteEbcImageEntryPoint):
-    stp  x29, x30, [sp, #-16]!
-    // build new paramater calling convention
-    mov  x2, x1
-    mov  x1, x0
-    mov  x0, x16
+    mov     x2, x16
 
-    // call C-code
-    bl ASM_PFX(ExecuteEbcImageEntryPoint)
-    ldp  x29, x30, [sp], #16
-    ret
+    // tail call to C code
+    b       ASM_PFX(ExecuteEbcImageEntryPoint)
 
 //****************************************************************************
 // mEbcInstructionBufferTemplate
diff --git a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c
index a5f21f400274..f059b0e7e102 100644
--- a/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c
+++ b/MdeModulePkg/Universal/EbcDxe/AArch64/EbcSupport.c
@@ -89,7 +89,6 @@  PushU64 (
 
   This is a thunk function.
 
-  @param  EntryPoint            The entrypoint of EBC code.
   @param  Arg1                  The 1st argument.
   @param  Arg2                  The 2nd argument.
   @param  Arg3                  The 3rd argument.
@@ -98,14 +97,8 @@  PushU64 (
   @param  Arg6                  The 6th argument.
   @param  Arg7                  The 7th argument.
   @param  Arg8                  The 8th argument.
-  @param  Arg9                  The 9th argument.
-  @param  Arg10                 The 10th argument.
-  @param  Arg11                 The 11th argument.
-  @param  Arg12                 The 12th argument.
-  @param  Arg13                 The 13th argument.
-  @param  Arg14                 The 14th argument.
-  @param  Arg15                 The 15th argument.
-  @param  Arg16                 The 16th argument.
+  @param  EntryPoint            The entrypoint of EBC code.
+  @param  Args9_16[]            Array containing arguments #9 to #16.
 
   @return The value returned by the EBC application we're going to run.
 
@@ -113,7 +106,6 @@  PushU64 (
 UINT64
 EFIAPI
 EbcInterpret (
-  IN UINTN      EntryPoint,
   IN UINTN      Arg1,
   IN UINTN      Arg2,
   IN UINTN      Arg3,
@@ -122,14 +114,8 @@  EbcInterpret (
   IN UINTN      Arg6,
   IN UINTN      Arg7,
   IN UINTN      Arg8,
-  IN UINTN      Arg9,
-  IN UINTN      Arg10,
-  IN UINTN      Arg11,
-  IN UINTN      Arg12,
-  IN UINTN      Arg13,
-  IN UINTN      Arg14,
-  IN UINTN      Arg15,
-  IN UINTN      Arg16
+  IN UINTN      EntryPoint,
+  IN UINTN      Args9_16[]
   )
 {
   //
@@ -193,14 +179,14 @@  EbcInterpret (
   // For the worst case, assume there are 4 arguments passed in registers, store
   // them to VM's stack.
   //
-  PushU64 (&VmContext, (UINT64) Arg16);
-  PushU64 (&VmContext, (UINT64) Arg15);
-  PushU64 (&VmContext, (UINT64) Arg14);
-  PushU64 (&VmContext, (UINT64) Arg13);
-  PushU64 (&VmContext, (UINT64) Arg12);
-  PushU64 (&VmContext, (UINT64) Arg11);
-  PushU64 (&VmContext, (UINT64) Arg10);
-  PushU64 (&VmContext, (UINT64) Arg9);
+  PushU64 (&VmContext, (UINT64) Args9_16[7]);
+  PushU64 (&VmContext, (UINT64) Args9_16[6]);
+  PushU64 (&VmContext, (UINT64) Args9_16[5]);
+  PushU64 (&VmContext, (UINT64) Args9_16[4]);
+  PushU64 (&VmContext, (UINT64) Args9_16[3]);
+  PushU64 (&VmContext, (UINT64) Args9_16[2]);
+  PushU64 (&VmContext, (UINT64) Args9_16[1]);
+  PushU64 (&VmContext, (UINT64) Args9_16[0]);
   PushU64 (&VmContext, (UINT64) Arg8);
   PushU64 (&VmContext, (UINT64) Arg7);
   PushU64 (&VmContext, (UINT64) Arg6);
@@ -252,10 +238,10 @@  EbcInterpret (
 /**
   Begin executing an EBC image.
 
-  @param  EntryPoint       The entrypoint of EBC code.
   @param  ImageHandle      image handle for the EBC application we're executing
   @param  SystemTable      standard system table passed into an driver's entry
                            point
+  @param  EntryPoint       The entrypoint of EBC code.
 
   @return The value returned by the EBC application we're going to run.
 
@@ -263,9 +249,9 @@  EbcInterpret (
 UINT64
 EFIAPI
 ExecuteEbcImageEntryPoint (
-  IN UINTN                EntryPoint,
   IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
+  IN EFI_SYSTEM_TABLE     *SystemTable,
+  IN UINTN                EntryPoint
   )
 {
   //