From b15aae9f2e33b8a24d2c1abd86422763642bc9c6 Mon Sep 17 00:00:00 2001 From: Samer El-Haj-Mahmoud elhaj Date: Mon, 22 Sep 2014 05:54:41 +0000 Subject: [PATCH] Fix X64 native function call prolog. Prepare space for at least 4 arguments, even if the native function's arguments are less than 4. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit From MSDN x64 Software Conventions, Overview of x64 Calling Conventions: “The caller is responsible for allocating space for parameters to the callee, and must always allocate sufficient space for the 4 register parameters, even if the callee doesn’t have that many parameters. This aids in the simplicity of supporting C unprototyped functions, and vararg C/C++ functions.” Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Samer El-Haj-Mahmoud elhaj@hp.com Reviewed by: Jiewen Yao Reviewed by: Feng Tian git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16152 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/EbcDxe/X64/EbcLowLevel.S | 29 ++++++++++++++++++- .../Universal/EbcDxe/X64/EbcLowLevel.asm | 28 ++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.S b/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.S index 859cbce24c..b01486a871 100644 --- a/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.S +++ b/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.S @@ -3,7 +3,7 @@ # This code provides low level routines that support the Virtual Machine # for option ROMs. # -# Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -46,7 +46,34 @@ ASM_PFX(EbcLLCALLEXNative): # Set stack pointer to new value sub %rdx, %r8 + + # + # Fix X64 native function call prolog. Prepare space for at least 4 arguments, + # even if the native function's arguments are less than 4. + # + # From MSDN x64 Software Conventions, Overview of x64 Calling Conventions: + # "The caller is responsible for allocating space for parameters to the + # callee, and must always allocate sufficient space for the 4 register + # parameters, even if the callee doesn't have that many parameters. + # This aids in the simplicity of supporting C unprototyped functions, + # and vararg C/C++ functions." + # + cmp $0x20, %r8 + jae skip_expansion + mov $0x20, %r8 +skip_expansion: + sub %r8, %rsp + + # + # Fix X64 native function call 16-byte alignment. + # + # From MSDN x64 Software Conventions, Stack Usage: + # "The stack will always be maintained 16-byte aligned, except within + # the prolog (for example, after the return address is pushed)." + # + and $0xFFFFFFFFFFFFFFF0, %rsp + mov %rsp, %rcx sub $0x20, %rsp call ASM_PFX(CopyMem) diff --git a/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.asm b/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.asm index a79fdcabff..1fbd165be7 100644 --- a/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.asm +++ b/MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.asm @@ -4,6 +4,7 @@ ; for option ROMs. ; ; Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+; Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at @@ -50,7 +51,34 @@ EbcLLCALLEXNative PROC PUBLIC ; Set stack pointer to new value sub r8, rdx + + ; + ; Fix X64 native function call prolog. Prepare space for at least 4 arguments, + ; even if the native function's arguments are less than 4. + ; + ; From MSDN x64 Software Conventions, Overview of x64 Calling Conventions: + ; "The caller is responsible for allocating space for parameters to the + ; callee, and must always allocate sufficient space for the 4 register + ; parameters, even if the callee doesn't have that many parameters. + ; This aids in the simplicity of supporting C unprototyped functions, + ; and vararg C/C++ functions." + ; + cmp r8, 20h + jae skip_expansion + mov r8, 20h +skip_expansion: + sub rsp, r8 + + ; + ; Fix X64 native function call 16-byte alignment. + ; + ; From MSDN x64 Software Conventions, Stack Usage: + ; "The stack will always be maintained 16-byte aligned, except within + ; the prolog (for example, after the return address is pushed)." + ; + and rsp, NOT 0fh + mov rcx, rsp sub rsp, 20h call CopyMem -- 2.39.2