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>
prev parent 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