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>
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| ;------------------------------------------------------------------------------
 | |
| ;
 | |
| ; Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.<BR>
 | |
| ; SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| ;
 | |
| ; Module Name:
 | |
| ;
 | |
| ;   RdRand.nasm
 | |
| ;
 | |
| ; Abstract:
 | |
| ;
 | |
| ;   Generates random number through CPU RdRand instruction under 64-bit platform.
 | |
| ;
 | |
| ; Notes:
 | |
| ;
 | |
| ;------------------------------------------------------------------------------
 | |
| 
 | |
|     DEFAULT REL
 | |
|     SECTION .text
 | |
| 
 | |
| ;------------------------------------------------------------------------------
 | |
| ;  Generates a 16 bit random number through RDRAND instruction.
 | |
| ;  Return TRUE if Rand generated successfully, or FALSE if not.
 | |
| ;
 | |
| ;  BOOLEAN EFIAPI InternalX86RdRand16 (UINT16 *Rand);
 | |
| ;------------------------------------------------------------------------------
 | |
| global ASM_PFX(InternalX86RdRand16)
 | |
| ASM_PFX(InternalX86RdRand16):
 | |
|     rdrand eax                     ; generate a 16 bit RN into eax,
 | |
|                                    ; CF=1 if RN generated ok, otherwise CF=0
 | |
|     jc     rn16_ok                 ; jmp if CF=1
 | |
|     xor    rax, rax                ; reg=0 if CF=0
 | |
|     ret                            ; return with failure status
 | |
| rn16_ok:
 | |
|     mov    [rcx], ax
 | |
|     mov    rax,  1
 | |
|     ret
 | |
| 
 | |
| ;------------------------------------------------------------------------------
 | |
| ;  Generates a 32 bit random number through RDRAND instruction.
 | |
| ;  Return TRUE if Rand generated successfully, or FALSE if not.
 | |
| ;
 | |
| ;  BOOLEAN EFIAPI InternalX86RdRand32 (UINT32 *Rand);
 | |
| ;------------------------------------------------------------------------------
 | |
| global ASM_PFX(InternalX86RdRand32)
 | |
| ASM_PFX(InternalX86RdRand32):
 | |
|     rdrand eax                     ; generate a 32 bit RN into eax,
 | |
|                                    ; CF=1 if RN generated ok, otherwise CF=0
 | |
|     jc     rn32_ok                 ; jmp if CF=1
 | |
|     xor    rax, rax                ; reg=0 if CF=0
 | |
|     ret                            ; return with failure status
 | |
| rn32_ok:
 | |
|     mov    [rcx], eax
 | |
|     mov    rax,  1
 | |
|     ret
 | |
| 
 | |
| ;------------------------------------------------------------------------------
 | |
| ;  Generates a 64 bit random number through one RDRAND instruction.
 | |
| ;  Return TRUE if Rand generated successfully, or FALSE if not.
 | |
| ;
 | |
| ;  BOOLEAN EFIAPI InternalX86RdRand64 (UINT64 *Random);
 | |
| ;------------------------------------------------------------------------------
 | |
| global ASM_PFX(InternalX86RdRand64)
 | |
| ASM_PFX(InternalX86RdRand64):
 | |
|     rdrand rax                     ; generate a 64 bit RN into rax,
 | |
|                                    ; CF=1 if RN generated ok, otherwise CF=0
 | |
|     jc     rn64_ok                 ; jmp if CF=1
 | |
|     xor    rax, rax                ; reg=0 if CF=0
 | |
|     ret                            ; return with failure status
 | |
| rn64_ok:
 | |
|     mov    [rcx], rax
 | |
|     mov    rax, 1
 | |
|     ret
 | |
| 
 |