From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-x233.google.com (mail-wm0-x233.google.com [IPv6:2a00:1450:400c:c09::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 394991A1E15 for ; Wed, 17 Aug 2016 07:59:26 -0700 (PDT) Received: by mail-wm0-x233.google.com with SMTP id f65so201041343wmi.0 for ; Wed, 17 Aug 2016 07:59:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=70wUer7qnFt79GqgCEAsUXwmFeuLl0+b087CV4dNMwo=; b=iirlrVw3om4O5i0SHNFJuYGXCciQoaxBnmalgAsfkN3IFKHi1xvpJ+jwgcmudLq1/d yxX4gaqth8is6o0E+h5DDc90xAbUZADf3XncSXVqO9Sv2GMHUDTBi+ujYF42JJTGiTZJ 2zpH87sPyN6mD37AypLxjhG2CjQZ3szS2dc0U= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=70wUer7qnFt79GqgCEAsUXwmFeuLl0+b087CV4dNMwo=; b=V89a8x71SvA5K/mGJq0rgSAd2erOdtkVrydjhqQavMr06YRCT62SKRzZRsicKT3sO/ lt3DJfkvEFUB4TR2aOrXDfPbUwE5/0oB+6568MbsQPpjsD4sVnfopP8VnDBRWYpNzIYq ++EKab0Txwfv3AkTe73pKfxObW0vyXfVtf5vwuha4GnWxQGR0ineiMmZbqUhg8vGtZpl rrh6/YubiOGWHm465LSsvwO7Xx7IYKpXkkM19xb6u4EM33c8vTrJQ4dyAOk1qnmnxaKo n0GweYNqSKrkwSHWC0hmXgZ4qNxmniAJQ9/D6Gn9ISL4ttMGeDqqbQs7yhtQLQlndMZK jImA== X-Gm-Message-State: AEkoousBlecpIMkM84hVd+NxdnUOC8UtTlSQ9TVdyRtu7ZASLqz/3b+5JB3gh+5UgYUeAGig X-Received: by 10.194.72.226 with SMTP id g2mr46004501wjv.70.1471445964453; Wed, 17 Aug 2016 07:59:24 -0700 (PDT) Received: from localhost.localdomain (46.red-81-37-107.dynamicip.rima-tde.net. [81.37.107.46]) by smtp.gmail.com with ESMTPSA id q137sm27035691wmd.19.2016.08.17.07.59.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 17 Aug 2016 07:59:23 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org, jbrasen@codeaurora.org, feng.tian@intel.com, star.zeng@intel.com, daniil.egranov@arm.com Cc: Ard Biesheuvel Date: Wed, 17 Aug 2016 16:59:05 +0200 Message-Id: <1471445945-19239-5-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1471445945-19239-1-git-send-email-ard.biesheuvel@linaro.org> References: <1471445945-19239-1-git-send-email-ard.biesheuvel@linaro.org> Subject: [PATCH v3 4/4] MdeModulePkg/EbcDxe AARCH64: simplify interpreter entry point thunks X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Aug 2016 14:59:26 -0000 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 --- 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