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.biesheu...@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.lindh...@linaro.org>

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

Reply via email to