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>
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| ;------------------------------------------------------------------------------
 | |
| ;
 | |
| ; Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>
 | |
| ; SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| ;
 | |
| ; Module Name:
 | |
| ;
 | |
| ;   SetJump.Asm
 | |
| ;
 | |
| ; Abstract:
 | |
| ;
 | |
| ;   Implementation of SetJump() on x64.
 | |
| ;
 | |
| ;------------------------------------------------------------------------------
 | |
| 
 | |
| %include "Nasm.inc"
 | |
| 
 | |
|     DEFAULT REL
 | |
|     SECTION .text
 | |
| 
 | |
| extern ASM_PFX(InternalAssertJumpBuffer)
 | |
| extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))
 | |
| 
 | |
| ;------------------------------------------------------------------------------
 | |
| ; UINTN
 | |
| ; EFIAPI
 | |
| ; SetJump (
 | |
| ;   OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
 | |
| ;   );
 | |
| ;------------------------------------------------------------------------------
 | |
| global ASM_PFX(SetJump)
 | |
| ASM_PFX(SetJump):
 | |
|     push    rcx
 | |
|     add     rsp, -0x20
 | |
|     call    ASM_PFX(InternalAssertJumpBuffer)
 | |
|     add     rsp, 0x20
 | |
|     pop     rcx
 | |
|     pop     rdx
 | |
| 
 | |
|     xor     rax, rax
 | |
|     mov     [rcx + 0xF8], rax            ; save 0 to SSP
 | |
| 
 | |
|     mov     eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]
 | |
|     test    eax, eax
 | |
|     jz      CetDone
 | |
|     mov     rax, cr4
 | |
|     bt      eax, 23                      ; check if CET is enabled
 | |
|     jnc     CetDone
 | |
| 
 | |
|     mov     rax, 1
 | |
|     incsspq rax                          ; to read original SSP
 | |
|     rdsspq  rax
 | |
|     mov     [rcx + 0xF8], rax            ; save SSP
 | |
| 
 | |
| CetDone:
 | |
| 
 | |
|     mov     [rcx], rbx
 | |
|     mov     [rcx + 8], rsp
 | |
|     mov     [rcx + 0x10], rbp
 | |
|     mov     [rcx + 0x18], rdi
 | |
|     mov     [rcx + 0x20], rsi
 | |
|     mov     [rcx + 0x28], r12
 | |
|     mov     [rcx + 0x30], r13
 | |
|     mov     [rcx + 0x38], r14
 | |
|     mov     [rcx + 0x40], r15
 | |
|     mov     [rcx + 0x48], rdx
 | |
|     ; save non-volatile fp registers
 | |
|     stmxcsr [rcx + 0x50]
 | |
|     movdqu  [rcx + 0x58], xmm6
 | |
|     movdqu  [rcx + 0x68], xmm7
 | |
|     movdqu  [rcx + 0x78], xmm8
 | |
|     movdqu  [rcx + 0x88], xmm9
 | |
|     movdqu  [rcx + 0x98], xmm10
 | |
|     movdqu  [rcx + 0xA8], xmm11
 | |
|     movdqu  [rcx + 0xB8], xmm12
 | |
|     movdqu  [rcx + 0xC8], xmm13
 | |
|     movdqu  [rcx + 0xD8], xmm14
 | |
|     movdqu  [rcx + 0xE8], xmm15
 | |
|     xor     rax, rax
 | |
|     jmp     rdx
 | |
| 
 |