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
This commit is contained in:
Samer El-Haj-Mahmoud elhaj 2014-09-22 05:54:41 +00:00 committed by jyao1
parent c609f3d7f9
commit b15aae9f2e
2 changed files with 56 additions and 1 deletions

View File

@ -3,7 +3,7 @@
# This code provides low level routines that support the Virtual Machine # This code provides low level routines that support the Virtual Machine
# for option ROMs. # 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 # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # 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 # Set stack pointer to new value
sub %rdx, %r8 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 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 mov %rsp, %rcx
sub $0x20, %rsp sub $0x20, %rsp
call ASM_PFX(CopyMem) call ASM_PFX(CopyMem)

View File

@ -4,6 +4,7 @@
; for option ROMs. ; for option ROMs.
; ;
; Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR> ; 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 ; This program and the accompanying materials
; are licensed and made available under the terms and conditions of the BSD License ; 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 ; 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 ; Set stack pointer to new value
sub r8, rdx 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 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 mov rcx, rsp
sub rsp, 20h sub rsp, 20h
call CopyMem call CopyMem