diff options
author | Samer El-Haj-Mahmoud elhaj <Samer El-Haj-Mahmoud elhaj@hp.com> | 2014-09-22 05:54:41 +0000 |
---|---|---|
committer | jyao1 <jyao1@6f19259b-4bc3-4df7-8a09-765794883524> | 2014-09-22 05:54:41 +0000 |
commit | b15aae9f2e33b8a24d2c1abd86422763642bc9c6 (patch) | |
tree | 3576330d3cc020e62fb0debba93d35a73e977d18 /MdeModulePkg | |
parent | c609f3d7f9eddd9d1bfe0d0e1a41f1deda5593bc (diff) | |
download | edk2-platforms-b15aae9f2e33b8a24d2c1abd86422763642bc9c6.tar.xz |
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.”
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Samer El-Haj-Mahmoud elhaj@hp.com
Reviewed by: Jiewen Yao <Jiewen.Yao@intel.com>
Reviewed by: Feng Tian <Feng.Tian@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16152 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg')
-rw-r--r-- | MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.S | 29 | ||||
-rw-r--r-- | MdeModulePkg/Universal/EbcDxe/X64/EbcLowLevel.asm | 28 |
2 files changed, 56 insertions, 1 deletions
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.<BR>
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
# 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.<BR>
+; Copyright (c) 2014 Hewlett-Packard Development Company, L.P.<BR>
; 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
|