REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3790 Replace Opcode with the corresponding instructions. The code changes have been verified with CompareBuild.py tool, which can be used to compare the results of two different EDK II builds to determine if they generate the same binaries. (tool link: https://github.com/mdkinney/edk2/tree/sandbox/CompareBuild) Signed-off-by: Jason Lou <yun.lou@intel.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
78 lines
2.2 KiB
NASM
78 lines
2.2 KiB
NASM
;------------------------------------------------------------------------------
|
|
;
|
|
; Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>
|
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;
|
|
; Module Name:
|
|
;
|
|
; LongJump.Asm
|
|
;
|
|
; Abstract:
|
|
;
|
|
; Implementation of _LongJump() on x64.
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
%include "Nasm.inc"
|
|
|
|
DEFAULT REL
|
|
SECTION .text
|
|
|
|
extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; EFIAPI
|
|
; InternalLongJump (
|
|
; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
|
|
; IN UINTN Value
|
|
; );
|
|
;------------------------------------------------------------------------------
|
|
global ASM_PFX(InternalLongJump)
|
|
ASM_PFX(InternalLongJump):
|
|
|
|
mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]
|
|
test eax, eax
|
|
jz CetDone
|
|
mov rax, cr4
|
|
bt eax, 23 ; check if CET is enabled
|
|
jnc CetDone
|
|
|
|
push rdx ; save rdx
|
|
|
|
mov rdx, [rcx + 0xF8] ; rdx = target SSP
|
|
rdsspq rax
|
|
sub rdx, rax ; rdx = delta
|
|
mov rax, rdx ; rax = delta
|
|
|
|
shr rax, 3 ; rax = delta/sizeof(UINT64)
|
|
incsspq rax
|
|
|
|
pop rdx ; restore rdx
|
|
CetDone:
|
|
|
|
mov rbx, [rcx]
|
|
mov rsp, [rcx + 8]
|
|
mov rbp, [rcx + 0x10]
|
|
mov rdi, [rcx + 0x18]
|
|
mov rsi, [rcx + 0x20]
|
|
mov r12, [rcx + 0x28]
|
|
mov r13, [rcx + 0x30]
|
|
mov r14, [rcx + 0x38]
|
|
mov r15, [rcx + 0x40]
|
|
; load non-volatile fp registers
|
|
ldmxcsr [rcx + 0x50]
|
|
movdqu xmm6, [rcx + 0x58]
|
|
movdqu xmm7, [rcx + 0x68]
|
|
movdqu xmm8, [rcx + 0x78]
|
|
movdqu xmm9, [rcx + 0x88]
|
|
movdqu xmm10, [rcx + 0x98]
|
|
movdqu xmm11, [rcx + 0xA8]
|
|
movdqu xmm12, [rcx + 0xB8]
|
|
movdqu xmm13, [rcx + 0xC8]
|
|
movdqu xmm14, [rcx + 0xD8]
|
|
movdqu xmm15, [rcx + 0xE8]
|
|
mov rax, rdx ; set return value
|
|
jmp qword [rcx + 0x48]
|
|
|