Message ID | 1471445945-19239-5-git-send-email-ard.biesheuvel@linaro.org |
---|---|
State | New |
Headers | show |
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
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 ) { //
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