public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Leif Lindholm <leif.lindholm@linaro.org>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: edk2-devel@lists.01.org, jbrasen@codeaurora.org,
	feng.tian@intel.com, star.zeng@intel.com, daniil.egranov@arm.com
Subject: Re: [PATCH v3 4/4] MdeModulePkg/EbcDxe AARCH64: simplify interpreter entry point thunks
Date: Fri, 26 Aug 2016 13:56:40 +0100	[thread overview]
Message-ID: <20160826125640.GG4715@bivouac.eciton.net> (raw)
In-Reply-To: <1471445945-19239-5-git-send-email-ard.biesheuvel@linaro.org>

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>



      reply	other threads:[~2016-08-26 12:56 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-17 14:59 [PATCH v3 0/4] MdeModulePkg/EbcDxe: AARCH64 improvements Ard Biesheuvel
2016-08-17 14:59 ` [PATCH v3 1/4] MdeModulePkg/EbcDxe AARCH64: clean up comment style in ASM file Ard Biesheuvel
2016-08-26 11:06   ` Leif Lindholm
2016-08-17 14:59 ` [PATCH v3 2/4] MdeModulePkg/EbcDxe AARCH64: use a fixed size thunk structure Ard Biesheuvel
2016-08-26 12:28   ` Leif Lindholm
2016-08-17 14:59 ` [PATCH v3 3/4] MdeModulePkg/EbxDxe AARCH64: use tail call for EBC to native thunk Ard Biesheuvel
2016-08-26 12:54   ` Leif Lindholm
2016-08-26 17:14     ` Ard Biesheuvel
2016-08-26 18:10       ` Leif Lindholm
2016-08-26 18:41         ` Ard Biesheuvel
2016-08-17 14:59 ` [PATCH v3 4/4] MdeModulePkg/EbcDxe AARCH64: simplify interpreter entry point thunks Ard Biesheuvel
2016-08-26 12:56   ` Leif Lindholm [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160826125640.GG4715@bivouac.eciton.net \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox