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>
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.8 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 IA-32.
 | |
| ;
 | |
| ;------------------------------------------------------------------------------
 | |
| 
 | |
| %include "Nasm.inc"
 | |
| 
 | |
|     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     eax, cr4
 | |
|     bt      eax, 23                ; check if CET is enabled
 | |
|     jnc     CetDone
 | |
| 
 | |
|     mov     edx, [esp + 4]         ; edx = JumpBuffer
 | |
|     mov     edx, [edx + 24]        ; edx = target SSP
 | |
|     rdsspd  eax
 | |
|     sub     edx, eax               ; edx = delta
 | |
|     mov     eax, edx               ; eax = delta
 | |
| 
 | |
|     shr     eax, 2                 ; eax = delta/sizeof(UINT32)
 | |
|     incsspd eax
 | |
| 
 | |
| CetDone:
 | |
| 
 | |
|     pop     eax                         ; skip return address
 | |
|     pop     edx                         ; edx <- JumpBuffer
 | |
|     pop     eax                         ; eax <- Value
 | |
|     mov     ebx, [edx]
 | |
|     mov     esi, [edx + 4]
 | |
|     mov     edi, [edx + 8]
 | |
|     mov     ebp, [edx + 12]
 | |
|     mov     esp, [edx + 16]
 | |
|     jmp     dword [edx + 20]        ; restore "eip"
 | |
| 
 |