mirror of https://github.com/acidanthera/audk.git
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:
parent
c609f3d7f9
commit
b15aae9f2e
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue