From 050a8bf19801409b3da4a9caea51383f289aae6a Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Mon, 30 May 2016 18:52:00 -0700 Subject: [PATCH] MdePkg BaseLib: Convert X64/RdRand.asm to NASM The BaseTools/Scripts/ConvertMasmToNasm.py script was used to convert X64/RdRand.asm to X64/RdRand.nasm Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jordan Justen --- MdePkg/Library/BaseLib/BaseLib.inf | 3 + MdePkg/Library/BaseLib/X64/RdRand.nasm | 83 ++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 MdePkg/Library/BaseLib/X64/RdRand.nasm diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index 51e310303d..26f6b106a4 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -447,6 +447,7 @@ X64/CpuBreakpoint.c | MSFT X64/WriteMsr64.c | MSFT X64/ReadMsr64.c | MSFT + X64/RdRand.nasm| MSFT X64/RdRand.asm | MSFT X64/CpuPause.asm | MSFT X64/EnableDisableInterrupts.asm | MSFT @@ -520,6 +521,7 @@ X64/CpuBreakpoint.asm | INTEL X64/WriteMsr64.asm | INTEL X64/ReadMsr64.asm | INTEL + X64/RdRand.nasm| INTEL X64/RdRand.asm | INTEL X64/CpuPause.asm | INTEL X64/EnableDisableInterrupts.asm | INTEL @@ -626,6 +628,7 @@ X64/EnableCache.S | GCC X64/DisableCache.nasm| GCC X64/DisableCache.S | GCC + X64/RdRand.nasm| GCC X64/RdRand.S | GCC ChkStkGcc.c | GCC diff --git a/MdePkg/Library/BaseLib/X64/RdRand.nasm b/MdePkg/Library/BaseLib/X64/RdRand.nasm new file mode 100644 index 0000000000..f6d83a3a10 --- /dev/null +++ b/MdePkg/Library/BaseLib/X64/RdRand.nasm @@ -0,0 +1,83 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2015, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; 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 +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; 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 AsmRdRand16 (UINT16 *Rand); +;------------------------------------------------------------------------------ +global ASM_PFX(AsmRdRand16) +ASM_PFX(AsmRdRand16): + ; rdrand ax ; generate a 16 bit RN into eax, + ; CF=1 if RN generated ok, otherwise CF=0 + db 0xf, 0xc7, 0xf0 ; rdrand r16: "0f c7 /6 ModRM:r/m(w)" + 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 AsmRdRand32 (UINT32 *Rand); +;------------------------------------------------------------------------------ +global ASM_PFX(AsmRdRand32) +ASM_PFX(AsmRdRand32): + ; rdrand eax ; generate a 32 bit RN into eax, + ; CF=1 if RN generated ok, otherwise CF=0 + db 0xf, 0xc7, 0xf0 ; rdrand r32: "0f c7 /6 ModRM:r/m(w)" + 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 AsmRdRand64 (UINT64 *Random); +;------------------------------------------------------------------------------ +global ASM_PFX(AsmRdRand64) +ASM_PFX(AsmRdRand64): + ; rdrand rax ; generate a 64 bit RN into rax, + ; CF=1 if RN generated ok, otherwise CF=0 + db 0x48, 0xf, 0xc7, 0xf0 ; rdrand r64: "REX.W + 0f c7 /6 ModRM:r/m(w)" + 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 + -- 2.39.2