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
|
# 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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue